# Telegram Channel Scraper

> Telegram channel scraper: get posts, views, media, links and reactions from public channels. Search inside channels. No login, phone or API keys.

URL: https://cliqtomedia.com/actors/telegram-channel-scraper/

Category: Social media & communities · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/telegram-channel-scraper?fpr=cliqto

Get posts from public Telegram channels as clean rows. You get text, date, views, media and reactions. No phone number or API keys.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `durov` in Channels. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Scrape posts from public Telegram channels with no login, no phone number and no API keys, and get clean JSON rows with text, date, view count as a number, media links, reactions, forwards and channel info with the exact subscriber count.



### Good for

- Follow what a list of public news, crypto or brand channels posted today.
- Build a dataset of posts with text, views, reactions, media and links.
- Find posts about a keyword or #hashtag inside many channels at once.
- Get subscriber counts and descriptions of many channels.
- Send only new posts to a spreadsheet, a chat or an AI agent every hour.

### Not a good fit

- Only public channels that have a web preview. Private channels, invite links (`t.me/+...`), groups, chats, users and bots are not supported.
- No comments, no member or subscriber lists, no DMs, no global Telegram search: only posts of the channels you give.
- Telegram rounds view and reaction counts on the web (for example `830K`). The Actor turns them into numbers (`830000`); it cannot make them more exact than Telegram shows.
- Videos: the web preview usually gives only a preview image, not the video file. Photo links work, but all media links are temporary.
- One run reads about 1,800 posts in full; at about 4.5 minutes it stops and keeps what it has (see Limits).

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.0001 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Post row | $0.002 (from $0.0004 on paid Apify plans) | One public post saved to the dataset with text, date, views, media, reactions and links. |
| Channel checked | $0.002 (from $0.001 on paid Apify plans) | One channel looked up: a channel row with title, description, subscribers and counters, or a not_found row. Channels that fail with an error are free. |

- One result: about $0.0021.
- 1,000 results: about $2.00.
- Every day 100 results, for 30 days: about $6.00 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/telegram-channel-scraper?fpr=cliqto

## Questions

### Do I need a Telegram account or API ID?

No. The tool reads the public web preview that anyone can open.

### Can I scrape private channels or groups?

No. Only public channels with a web preview work.

### Why are view counts rounded?

Telegram shows rounded counts on the web, like 830K. Subscriber counts can be exact.

### How many posts can one run get?

About 1,800 posts per run. Split big lists into several runs.

### Why are views like 830000 and not exact?

Telegram shows rounded counts on the web (`830K`). The Actor gives you the number (`views`) and the original text (`viewsText`). Exact view counts are not public.

### Can I get comments, members or posts from private channels?

No. These are not in the public web preview.

### Are the counts live?

Views, reactions and subscribers are as they were at `fetchedAt`. Run again to refresh them.

### Is scraping Telegram allowed?

The Actor reads only public pages that Telegram shows without login, at a slow rate, and does not bypass any login or CAPTCHA. You are responsible for how you collect, store and reuse the content, including personal data and authors' rights, under Telegram's terms and the laws that apply to you.

## Data fields

