Telegram Channel Scraper - Public Posts, Views & Reactions avatar

Telegram Channel Scraper - Public Posts, Views & Reactions

Pricing

Pay per event

Go to Apify Store
Telegram Channel Scraper - Public Posts, Views & Reactions

Telegram Channel Scraper - Public Posts, Views & Reactions

Scrape public Telegram channels without login or API keys: post text, date, views, reactions, photos and videos, links, hashtags, forwards and replies, plus channel subscribers. Date and keyword filters, new-post monitoring. $1 per 1,000 posts; failed channels are free.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Yukai Lin

Yukai Lin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

What does Telegram Channel Scraper do?

Paste public Telegram channels (t.me/name or @name), get one row per post (text, date, views, reactions, media links, forwards, polls) and one profile row per channel, at $1 per 1,000 posts and $1 per 1,000 channels, with no start fee. Missing channels, filtered posts and duplicates are free.

It reads public Telegram channels without login, phone number or API keys and returns one clean row per post, plus the channel's profile.

  • 📰 Posts: text, date, views, reactions (with counts per emoji and paid stars), photos and video links, link previews, polls, documents, links, hashtags, mentions, forwards, replies, author signature and edited flag.
  • 📊 Channel profile: title, description and its links, subscribers, photo, video, file and link counts, verified badge and the latest post.
  • ⏪ Back to the first post: older posts are read page by page (about 20 per page), as far back as you want.
  • 🗓️ Filters and monitoring: only posts after a date, only posts with your keywords, or only posts newer than your last scheduled run.
  • 💸 $1 per 1,000 posts, no start fee. Missing channels, filtered posts and duplicates are free.
  • 🤝 Honest by design: the same public web preview any browser sees at t.me/s/<channel>; our own user agent, robots.txt followed, no Telegram account, no member lists.

Real results (3 October 2026)

10 inputs (6 channels, a post link, a bot, an invite link and a misspelled channel), newest 50 posts from the last 30 days: 115 rows (112 charged: 6 channels, 106 posts) in 5 seconds, $0.059. The bot, the invite link and the missing channel were free rows (no_preview, invalid_input, not_found).

ChannelSubscribersPhotosVideosLinksVerifiedLatest post
Pavel Durov (@durov)10,500,00010246200yes2026-09-11
Telegram News (@telegram)9,410,00016228378yes2026-08-26
BBC News, Russian (@bbcrussian)388,00021,4004,20061,700yes2026-10-03
Whale Alert (@whale_alert_io)299,0005-103,000no2026-10-03
Telegram Info (@tginfo)83,0001,380902,950no2026-09-29

Other runs the same day: 200 posts of @bbcrussian since 20 September through our servers only (11 pages, 15 seconds, $0.10); monitoring mode run twice in a row: 10 posts the first time, 0 new (and $0) the second.

Use cases

  • Brand, crypto and news monitoring: schedule a run with monitoring on and get every new post of the channels you follow, with views and reactions.
  • Channel research and influencer vetting: subscribers, posting frequency, views per post and engagement before buying an ad.
  • Market and sentiment data: crypto signals, product announcements and news flows as structured rows for dashboards or an LLM.
  • Archiving and analysis: a channel's full public history with dates, links and media links.

How much does it cost?

EventPriceWhen
Post$1.00 / 1,000 posts ($0.001 each)one post returned
Channel info$1.00 / 1,000 channels ($0.001 each)one channel profile row

Free: channels that do not exist or have no public preview (private channels, groups, bots, user accounts), posts older than your date filter, posts without your keywords, posts already returned in monitoring mode, service messages, duplicates and invalid inputs. No start fee. Larger Apify plans get the usual volume discount (Silver 10%, Gold and above 20%).

Example: 20 channels, newest 500 posts each: 20 x $0.001 + 10,000 x $0.001 = $10.02.

For comparison (Apify Store, checked 3 October 2026, users in the last 30 days): tri_angle/telegram-scraper (150 users) $0.005 per result; truefetch/telegram-channel-message (115 users) $0.00035 per post + $0.0008 per media + $0.01 per start; webfinity/telegram-channel-content-media-scraper-v2 (74 users) $0.01 per item; agentx/telegram-chat-scraper (25 users) $0.00054 per item + $0.01 per start; for channel profiles truefetch/telegram-profile (68 users) $0.003 and agentx/telegram-info-scraper (51 users) $0.0052. Some of them also download media files or read groups; this Actor returns media links, not files, and reads public channels only.

Control your cost

  • maxPostsPerChannel and maxResults (per run) cap the number of posts.
  • Before reading, the run logs its plan (worst case) and compares it with your maximum charge per run. When the next post could pass it, the run stops: SUMMARY.status is LIMIT_REACHED and SUMMARY.notProcessed lists the channels not read.
  • Every row has charged: true or false. If Apify restarts the run, posts already delivered are skipped and not charged again.

How to use it

  1. Channels or post links: one per line, e.g. https://t.me/durov, t.me/s/durov, @durov, durov, or a post https://t.me/durov/300. Line breaks, spaces, commas and semicolons all separate inputs, and pasted quotes or brackets are ignored. The same channel written in different ways (@durov, t.me/s/durov) is read and charged once.
  2. Posts per channel: the newest N (0 = channel profile only).
  3. Optional: Only posts published after (2026-09-01, 7 days, 12 hours), Only posts containing (keywords), monitoring for scheduled runs.
  4. Click Start. The Posts view shows the key columns, Channels the profiles, All fields everything (CSV, Excel, JSON).

