Telegram Channel Scraper - Public Posts, No Login
Pricing
$1.50 / 1,000 post returneds
Telegram Channel Scraper - Public Posts, No Login
Reading a Telegram channel from code normally costs you a bot token or a phone number. Neither is used here. Telegram mirrors every public channel as a plain web page, and this reads it for post text, date, views, author, media, links and subscriber count. $1.50 per 1,000 posts.
Pricing
$1.50 / 1,000 post returneds
Rating
5.0
(2)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Telegram Channel Scraper
Reading a Telegram channel from code normally costs you a bot token, or a phone number wired into an MTProto client. Neither appears anywhere in this actor.
Telegram publishes a plain web version of every public channel at t.me/s/<name>. This reads that page and works backwards through the history, newest post first, until it hits your maxItems or reaches the channel's very first message.
Input
{"channels": ["durov", "@telegram", "https://t.me/tginfo"],"maxItems": 500,"includeChannelInfoRow": true}
| Field | Default | Notes |
|---|---|---|
channels | — | Username, @handle or t.me link. All three forms work. |
maxItems | 100 | Posts per channel, up to 10,000. |
includeChannelInfoRow | true | Emits one summary row per channel before its posts. |
proxyConfiguration | off | Optional. The preview is a public endpoint with no anti-bot, so leave it off unless a high-volume run hits IP rate limits. |
notionConnector / notionParentId | — | Optional delivery into Notion via an Apify MCP connector. |
What you get per post
{"ok": true,"rowType": "post","channel": "durov","messageId": 505,"postUrl": "https://t.me/durov/505","text": "TON is #1 in annual staking rewards…","date": "2026-05-08T17:41:53.000Z","views": "3.76M","author": "Pavel Durov","hasMedia": true,"mediaType": "photo","mediaUrl": "https://cdn4.telesco.pe/file/…","link": null,"channelTitle": "Pavel Durov","subscribers": "11.1M"}
mediaType is one of photo, video, roundvideo, voice, sticker, document, or null. link is the forwarded-from link or the link-preview target, when the post has one.
The channel info row, when enabled, carries channelTitle, channelUsername, channelDescription, subscribers, photosCount, videosCount, linksCount and postsReturned. The channel title and subscriber count are stapled onto every post row as well, so you can skip the info row and still have them.
Limits worth knowing
- Public channels only. Private channels, groups, and channels with the web preview switched off return a
NOT_FOUNDrow. There's no way around that without an account, and this actor doesn't use one. viewsis a display string, not a number. Telegram renders3.76M, so that's what you get. Parse it yourself if you need arithmetic.- The preview shows what it shows.
textis null on media-only posts,viewsis null on small or old channels,authoris null on the many channels that don't sign posts, andlinkis null unless the post is a forward or has a link preview. mediaUrlis a thumbnail, not the original file. For photos and video covers it's the preview image Telegram serves; voice and document posts have no URL at all.- Paging goes backwards through roughly 16 to 20 posts per request until it reaches
maxItemsor the channel's first message. A big channel atmaxItems: 10000is a long run. - Posts are deduplicated by message id, so you're never billed twice for one message.
Billing
$1.50 per 1,000 posts ($0.0015 each), with no run-start fee. Flat on every plan.
Only post rows are charged. The channel info row is free, so the title, description and subscriber count cost you nothing. Diagnostic rows — BAD_INPUT, NOT_FOUND, NO_RESULTS, network errors — are free too, which means pointing it at a private channel or a dead handle costs nothing at all.
When something comes back empty
NOT_FOUNDorNO_RESULTS— the channel is private, deleted, a group, or has its web preview disabled. Check thatt.me/s/<name>opens in a browser.BAD_INPUT— no usable channel in the list.RATE_LIMITEDon a big run — lowermaxItemsor turn the proxy on to spread requests across addresses.