Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

from $1.50 / 1,000 post returneds

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

Scrape public Telegram channels with no login and no API key, via the t.me/s/ web preview. Get posts with text, date, views, author, media, and source links, plus channel meta (title, subscribers). Paginates back through older posts.

Pricing

from $1.50 / 1,000 post returneds

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

11 hours ago

Last modified

Share

Scrape public Telegram channels with no login and no API key, using Telegram's own server-rendered web preview at https://t.me/s/<channel>. No bot token, no phone number, no MTProto.

What it does

  • Accepts a list of channels in any common form: durov, @durov, or https://t.me/durov.
  • Reads the channel header: title, description, and counters (subscribers, photos, videos, links).
  • Returns one row per post with text (links and hashtags preserved), date, views, author, media info, and any forwarded/source link.
  • Pages back through older posts automatically via ?before=<id> until it hits maxItems or the channel's earliest post.
  • Dedupes posts by message id.

Only works for public channels that expose a web preview. Private channels, groups, and channels with the preview disabled will return a NOT_FOUND diagnostic row.

Input

FieldTypeDefaultDescription
channelsstring[]["telegram","durov"]Channels to scrape (username, @handle, or t.me link).
maxItemsinteger100Max posts per channel.
includeChannelInfoRowbooleantrueEmit one channel summary row before each channel's posts.
proxyConfigurationobjectoffOptional. The t.me/s/ preview is a public, no-auth endpoint with no anti-bot, so a proxy is not required and is off by default. Only enable it (Apify Proxy, datacenter is fine) if you hit IP rate limits on high-volume runs.

Output

One channel-info row per channel (when enabled), then one row 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": "11M"
}

mediaType is one of photo, video, roundvideo, voice, sticker, document, or null.

Nullable fields: the preview only exposes what Telegram renders, so several fields are commonly null: text (media-only posts), views (small/old channels), author (most channels don't sign posts), mediaType / mediaUrl (text-only posts), and link (posts that aren't forwards and have no link preview). On the channel-info row, subscribers, photosCount, videosCount, and linksCount can be null when the header doesn't show that counter.

Billing

Charged per post row (post event). Channel-info rows and diagnostic rows (BAD_INPUT, NOT_FOUND, NO_RESULTS, network errors) are not charged.

Troubleshooting

  • NOT_FOUND / NO_RESULTS — the channel is private, deleted, a group, or has its web preview disabled. Only public channels with a working t.me/s/<name> page can be scraped.
  • BAD_INPUT — no usable channel was provided. Pass a username, @handle, or t.me link.
  • RATE_LIMITED on large runs — lower maxItems or enable the optional proxy to spread requests across IPs.