Telegram Channel Scraper: Messages & Views, No Login avatar

Telegram Channel Scraper: Messages & Views, No Login

Pricing

Pay per event

Go to Apify Store
Telegram Channel Scraper: Messages & Views, No Login

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

Changefeeds Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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:

channelmessage_iddateviewsmedia_typetext (start)
durov5522026-10-111,350,000video✨ Designers × AI 🆕 The mockup era is over.
durov5512026-10-101,570,000video💸 If your wallet doesn’t look like this, don’t even bother sending me money for
durov5482026-09-113,610,000🤝 Telegram has become the sponsor of Codeforces
telegram4602026-08-262,040,000For all the info from today's update and a look back at 13 years of Telegram features
telegram4592026-08-261,800,000videoSigned 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

  1. Click Try for free. The input already holds the channels durov and telegram, 20 messages each.
  2. Click Start. Our test run of that input took 9 seconds and cost $0.044 (2 channels, 40 messages).
  3. 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_found vs private_or_no_preview is 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_type and, when the page's HTML exposes one (a thumbnail URL, a document link), media_urls. No files are fetched.
  • forwarded_from, reply_to_id and author are best effort. They come from what the preview shows; the preview sometimes leaves a forwarded message's source name blank, and then forwarded_from is null.
  • 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

FieldDefaultNotes
channelsrequiredChannel 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.
maxMessagesPerChannel2001 to 10,000. Pages backwards through the preview using its ?before=<id> cursor.
sincenoneISO date/time. Only messages on or after it are exported; paging stops once it reaches older ones.
untilnoneISO date/time. Only messages on or before it are exported.
keywordsnoneKeep only messages whose text contains at least one keyword (case-insensitive). Leave empty to keep everything.
includeChannelInfotrueAlso 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.