Telegram Channel Scraper - Messages, Views, Reactions, Media avatar

Telegram Channel Scraper - Messages, Views, Reactions, Media

Pricing

from $1.50 / 1,000 message scrapeds

Go to Apify Store
Telegram Channel Scraper - Messages, Views, Reactions, Media

Telegram Channel Scraper - Messages, Views, Reactions, Media

Export public Telegram channel posts: text, date, views, reactions, photos, videos, links and polls. Many channels per run, date ranges, keyword search across the channel history. No API key, no login, no phone number.

Pricing

from $1.50 / 1,000 message scrapeds

Rating

0.0

(0)

Developer

Renzo Madueno

Renzo Madueno

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

2

Monthly active users

2 days ago

Last modified

Features

Limited permissions

Share

Export the posts of any public Telegram channel: text, date, views, reactions, photos and videos, links, hashtags, polls, forwards and replies, plus the channel's own profile (title, description, subscribers).

It reads the web preview that Telegram itself publishes for public channels (t.me/s/<channel>). No API key, no login, no phone number. No account is used.

What you can do with it

  • Many channels in one run. Paste usernames, @handles or t.me links, in any mix.
  • Go back through the history. Newest first, about 20 messages per request, at a measured pace of roughly 14 messages per second per channel. The limit per channel can be set as high as 100,000, but how far a run really gets depends on its timeout (see "Measured performance").
  • Date ranges. A start date, an end date, or simply "the last 7 days". For a range far in the past the scraper jumps to it directly instead of walking down from today.
  • Search inside a channel. Uses Telegram's own in-channel search, so a keyword is found across the full history in a few requests.
  • Filters. Only posts with photos, videos, audio or files; only posts above a number of views.
  • Monitoring. Give the last message ID you already have and get only what is newer.
  • Engagement numbers. Views and every reaction with its count.
  • Media URLs. Direct links to photos, video files and video thumbnails, link-preview cards and stickers.

Input

{
"channels": ["durov", "@telegram", "https://t.me/bloomberg"],
"maxMessages": 500,
"dateFrom": "2026-01-01",
"dateTo": "2026-06-30",
"searchKeywords": [],
"mediaFilter": "all",
"includeChannelMetadata": true
}
FieldTypeWhat it does
channelsarrayPublic channels: durov, @durov or https://t.me/durov.
maxMessagesintegerMaximum messages per channel. Default 100, up to 100,000.
dateFromstringKeep messages from this moment on. 2026-01-31, a full ISO timestamp, or a look-back like 7 days, 2 weeks, 3 months.
dateTostringKeep messages up to this date. A plain date includes that whole day (UTC): 2026-06-30 keeps everything posted until 23:59:59 of 30 June.
lastDaysintegerShortcut: only the last N days.
searchKeywordsarrayWords or phrases searched with Telegram's in-channel search. Each message row says which search matched it. With several keywords, maxMessages is shared out evenly between them, and a message that matches two keywords is returned once, under the first one.
mediaFilterstringall, any (has any media), photo, video, audio, document.
minViewsintegerKeep only messages with at least this many views.
afterMessageIdintegerKeep only messages with a higher ID (for scheduled monitoring of one channel).
includeChannelMetadatabooleanAdds one channel info row per channel. Default true.

A date that cannot be understood is reported in the log and that filter is skipped; the run goes on.

Fields of the previous version, still accepted:

FieldTypeWhat it does
searchKeywordstringSame behaviour as before: keeps only messages whose text or hashtags contain this piece of text, ignoring case (cry matches "crypto"). It filters while paging and does not use Telegram's search, so a rare word in a big channel means many requests.
startUrlsarrayChannel links, merged with channels.
proxyConfigurationobjectAccepted so that saved inputs stay valid, and ignored. No proxy is used.

Output

One row per message:

{
"_type": "message",
"channel": "durov",
"messageId": 555,
"url": "https://t.me/durov/555",
"text": "Crypto's a sea of red. ...",
"date": "2026-11-10T20:43:28+00:00",
"viewCount": 548000,
"viewsLabel": "548K",
"reactionCount": 36410,
"reactions": [
{ "type": "paid", "emoji": null, "customEmojiId": null, "count": 11500 },
{ "type": "custom", "emoji": null, "customEmojiId": "5399847211989246390", "count": 15200 }
],
"author": "Pavel Durov",
"hasMedia": true,
"mediaTypes": ["photo"],
"media": [{ "type": "photo", "url": "https://cdn4.telesco.pe/file/....jpg", "link": "https://t.me/durov/555" }],
"imageUrls": ["https://cdn4.telesco.pe/file/....jpg"],
"videoUrls": null,
"links": null,
"hashtags": null,
"mentions": null,
"linkPreview": null,
"poll": null,
"forwardedFrom": null,
"replyTo": null,
"isEdited": true,
"isService": false,
"partialInPreview": false,
"channelTitle": "Pavel Durov",
"channelSubscriberCount": 10000000,
"searchQuery": null
}

