Telegram Channel Posts Scraper avatar

Telegram Channel Posts Scraper

Under maintenance

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Telegram Channel Posts Scraper

Telegram Channel Posts Scraper

Under maintenance

Scrape latest posts from any public Telegram channel — text, photos, videos, views, reactions, forwards, replies. No login, no API key, no Bot API.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

15 days ago

Last modified

Share

Bulk-extract recent posts from any public Telegram channel — text, media URLs, views, reactions, author, forwarded-from, and reply context — in clean structured JSON. No Bot API token, no login, no phone number.

Why use this actor

  • No Bot API / no login required — works against the public t.me web preview; no BOT_TOKEN, no phone number, no TDLib build to maintain.
  • Rich detail per post — message text, media URLs (photos & videos), view counts, reactions, author label, forwarded-from channel, and reply-to context all in one flat record.
  • Bulk + paginated — pass a list of channels in one run; the actor paginates back through each channel's history up to your maxPosts cap.
  • Per-channel isolation — one bad channel won't fail the run. Missing or restricted channels surface as _error: "not_found" so you can triage failures.
  • Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries _input, _source, _scrapedAt envelope fields so you can join results back to your input list.
  • Captures CDN media URLs — direct links to photos and videos so you can mirror or analyze attachments downstream.

How it works

  1. You provide a list of public Telegram channels (e.g. durov, @telegram, or https://t.me/durov).
  2. The actor opens each channel's public web preview and walks back through the post history, reading the same data the t.me/s/<channel> page shows.
  3. Each post is normalized into a flat JSON record and streamed into your dataset, ready to download as JSON, CSV, or Excel.

You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.

Input

{
"channels": [
"durov",
"telegram"
],
"maxPosts": 100,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["DATACENTER"]
}
}
FieldTypeDescription
channelsarrayList of public Telegram channels to scrape. Accepts bare usernames (durov), @username, or full https://t.me/<username> URLs.
maxPostsintegerMaximum posts per channel. Default 100. Set to 0 for unlimited (capped by what the public preview exposes).
proxyConfigurationobjectApify Proxy settings. Datacenter proxy works for most public channels.

Output

Input: durov, maxPosts: 2

{
"id": 497,
"channel": "durov",
"url": "https://t.me/durov/497",
"text": "France's \"Agency for Secure Documents\" was hacked. Names, addresses, emails, and phone numbers of\n19 million people\n— leaked from a single government database.\nFuture leaks will be even more catastrophic if the French government gets what it wants:\naccess to encrypted chats\nand\nDigital IDs\nof social media users.",
"datetime": "2026-04-20T22:55:10+00:00",
"views": "4.54M",
"author": "Pavel Durov",
"forwardedFrom": null,
"replyTo": null,
"photos": [],
"videos": [],
"links": [],
"reactions": [],
"_input": "durov",
"_source": "S1-html",
"_scrapedAt": "2026-05-18T10:39:43.899042+00:00"
}
{
"id": 498,
"channel": "durov",
"url": "https://t.me/durov/498",
"text": "The apartment in Russia where I lived 20 years ago received a summons for “Suspect P. V. Durov”.\nThey must be suspecting me of defending Articles 29 and 23 of the Russian Constitution — which guarantee freedom of speech and the right to private correspondence.\nProud to be guilty!\n😏",
"datetime": "2026-04-22T17:06:37+00:00",
"views": "5.19M",
"author": "Pavel Durov",
"forwardedFrom": null,
"replyTo": null,
"photos": [
"https://cdn4.telesco.pe/file/CVRdtGiETwFzCQ5efOdFbAKVLiQAxSv8bpnypVOdE6Bn-zenXs0NtKC3UVwF6LMr...jpg"
],
"videos": [],
"links": [],
"reactions": [],
"_input": "durov",
"_source": "S1-html",
"_scrapedAt": "2026-05-18T10:39:43.899042+00:00"
}
FieldTypeDescription
_inputstringThe channel value exactly as you supplied it. Use this to join results back to your input list.
_sourcestringInternal tag for the path used to fetch the record. S1-html means the post was parsed from the channel's public web preview.
_scrapedAtstringISO-8601 UTC timestamp when the record was scraped.
idintegerTelegram's per-channel message ID. Stable and monotonic per channel.
channelstringNormalized channel username (without @ or URL prefix).
urlstringCanonical message URL (https://t.me/<channel>/<id>).
textstringMessage body. May contain newlines and emoji. null for media-only posts with no caption.
datetimestringISO-8601 UTC timestamp the message was posted.
viewsstringView count as shown by Telegram (e.g. "2.89M", "153K", "412"). String because Telegram returns it pre-formatted.
authorstringSigned author label when the channel signs posts (e.g. "Pavel Durov"). null for unsigned channels.
forwardedFromstringSource channel name if this post is a forward. null for original posts.
replyToobjectReference to the message this post replies to ({ "url": "...", "text": "..." }). null if not a reply.
photosarrayDirect CDN URLs for photo attachments. URLs are time-bound — mirror them quickly if you need permanence.
videosarrayDirect CDN URLs for video attachments. Same caveats as photos.
linksarrayExternal URLs found in the message body.
reactionsarrayList of reactions on the post ([{ "emoji": "👍", "count": 123 }, ...]). Empty array if reactions are off or none recorded.

Error envelope

Channels that don't exist, are private, or fail to fetch return a structured error instead of crashing the run:

{
"_input": "this-channel-does-not-exist-xyz",
"_source": "S1-html",
"_scrapedAt": "2026-05-18T10:24:10.012345+00:00",
"_error": "not_found",
"_errorDetail": "channel page returned 404"
}

Filter on _error to triage failed rows.

Pricing

This actor is billed per result: $2.50 per 1,000 results. Each post = 1 result. Errors (not-found, restricted) are not billed.

Other Sosmed Actors

PlatformActorBest for
TelegramTelegram Post Detail ScraperFull single-post detail by URL
BlueskyBluesky Account Posts ScraperRecent posts from any Bluesky handle
MastodonMastodon Account ScraperToots + profile data from any instance
SubstackSubstack Publication Posts ScraperNewsletter posts from any publication
YouTubeYouTube Channel ScraperUploaded videos for a channel
RedditReddit Subreddit Posts ScraperLatest / top posts from any subreddit
X (Twitter)X Account Tweets ScraperRecent tweets from any handle

Browse the full catalog at apify.com/xtracto.

Notes

  • Telegram's public web preview shows only channels marked public. Private (invite-link-only) channels are not accessible via this actor.
  • Some channels restrict the public preview (the page shows "If you have Telegram, you can view this channel") — those return an _error envelope.
  • The web preview caps at roughly the latest ~100 messages per pagination window; very large channels may need scheduled incremental runs to backfill history.
  • View counts are updated lazily; for old messages they reflect the count at the time of scraping, not real-time.
  • Photo and video URLs are CDN-signed and time-bound — mirror them downstream if you need permanence.
  • For large jobs (>20 channels), enable the Apify Proxy to avoid per-IP rate limits.