Telegram Channel Posts Scraper
Under maintenancePricing
from $1.00 / 1,000 results
Telegram Channel Posts Scraper
Under maintenanceScrape 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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
15 days ago
Last modified
Categories
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.meweb preview; noBOT_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
maxPostscap. - 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,_scrapedAtenvelope 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
- You provide a list of public Telegram channels (e.g.
durov,@telegram, orhttps://t.me/durov). - 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. - 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"]}}
| Field | Type | Description |
|---|---|---|
channels | array | List of public Telegram channels to scrape. Accepts bare usernames (durov), @username, or full https://t.me/<username> URLs. |
maxPosts | integer | Maximum posts per channel. Default 100. Set to 0 for unlimited (capped by what the public preview exposes). |
proxyConfiguration | object | Apify 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"}
| Field | Type | Description |
|---|---|---|
_input | string | The channel value exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the record. S1-html means the post was parsed from the channel's public web preview. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
id | integer | Telegram's per-channel message ID. Stable and monotonic per channel. |
channel | string | Normalized channel username (without @ or URL prefix). |
url | string | Canonical message URL (https://t.me/<channel>/<id>). |
text | string | Message body. May contain newlines and emoji. null for media-only posts with no caption. |
datetime | string | ISO-8601 UTC timestamp the message was posted. |
views | string | View count as shown by Telegram (e.g. "2.89M", "153K", "412"). String because Telegram returns it pre-formatted. |
author | string | Signed author label when the channel signs posts (e.g. "Pavel Durov"). null for unsigned channels. |
forwardedFrom | string | Source channel name if this post is a forward. null for original posts. |
replyTo | object | Reference to the message this post replies to ({ "url": "...", "text": "..." }). null if not a reply. |
photos | array | Direct CDN URLs for photo attachments. URLs are time-bound — mirror them quickly if you need permanence. |
videos | array | Direct CDN URLs for video attachments. Same caveats as photos. |
links | array | External URLs found in the message body. |
reactions | array | List 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
| Platform | Actor | Best for |
|---|---|---|
| Telegram | Telegram Post Detail Scraper | Full single-post detail by URL |
| Bluesky | Bluesky Account Posts Scraper | Recent posts from any Bluesky handle |
| Mastodon | Mastodon Account Scraper | Toots + profile data from any instance |
| Substack | Substack Publication Posts Scraper | Newsletter posts from any publication |
| YouTube | YouTube Channel Scraper | Uploaded videos for a channel |
| Reddit Subreddit Posts Scraper | Latest / top posts from any subreddit | |
| X (Twitter) | X Account Tweets Scraper | Recent 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
_errorenvelope. - 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.