- `recordType` (string): Row type: post or channel.
- `status` (string): Channel rows: complete, not_found, error (the source failed) or capped (cut short by the run time or request limit; free). Post rows have no status.
- `statusCode` (string): Channel rows: NOT_FOUND, NO_PUBLIC_PREVIEW, RATE_LIMITED, SOURCE_SCHEMA_CHANGED, ...; null when complete.
- `statusReason` (string): Plain-English reason for not_found and error rows; null when complete.
- `channel` (string): Channel username, e.g. durov.
- `channelTitle` (string): Channel display name (post rows).
- `postId` (integer): Post number inside the channel.
- `url` (string): Link to the post (https://t.me/<channel>/<postId>) or to the channel.
- `date` (string): Publication time, ISO 8601 UTC.
- `edited` (boolean): true if the post was edited.
- `text` (string): Post text with line breaks; empty for media-only posts.
- `author` (string): Author signature, when the channel signs posts.
- `views` (integer): View count; Telegram rounds large numbers (827K becomes 827000).
- `viewsText` (string): View count exactly as Telegram shows it, e.g. 827K.
- `forwardedFrom` (string): Name of the original channel or user for forwarded posts.
- `forwardedFromUrl` (string): Link to the original post or channel for forwarded posts.
- `replyToPostId` (integer): ID of the post this post replies to, inside the same channel.
- `replyToUrl` (string): Link to the replied post.
- `mediaType` (string): photo, video, round_video, album, document, audio, voice, sticker, poll, location, unsupported, or null for text posts.
- `mediaUrl` (string): Preview image of the first media item (temporary Telegram CDN link).
- `media` (array): All media items: type, url (when the preview exposes the file), thumbnailUrl, durationText, title.
- `linkPreview` (object): Link preview card: url, siteName, title, description, imageUrl.
- `poll` (object): Poll: question, type, votersText, options with percent.
- `links` (array): Links in the post text.
- `hashtags` (array): Hashtags in the post text.
- `reactions` (array): Reactions: emoji (or custom:<id>, ⭐ for paid), count, countText.
- `searchQuery` (string): Your searchQuery, when the post came from a channel search.
- `title` (string): Channel title (channel rows).
- `description` (string): Channel description (channel rows).
- `verified` (boolean): Channel has the verified badge.
- `avatarUrl` (string): Channel avatar image (temporary Telegram CDN link).
- `subscribers` (integer): Exact subscriber count from the channel page; null when unavailable.
- `subscribersText` (string): Rounded subscriber count shown on the preview, e.g. 10.4M.
- `photos` (integer): Photos in the channel (rounded by Telegram).
- `videos` (integer): Videos in the channel (rounded by Telegram).
- `files` (integer): Files in the channel (rounded by Telegram).
- `linksShared` (integer): Links shared in the channel (rounded by Telegram).
- `postsReturned` (integer): Error rows: posts saved for this channel before the error.
- `sourceUrl` (string): The t.me page the row was read from.
- `fetchedAt` (string): When the row was scraped, ISO 8601 UTC.

## Input settings

- `channels` (array, required): Up to 100 public Telegram channels: a username (durov), @username, or a link (https://t.me/durov, https://t.me/s/durov). Invite links (t.me/+...) are skipped as invalid; private channels, groups, users and bots are reported as not_found.
- `maxPostsPerChannel` (integer): How many posts to return per channel, newest first (oldest first when onlyNew continues from a previous run). 1–1000. Each post row is charged.
- `since` (string): Skip posts older than this: a date (2026-10-01), an ISO timestamp (2026-10-01T12:00:00Z), or a relative period (24 hours, 7 days, 2 weeks). Older pages are not fetched. Leave empty for no date limit.
- `searchQuery` (string): Optional keyword or #hashtag. Returns only posts that Telegram's own channel search matches, newest first. Leave empty to get all posts.
- `includeChannelInfo` (boolean): Also open the channel page to get the exact subscriber count (one extra request per channel). Without it the channel row still has title, description, verified badge, rounded subscribers and media counters.
- `onlyNew` (boolean): For scheduled monitoring: remember the newest post per channel and on the next run return only posts published after it, oldest first, without gaps. The first run returns the newest posts and sets the starting point. Memory is kept in your account (key-value store telegram-channel-scraper-state).
- `stateKey` (string): Separate memory for different schedules or tasks, e.g. crypto-news. 1–40 letters, digits, - or _. Default: default.

## Step by step on Apify

1. Open the Input tab.
2. Add one or more channels to Channels (`channels`), for example `durov` and `telegram` (this is the prefill).
3. Keep Max posts per channel (`maxPostsPerChannel`) at 20, or set a higher number.
4. Click Start.
5. Open the Output tab: the Posts view shows the post columns (channel, date, text, views, media); the Channels view shows the channel columns (status, title, subscribers). Both views list all rows; the Row type column tells posts and channels apart.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Hourly news or crypto monitoring | `channels` + `onlyNew` | post | `date`, `text`, `url`, `views` | Schedule + webhook, Google Sheets, Slack |
| Post engagement research | `channels` + `maxPostsPerChannel` | post | `views`, `reactions`, `forwardedFrom` | CSV / Excel export |
| Keyword tracking | `channels` + `searchQuery` + `since` | post | `text`, `date`, `searchQuery` | API, spreadsheet |
| Channel directory | `channels` + `includeChannelInfo` | channel | `subscribers`, `title`, `description`, `verified` | API, spreadsheet |
| AI agent context | `channels` (small) | post | `text`, `date`, `url` | MCP |

## Tips

- Turn on only-new for hourly or daily schedules.
- Use search inside channels to find a keyword or hashtag.
- Download media files soon; Telegram media links expire.

## Limits



- Up to 100 channels per run and 1,000 posts per channel. Telegram's web preview gives about 20 posts per page, and the Actor reads about one page per second.
- Each run stops reading Telegram after about 4.5 minutes, whatever the run timeout is. That is enough for about 1,800 posts. If the time runs out, saved rows stay, the run is `CAPPED`, the channel being read is `capped` and the rest are `unprocessed`. Split large lists into several runs.
- If you set a maximum cost per run, the Actor stops before going over it: rows already saved stay, the run is `SUCCEEDED` with `CAPPED` in `RUN_SUMMARY`.
- View, reaction and subscriber texts are rounded by Telegram; only `subscribers` with `includeChannelInfo` is exact.
- Media links (`telesco.pe`) expire after some time. Download the files soon if you need them.

## Sample result

```json
{
  "recordType": "post",
  "channel": "durov",
  "channelTitle": "Pavel Durov",
  "postId": 552,
  "url": "https://t.me/durov/552",
  "date": "2026-10-11T14:52:40+00:00",
  "edited": false,
  "text": "✨ Designers × AI\n\n🆕 The mockup era is over. …",
  "author": "Pavel Durov",
  "views": 830000,
  "viewsText": "830K",
  "forwardedFrom": "Telegram Designers",
  "forwardedFromUrl": "https://t.me/designers/266",
  "replyToPostId": null,
  "replyToUrl": null,
  "mediaType": "video",
  "mediaUrl": "https://cdn4.telesco.pe/file/…",
  "media": [
    {
      "type": "video",
      "url": null,
      "thumbnailUrl": "https://cdn4.telesco.pe/file/…",
      "durationText": "1:15",
      "title": null
    }
  ],
  "linkPreview": null,
  "poll": null,
  "links": ["https://t.me/designers"],
  "hashtags": [],
  "reactions": [
    { "emoji": "⭐", "paid": true, "count": 5280, "countText": "5.28K" },
    { "emoji": "custom:5936157098181135162", "paid": false, "count": 10700, "countText": "10.7K" }
  ],
  "searchQuery": null,
  "sourceUrl": "https://t.me/s/durov",
  "fetchedAt": "2026-10-14T15:01:48.976Z"
}
```

## Use it from code

Actor ID: `cliqtomedia/telegram-channel-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/telegram-channel-scraper").call(run_input={
    "channels": [
        "durov",
        "telegram"
    ],
    "maxPostsPerChannel": 20
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~telegram-channel-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channels": ["durov", "telegram"], "maxPostsPerChannel": 20}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/telegram-channel-scraper")
result = tool.invoke({"run_input": {"channels": ["durov", "telegram"], "maxPostsPerChannel": 20}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Hear what people say about you](https://cliqtomedia.com/actors/use-cases/social-listening/): Find what people say about your brand and your topic on Bluesky, Hacker News, YouTube and more.

## Similar tools

- [Substack Newsletter Scraper](https://cliqtomedia.com/actors/substack-newsletter-scraper/)
- [Hacker News Stories & Comments Scraper](https://cliqtomedia.com/actors/hacker-news-stories-comments-scraper/)
- [Bilibili Scraper: Videos, Comments & Creators, No Login](https://cliqtomedia.com/actors/bilibili-scraper/)
- [Bluesky Scraper — Posts, Profiles, Feeds & Threads, No Login](https://cliqtomedia.com/actors/bluesky-scraper/)
- [Medium Article Scraper: Tags, Authors & Publications](https://cliqtomedia.com/actors/medium-articles-scraper/)
- [Pinterest Search Scraper: Pins & Boards, No Login](https://cliqtomedia.com/actors/pinterest-search-scraper/)