And, when includeChannelMetadata is on, one row per channel:

{
"_type": "channel",
"channel": "durov",
"title": "Pavel Durov",
"username": "durov",
"description": "Founder of Telegram.",
"photo": "https://cdn4.telesco.pe/file/....jpg",
"isVerified": true,
"subscribersLabel": "10M",
"subscriberCount": 10000000,
"photoCount": 104,
"videoCount": 47,
"fileCount": null,
"linkCount": 202,
"counters": { "subscribers": "10M", "photos": "104", "videos": "47", "links": "202" }
}

Field notes:

  • reactions: standard emoji come as the emoji character; custom (premium) emoji come as customEmojiId; paid is the Telegram Stars reaction.
  • media[].type is one of photo, video, voice, document, sticker, location. A round video message is a video with "subtype": "round"; a music file is a document with "subtype": "audio". Albums come as one message with several media entries. In our test runs only photos, videos and polls appeared; voice messages, documents, stickers and locations are parsed from Telegram's markup but were not seen in a test, so check those fields on your own channels.
  • mediaFilter: video includes round videos, document includes music files, audio keeps voice messages and music files.
  • linkPreview is the card Telegram renders for the first link: url, siteName, title, description, image.
  • poll has the question, the poll type, the options with their percentages and the voters label, exactly as Telegram shows them. Telegram rounds the percentages, and in polls that allow several answers they add up to more than 100.
  • forwardedFrom has the name and link of the original channel; replyTo has the link, author and a text excerpt of the replied post.
  • partialInPreview is true when Telegram marks the post with "Please open Telegram to view this post", meaning part of it (a large file, paid media, some formatting) is not in the web preview.

A SUMMARY record in the run's key-value store lists every channel with its status (ok, partial when it stopped early, not_available when there is no public preview, failed when the first request did not get an answer, skipped when the run stopped before reaching it), the number of messages and the date span covered. Channels with a problem are also listed under FAILURES.

Measured performance

Measured on 11 November 2026 with this version, at 512 MB of memory:

JobMessagesRun time
3 channels, newest 100 messages each3006 s
2 channels, first half of 2023 only (reached by jumping, not by paging down from today)50330 s
1 busy channel, older text filter cry, 40 matches found in 16 pages4012 s
1 existing channel and 1 username that does not exist, 20 messages202 s
2 usernames that do not exist0 (run ended as failed, nothing charged)3 s

Paging one channel ran at roughly 14 to 16 messages per second (about 20 messages per request, around one second per request). Up to three channels are read at the same time. At that pace, ten minutes of run time reach roughly 8,000 messages of one channel; that figure is an estimate from the pace above, not a run we made. For longer exports raise the run timeout or split the job by date range.

Limits you should know

  • Public channels only. Private channels, groups, bots and user profiles have no web preview. Some public channels also have the preview switched off by Telegram (for example restricted content). Those are reported in the log and in SUMMARY, and the other channels are delivered. If none of the channels of a run can be read, the run ends as failed with the reason for each one, and nothing is charged for it.
  • Rounded counters. Telegram shows big numbers rounded (548K, 10M), so viewCount, reaction counts and subscriberCount are as precise as that label.
  • Not in the public preview: the number of forwards (shares), the number of comments and the comments themselves, the list of subscribers, and who reacted. This scraper does not return them.
  • Media files are linked, not downloaded. Photo and video URLs point to Telegram's CDN and expire after some time, so download them soon after the run if you need the files. Large videos and documents often have no direct URL in the preview; the row then carries the post link and a thumbnail.
  • Search is Telegram's search. It matches whole words the way the Telegram app does; it is not a substring or regex match.
  • Dates are UTC.
  • Rate limits. The scraper reads about 20 messages per request at a polite pace. If Telegram answers with a rate-limit or block response, it stops, saves what it has and says so in the log; it does not insist.
  • Very long exports are bounded by the run timeout: shortly before the timeout the scraper stops and saves everything collected, and the log tells you. Raise the timeout or split the job by date range.

Tips

  • To follow a channel daily, schedule a run with lastDays: 1, or store the highest messageId and pass it as afterMessageId.
  • To archive a full channel, set maxMessages high and leave the dates empty.
  • To export one quarter of an old channel, set dateFrom and dateTo; only that slice is read and delivered.

The scraper only reads pages that Telegram serves publicly to any browser without an account. The posts may still contain personal data or copyrighted content: make sure your use complies with the laws that apply to you.

⌂ 换网址