Telegram Channel Scraper: Messages & Views, No Login
Pricing
Pay per event
Telegram Channel Scraper: Messages & Views, No Login
Export messages from public Telegram channels with text, views, date, links, hashtags and media type, plus each channel's title and subscriber count. No login, phone number or API ID; $1 per 1,000 messages plus $0.002 per channel.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Changefeeds Tools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
- What you get: the messages of public Telegram channels (text, views, date, links, hashtags, media type, reply and edit info) plus one row per channel with title, description, subscriber count and photo.
- No Telegram account: no login, no API ID, no phone number. It reads the public
t.me/s/<channel>preview a logged-out browser sees. - Price: $1 per 1,000 messages, plus $0.002 per channel. Channels that fail to load are free.
Sample output
The prefilled input (durov and telegram, 20 messages each), run on
2026-10-23, returned 40 messages and 2 channel rows. A few of them:
| channel | message_id | date | views | media_type | text (start) |
|---|---|---|---|---|---|
| durov | 552 | 2026-10-11 | 1,350,000 | video | ✨ Designers × AI 🆕 The mockup era is over. |
| durov | 551 | 2026-10-10 | 1,570,000 | video | 💸 If your wallet doesn’t look like this, don’t even bother sending me money for |
| durov | 548 | 2026-09-11 | 3,610,000 | 🤝 Telegram has become the sponsor of Codeforces | |
| telegram | 460 | 2026-08-26 | 2,040,000 | For all the info from today's update and a look back at 13 years of Telegram features | |
| telegram | 459 | 2026-08-26 | 1,800,000 | video | Signed Gifts. You can now add your signature and a comment to gifts |
One message row in full:
{"type": "message","channel": "durov","message_id": 548,"url": "https://t.me/durov/548","date": "2026-09-11T16:04:02+00:00","text": "🤝 Telegram has become the sponsor of Codeforces — the largest competitive programming platform in the world. \n\n ⚡CodeForces organizes over 100 coding contests every year and has 4 million contestants signed up.\n\n🌱 Since 2010, I've supported Codeforces through the companies I started.\n\n🆙 But this year will be special. Its founder Mike wants to bring Codeforces to the next level — and we'll be happy to help him do that 🤝","views": 3610000,"forwarded_from": null,"reply_to_id": null,"has_media": false,"media_type": null,"media_urls": [],"links": ["https://codeforces.com/blog/entry/156620"],"hashtags": [],"edited": false,"author": "Pavel Durov"}
And a channel row (photo shortened):
{"type": "channel","channel": "durov","title": "Pavel Durov","username": "durov","description": "Founder of Telegram.","subscribers": 10300000,"verified": true,"photo": "https://cdn4.telesco.pe/file/TUoXCel1JUtqkYhxGtnSLrnpExFFvX9VIglnKkA-….jpg","messages_returned": 20,"checked_at": "2026-10-23T03:49:41.298Z"}
How to run in 30 seconds
- Click Try for free. The input already holds the channels
durovandtelegram, 20 messages each. - Click Start. Our test run of that input took 9 seconds and cost $0.044 (2 channels, 40 messages).
- Open the Output tab, or export the dataset as CSV, JSON or Excel.
For your own channels, replace the names: durov, @durov, t.me/durov and
https://t.me/s/durov all work. Raise Max messages per channel for more
history, or set Since to get only recent messages.
Pricing
- $0.001 per message returned ($1 per 1,000 messages).
- $0.002 per channel checked, charged only when channel info is on and the channel loaded.
- Free: channels that are not found, private or fail to load.
- Example: 3 channels × 200 messages with channel info = 3 × $0.002 + 600 × $0.001 = $0.61.
- If you set a maximum total charge, the run stops cleanly once it is reached,
delivering only what it already charged for, and says so in
OUTPUT.stopped_reason("max_total_charge_reached").
FAQ
Can this scrape private channels or groups? No. Only channels with a public username and a public web preview.
Does it get member lists or phone numbers? No, never. The public preview does not expose them.
Can I get only messages from the last week? Yes: set Since to an ISO date. Paging stops once it reaches older messages, so this is also cheaper than exporting everything and filtering afterwards.
Can I filter by topic? Yes: Keywords keeps only messages whose text contains at least one of them (case-insensitive).
I want a daily digest of only what changed. Use our companion actor, Telegram Channel Monitor: New, Edited & Deleted Posts, which reports only new, edited and deleted messages since the last run (view changes are an option, off by default).
Limits
- Public channels only. Private groups, member lists and phone numbers are never available this way.
not_foundvsprivate_or_no_previewis a best-effort guess. Telegram's logged-out contact card looks nearly identical for an unregistered username and for a channel whose preview is not public; the actor infers which from whether the page carries any channel content.- No media download. Photos, videos and documents set
media_typeand, when the page's HTML exposes one (a thumbnail URL, a document link),media_urls. No files are fetched. forwarded_from,reply_to_idandauthorare best effort. They come from what the preview shows; the preview sometimes leaves a forwarded message's source name blank, and thenforwarded_fromisnull.- View counts are rounded by Telegram (
2.67M,1.2K); a re-run may show a slightly different number. - It stays polite: at most 2 channels at a time, at least 1.5 s between page requests of one channel, HTTP 429 honoured (Retry-After capped at 60 s, at most 3 retries), 20 s timeouts. A channel needs about 1 page per 20 messages, so 10 channels × 200 messages take a couple of minutes.
Input reference
| Field | Default | Notes |
|---|---|---|
channels | required | Channel usernames: durov, @durov, t.me/durov, https://t.me/s/durov all work. Up to 1,000 per run. Invalid entries become a free status row; the run continues. |
maxMessagesPerChannel | 200 | 1 to 10,000. Pages backwards through the preview using its ?before=<id> cursor. |
since | none | ISO date/time. Only messages on or after it are exported; paging stops once it reaches older ones. |
until | none | ISO date/time. Only messages on or before it are exported. |
keywords | none | Keep only messages whose text contains at least one keyword (case-insensitive). Leave empty to keep everything. |
includeChannelInfo | true | Also emit one row per channel with title, description, subscribers, photo, verified badge. |
Output reference
Channels that fail get a free channel status row instead of message rows:
{"type": "channel","input": "thischanneldoesnotexist9x7q","channel": "thischanneldoesnotexist9x7q","status": "not_found","error": null,"checked_at": "2026-09-29T12:00:00.000Z"}
not_found: the username does not resolve to a channel.private_or_no_preview: the page shows Telegram's contact card with channel content on it, likely a channel whose message preview is not public.error: the page failed to load after retries.invalid: the input entry is not a valid channel username.
The key-value store record OUTPUT holds a per-channel and per-run summary
(counts, HTTP stats, stopped_reason, charged_events). Every run leaves at
least one dataset row, even a run that matches nothing, so a quiet run is never
mistaken for a broken one.