Input example

{
"channels": ["https://t.me/whale_alert_io", "@durov", "bbcrussian"],
"maxPostsPerChannel": 200,
"postedAfter": "7 days",
"keywords": ["ETH", "USDT"]
}

Output example

A real post (3 October 2026), shortened:

{
"type": "post",
"channel": "whale_alert_io",
"channelTitle": "Whale Alert",
"postId": 103692,
"url": "https://t.me/whale_alert_io/103692",
"date": "2026-10-03T14:07:56+00:00",
"text": "🚨 🚨 🚨 20,000 $ETH (53,573,068 USD) transferred from #Bitfinex to #Aave\nDetails",
"views": 1120,
"viewsText": "1.12K",
"reactionCount": null,
"mediaTypes": [],
"links": ["https://whale-alert.io/transaction/ethereum/0x6193864a7b6eb0070fb3929666545feb1b842049d10ff6b6668a1566c36e27fb"],
"hashtags": ["#Bitfinex", "#Aave"],
"forwardedFrom": null,
"replyTo": null,
"isEdited": false,
"charged": true
}

What the fields mean

  • views / viewsText: Telegram shows rounded numbers above 1,000 (1.95M), so views is approximate for big posts.
  • reactions: emoji is the emoji itself, custom:<id> for a custom emoji or paid_star for paid Telegram Stars reactions; reactionCount is their sum.
  • media: photo (image URL), video / round_video (video URL when Telegram shows it, thumbnail, duration; onlyInApp: true when Telegram plays it only in its apps), document (title), voice, sticker, location. Media URLs are Telegram's CDN links and expire after a while: download what you need soon.
  • forwardedFrom / replyTo: the original channel and post of a forward; the post a reply answers.
  • SUMMARY (key-value store): counts, perChannel (posts, pages, why it stopped), skipped counts per filter and the cost plan.

Use it from code

curl -X POST "https://api.apify.com/v2/acts/tidytools~telegram-channel-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channels":["@durov","https://t.me/telegram"],"maxPostsPerChannel":50}'

With AI agents (MCP): connect Apify's MCP server (https://mcp.apify.com?tools=tidytools/telegram-channel-scraper) to Claude, Cursor or any MCP client and ask, for example, "Summarize the last 7 days of posts on t.me/whale_alert_io". Minimal input: {"channels": ["@durov"]}. Failed items are not charged and carry an errorType.

Limitations

  • Public channels only. Private channels, invite links, groups, bots and user accounts have no public web preview (no_preview, free). No group members, no phone numbers, no message search across Telegram.
  • What the web preview shows: polls, some videos ("Media is too big") and some media types are only playable in Telegram's apps; the row then has the post with onlyInApp media. Comments under posts are not read.
  • Rounded numbers: views and reaction counts above 1,000 are rounded by Telegram (1.95M).
  • Telegram slows down bursts of requests (HTTP 429): the Actor waits and retries, then reads the page from our servers. Very large channels take about one second per 20 posts.

Responsible use

The Actor reads only the public web preview that Telegram serves to every browser, with an honest user agent (TidyToolsTelegram) and robots.txt followed. It does not log in, use a Telegram account, solve CAPTCHAs or collect member lists or phone numbers. Posts belong to their authors: use the data for analysis and monitoring, credit the source when you quote, and follow Telegram's Terms of Service and the laws that apply to you (for example the GDPR when posts name private persons).

FAQ

Does the Actor collect usage data? The Actor sends one anonymous usage counter per run (input type, item count range, outcome) to improve the tool; no URLs, content or account data.

Why does a channel return no_preview? It is private, a group, a bot or a user account, or the owner turned the preview off. Only public channels can be read without logging in.

Can I get only new posts every hour? Yes: turn on Only posts newer than the last run, give the monitor a name and schedule the Actor. The first run returns the newest posts and saves a baseline.

How far back can it go? To the channel's first post. Use maxPostsPerChannel or postedAfter to limit it. With a keyword filter the Actor looks at no more than the newest 10,000 posts of a channel, even if fewer than maxPostsPerChannel posts matched (SUMMARY.perChannel says so).

What happens with a mistake in the input? A line that is not a public Telegram channel or post link (an invite link, t.me/c/..., a username that is too short or too long), an unknown channel, or a date filter such as "someday" or 7 (write 7 days) gives a free row with an errorType (invalid_input, not_found or no_preview) and the run ends normally, never as a failed run. List items that are not text (a number, an object without url) are free invalid_input rows too. Also fine: several inputs in one line (separated by spaces, commas, semicolons or tabs), quotes or brackets around an input, and the same channel written twice (read once). Text such as "false" for a yes/no option and numbers written as text ("50") are understood; a value that is not a number falls back to the default and is listed in SUMMARY.inputNotes. Posts per channel 0 together with the channel info row off returns one free invalid_input row, because there would be nothing to return.

What if I give both a channel and one of its posts? The post is returned and charged once, whichever way it was requested. An explicitly requested post link is returned even if it is older than your date filter or does not contain your keywords; the filters apply to the posts read from channels.

Are media files downloaded? No: rows contain the photo and video URLs Telegram serves, which expire after a while.

Support

Open an issue in the Issues tab with your input and the run link. Issues are checked regularly.