Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

from $0.48 / 1,000 messages

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

Scrape posts and channel profiles from public Telegram channels: text, date, views, reactions, media and links, with date filters. No login or Telegram account needed.

Pricing

from $0.48 / 1,000 messages

Rating

0.0

(0)

Developer

ThisIsB3

ThisIsB3

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Share

Extract posts and channel profiles from public Telegram channels: text, date, views, reactions, photos, videos, links, edits and forwards. Scrape many channels in one run, filter by date, and export to JSON, CSV or Excel, or pull the data through the Apify API. No Telegram account, no login, no phone number.

What does Telegram Channel Scraper do?

Give it a list of public channels (durov, @durov, t.me/durov or https://t.me/s/durov). It reads each channel's public web preview, the same page anyone sees at t.me/s/<channel> without logging in. It goes back in time page by page until it reaches your post limit or date filter. You get one row per post and, if you turn it on, one profile row per channel with its subscriber count.

Why use it?

  • Channel monitoring. Track what news, government, company or community channels publish, and schedule daily runs with "Only posts newer than: 1 day".
  • Threat research and OSINT. Archive public channel posts with exact timestamps, edit flags, forward sources and outbound links for investigations.
  • Brand monitoring. Watch channels that talk about your brand, product or industry, and follow views and reactions over time.
  • Crypto and market analysis. Collect posts from crypto, trading and finance channels with views and reactions for sentiment and event tracking.

What sets it apart:

  • Many channels per run, processed in parallel.
  • Date filters that jump straight to the period you want instead of reading every newer page.
  • Clean, typed output: numbers are numbers (18.9M views becomes 18900000), dates are ISO 8601 (UTC), reactions are structured, and media and links are arrays.
  • No charge for channels it can't read. Private channels, groups, bots and wrong usernames are skipped with a clear message.

How to use it

  1. Click Try for free.
  2. Add channel usernames or links to Channels.
  3. Optionally set Maximum posts per channel, a date filter, and Include channel profiles.
  4. Click Start, then download your data from the Output tab when the run finishes.

How much does it cost?

You pay only for results you receive (pay per event):

ResultPrice
Post (type: "message")$0.60 per 1,000 posts ($0.0006 each)
Channel profile (type: "channel")$2.00 per 1,000 profiles ($0.002 each)

Skipped channels (no public preview) are free. Apify's free plan includes monthly credit, enough for thousands of posts. Set a maximum cost per run in the run options and the scraper stops exactly at that budget. The current prices are always shown on the Pricing tab.

Input

FieldDescription
Channels (required)Public channels as username, @username, t.me/username, https://t.me/s/username, or any post link.
Maximum posts per channelNewest posts first. Default 100. Set to 0 to get only channel profiles.
Only posts newer thanA date (2026-01-31, read as UTC) or a period back from now (7 days, 12 hours, 2 weeks, 1 month).
Only posts older thanSame formats. Use both filters to collect a past period.
Include channel profilesAdds one profile row per channel. Default off.
Maximum resultsStop the whole run after this many results (posts + profiles). 0 = no limit. Default 1,000.
Max concurrencyChannels loaded in parallel (Advanced). Default 5.
Max requests per minuteUpper limit on page loads per minute (Advanced). Default 120.
Proxy configurationOptional (Advanced). Not needed for normal runs.

Example input:

{
"channels": ["durov", "https://t.me/s/WatcherGuru", "@tginfo"],
"maxPostsPerChannel": 30,
"onlyPostsNewerThan": "14 days",
"includeChannelInfo": true
}

Output

All results go to one dataset. Every item has a type: "message" for a post or "channel" for a channel profile. The Messages and Channel profiles views in the Output tab show the columns for each type.

A post (real output from a local run, CDN links shortened):

{
"type": "message",
"channelUsername": "WatcherGuru",
"id": 15387,
"url": "https://t.me/WatcherGuru/15387",
"date": "2026-10-07T14:17:53.000Z",
"text": "JUST IN: 🇺🇸🇨🇳 Webull $BULL crashes 20% after US House panel flags its China ties as a national security risk.\n\n@WatcherGuru",
"views": 40600,
"reactions": [
{ "type": "paid", "emoji": "⭐", "customEmojiId": null, "count": 3 },
{ "type": "emoji", "emoji": "🤣", "customEmojiId": null, "count": 308 },
{ "type": "emoji", "emoji": "🤡", "customEmojiId": null, "count": 79 },
{ "type": "emoji", "emoji": "❤", "customEmojiId": null, "count": 56 },
{ "type": "emoji", "emoji": "🔥", "customEmojiId": null, "count": 21 },
{ "type": "emoji", "emoji": "🤯", "customEmojiId": null, "count": 14 }
],
"isEdited": false,
"isForwarded": false,
"forwardedFrom": null,
"replyToUrl": null,
"media": [
{
"type": "photo",
"url": "https://cdn4.telesco.pe/file/suMArP7_9fo5ESG7XPylbRdR7tQoHbAX98qDfp45...FdA.jpg",
"thumbnailUrl": null,
"durationSeconds": null,
"title": null,
"details": null
},
{
"type": "photo",
"url": "https://cdn4.telesco.pe/file/b30fra0-bSAVc0Ragphoqq7qlqUHmU0zgmW90oVIV...xtw.jpg",
"thumbnailUrl": null,
"durationSeconds": null,
"title": null,
"details": null
}
],
"links": ["https://t.me/WatcherGuru"],
"scrapedAt": "2026-10-07T16:24:45.601Z"
}

A channel profile:

{
"type": "channel",
"channelUsername": "WatcherGuru",
"url": "https://t.me/WatcherGuru",
"title": "Watcher Guru",
"description": "Watcher Guru gives you unparalleled, unbiased coverage of crypto & finance in real-time.\n\n💬 @WatcherGuruChat",
"subscribers": 629000,
"photoCount": 5700,
"videoCount": 718,
"fileCount": null,
"linkCount": 2350,
"isVerified": true,
"scrapedAt": "2026-10-07T16:24:45.601Z"
}

Post fields (type: "message")

FieldDescription
channelUsernameChannel username without @.
idPost id within the channel.
urlLink to the post.
datePublish time, ISO 8601 in UTC.
textPost text or caption, with line breaks. null for posts without text.
viewsView count. Telegram rounds large values (for example 18.9M), so they are approximate.
reactionsEach reaction as { type, emoji, customEmojiId, count }. type is emoji (a standard emoji), custom_emoji (Telegram shows only the custom emoji's id, not a character) or paid (Telegram Stars, shown as ⭐).
isEditedtrue if the post was edited after publishing.
isForwardedtrue if the post was forwarded from elsewhere.
forwardedFrom{ name, url } of the original post when it comes from a public channel, otherwise null.
replyToUrlLink to the post this one replies to, or null.
mediaPhotos, videos and other media as { type, url, thumbnailUrl, durationSeconds, title, details }. An album is one post with several items.
linksWeb links in the post text (hashtag and cashtag searches are left out).
scrapedAtWhen the post was scraped.

Channel profile fields (type: "channel")

FieldDescription
channelUsername, urlUsername and link of the channel.
title, descriptionChannel name and description.
subscribersSubscriber count (rounded by Telegram, for example 10.5M).
photoCount, videoCount, fileCount, linkCountThe media counters shown on the channel page. null when Telegram doesn't show the counter, which usually means zero.
isVerifiedtrue if the channel has Telegram's verified badge.
scrapedAtWhen the profile was scraped.

Tips

  • Monitoring: schedule the scraper daily with "Only posts newer than: 1 day" (or 25 hours for some overlap) to get only new posts.
  • Subscriber tracking: set "Maximum posts per channel" to 0 and turn on profiles. You get one cheap row per channel.
  • Past periods: set both date filters. The scraper jumps to the older date in a few page loads instead of reading every page.
  • Media links expire. Photo and video URLs are signed CDN links that stop working after a while, so download what you need soon after the run.
  • Start with a small "Maximum posts per channel" to preview the data before a big run.

What the web preview does not show

This scraper reads only what Telegram shows logged-out visitors, so some data is not available:

  • Forward counts. Telegram doesn't show how often a post was forwarded. You get isForwarded and the source channel instead.
  • Comments and member lists. They are not on the public preview and are never collected.
  • Exact numbers. Views, reactions and subscribers are rounded by Telegram (1.2K, 3.4M).
  • Document downloads. Files show a name and size but no download link.
  • Some post types appear on the preview only as "Please open Telegram to view this post". They are returned with their date and views, and empty text and media.
  • Private channels, groups, bots and user accounts have no public preview and are skipped.

Can I use the data to train AI or machine-learning models? No. You may not use this Actor's output to train, fine-tune or evaluate AI or machine-learning models, or to build AI datasets. Telegram's terms (updated 2026-02-03) prohibit any AI or machine-learning use of Telegram content.

Is it legal to scrape Telegram channels? This Actor reads only public pages that Telegram serves to anyone without logging in (t.me/s/<channel>). It does not use a Telegram account, the Telegram API, or any login. Telegram's terms of service (updated 2026-02-03) restrict third-party scraping of Telegram data. You are responsible for making sure your use complies with Telegram's terms and the laws that apply to you, such as GDPR and copyright law. Post content belongs to the channel owners. If you are unsure, ask a lawyer before you run it.

What does the scraper do to protect privacy?

  • Only public broadcast channels are read. Usernames of private channels, groups, bots and user accounts are skipped without loading their pages.
  • It never collects member or subscriber lists, phone numbers, or user profiles.
  • Post author signatures are not collected, and when a post was forwarded from a person (not a public channel), the person's name is left out.
  • Requests are paced politely, and the scraper slows down automatically when Telegram asks it to.

What is it meant for? Monitoring public channels, threat research and OSINT, brand monitoring, and crypto or market analysis.

FAQ

Why was a channel skipped? The log says Skipping @name: it has no public web preview. Open https://t.me/s/name in a private browser window. If you don't see posts, the channel is private, is a group, bot or user, or the username is wrong. You are not charged for skipped channels.

I got fewer posts than expected. Check the date filters and "Maximum results". Very old posts may have been deleted by the channel. If a public channel shows more posts in your browser than in the output, open an issue on the Issues tab.

Can I get other fields? Open an issue on the Issues tab with the field you need.