Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

from $0.60 / 1,000 posts

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

🏷️ From $0.60 / 1K | Export posts, view counts and media from any public Telegram channel. No API key, no phone number and no Telegram account needed.

Pricing

from $0.60 / 1,000 posts

Rating

0.0

(0)

Developer

丂卩ㄖㄖҜㄚ

丂卩ㄖㄖҜㄚ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Export posts, views and media from any public Telegram channel. No API key, no phone number, no login, no Telegram account of any kind.

🔍 What does Telegram Channel Scraper do?

Telegram publishes a web preview of every public channel at t.me/s/<channel>. This Actor reads that, so there is nothing to authenticate and nothing to configure. Give it a channel name and it returns the posts.

Paginating backwards through a channel's history is handled for you, so maxPosts is the only thing controlling how far back it goes.

🧭 How does this compare with Telegram's official APIs?

Telegram has real, free official APIs. The Bot API needs a bot created through BotFather, which needs a Telegram account, and a bot only sees a channel it has been added to. The full Telegram API over MTProto can read any public channel, but it needs an application registered for an api_id and api_hash plus a phone number to authorise, and it hands back API objects, not rows.

If you are building a Telegram client, use those. If you just want a channel's posts as data, this Actor reads the public preview Telegram itself publishes at t.me/s/<channel>: no account, no registration, nothing to authorise, and the history pagination, view count parsing and media extraction are already done. One channel name in, a table of posts out.

📊 What data can I extract from Telegram?

One item per post:

FieldWhat it holds
📢channelThe channel username the post belongs to
🆔postIdThe post number within the channel
🔗urlDirect link to the post
📅datetimeWhen the post was published, ISO 8601
👤authorThe signed author, where the channel signs posts
📝textThe post text with line breaks preserved
🔢textLengthLength of the post text in characters
🔢viewsView count, expanded from Telegram's 4.48M style to 4480000
📢forwardedFromThe original channel, if the post is a forward
🔗replyToLink to the post being replied to, if a reply
🖼️photosPhoto URLs attached to the post
🎬videosVideo URLs attached to the post
hasMediaWhether the post carries any media
🔗linksExternal links found in the post text
👍reactionsAlways empty. Telegram's public preview does not publish reactions, see below
🔢totalReactionsAlways 0, for the same reason
📅scrapedAtWhen the row was collected

💡 Why scrape Telegram channels?

Market and competitor monitoring. Track announcement channels in crypto, gaming, retail or news.

Research and OSINT. Archive public channel output with timestamps and view counts.

Content and trend analysis. Find which posts got traction using view counts.

Alerting. Run on a schedule with postsSince set to yesterday and get only what is new.

🚀 How do I use Telegram Channel Scraper?

  1. Click Try for free.
  2. Put one or more public channel names into channels, comma separated.
  3. Set maxPosts to control how far back each channel goes.
  4. Add postsSince or searchText if you only want part of the history, then click Start.
  5. Download the results as JSON, CSV or Excel, or pull them from the API.

⬇️ Input

{
"channels": "durov",
"maxPosts": 100
}
FieldTypeDefaultWhat it does
channelsstringdurovPublic channel usernames or links, comma separated. Accepts durov, @durov, t.me/durov or https://t.me/s/durov
maxPostsinteger100Cap per channel, so 3 channels at 100 returns up to 300 posts. Each post is one billable result
postsSincestringStop once posts are older than this date, YYYY-MM-DD
searchTextstringOnly keep posts containing this text, case insensitive

⬆️ Output

Table view

Results arrive as a Posts table you can sort and filter in the Console, with the channel, timestamp, author, text, views and a direct link lined up.

JSON

A typical row:

{
"channel": "durov",
"datetime": "2026-05-23T13:26:07+00:00",
"author": "John Smith",
"text": "A short update posted to the channel.",
"views": 11400000,
"totalReactions": 0,
"hasMedia": false,
"url": "https://t.me/durov/520",
"postId": 520
}

Download it from the run as JSON, CSV or Excel, or read it straight from the API.

What this cannot do

Private channels, groups and direct messages are not accessible through the public preview and never will be. If a channel is not visible at t.me/s/<name> in a browser, this Actor cannot read it either. Channels set to hide their post history will return nothing.

Some channels disable the web preview entirely. The run tells you which channels failed and why rather than silently returning an empty dataset.

⏱️ How long does a run take?

Measured on real runs, so you know what normal looks like and can tell it apart from a run that has stalled.

Posts returnedTypical run time
53 to 4 seconds
20about 5 seconds
10013 to 26 seconds
424, a channel read to its endabout 80 seconds

Telegram's web preview serves a window of posts at a time and the Actor pages backwards through the history, so the run time follows maxPosts closely at roughly a fifth of a second a post. Two things add to it: several channels in one run, since each is paged separately, and asking for more posts than a channel actually holds, because the run keeps paging until the source stops giving it anything new. That second case is why a request for 1,000 posts against a channel holding 424 took eighty seconds and returned 424. It is not a fault and it is reported as what it is. The first few seconds of any run are the container starting rather than the work.

A run is never silently stuck. Progress is logged as each page of history is read, and posts are written to the dataset as they are parsed rather than held back to the end, so a run that hits its time limit still leaves everything it had already collected.

Set the run timeout to suit the size of the ask. This Actor's default is 3600 seconds, which is comfortably more than the largest run in the table above (500 posts takes about 1 minute). You are charged per delivered result rather than per minute, so a generous timeout costs you nothing and a tight one risks losing the run's work. Lower it only if you want a hard ceiling on how long a scheduled run may sit.

💰 How much does it cost?

You pay per post returned. maxPosts is a per channel cap, so three channels at 100 posts can charge for up to 300 results and no more. postsSince and searchText narrow the run further.

Runs that return nothing cost nothing. Paid Apify plans get a lower rate per post.

🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make or your own webhook using Apify integrations. You can also trigger a run whenever something happens in another tool.

🔗 Using Telegram Channel Scraper with the Apify API

curl -X POST "https://api.apify.com/v2/acts/spookyweb~telegram-channel-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channels": "durov", "maxPosts": 100}'

Or with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/telegram-channel-scraper').call({
channels: 'durov',
maxPosts: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Full detail is in the Apify API reference, and every run is also callable from the Python and JavaScript clients.

❓ FAQ

Do I need a Telegram account or API key?

No. There is no account, no phone number, no API key and no login of any kind. This reads the web preview Telegram itself publishes at t.me/s/<channel>, which is open to anyone.

Can it read private channels or groups?

No. Public channels only. Private channels, groups and direct messages are not served through the web preview, so they are not accessible and are not attempted. If a channel is not visible at t.me/s/<name> in your own browser, this Actor cannot read it either.

How many posts can I get from one channel?

As many as maxPosts allows. Pagination backwards through the history is handled for you, so the cap is the only thing deciding how far back a run goes. The cap applies per channel, so three channels at 100 returns up to 300 posts.

Can I filter by date or text?

Yes. postsSince stops a channel once its posts are older than the date you give, in YYYY-MM-DD form. searchText keeps only posts containing that text, case insensitive. Both are useful on a schedule, where you want what is new rather than the whole archive.

Does it get view counts?

Views yes, reactions no, and it is worth being straight about why.

views is the view count, expanded from Telegram's 4.48M shorthand into a plain number so it sorts correctly. It is on every post.

reactions and totalReactions are always empty. This Actor reads Telegram's public channel preview, which is what lets it work with no API key, no phone number and no account, and that preview does not carry reactions at any point. The fields are kept rather than removed so the shape of a row does not change if Telegram starts publishing them. If reactions are what you need, no scraper of the public preview can give them to you.

Why did a channel return nothing?

Either it hides its post history, or it has the web preview disabled entirely. The run reports which channels failed and why rather than handing back an empty dataset with no explanation.

This reads the public web preview of public Telegram channels, the pages Telegram itself publishes at t.me for anyone to read. No account, no phone number and no API key are involved, and private channels and groups are not accessible and not attempted.

Scraping publicly available data is legal in the UK, the EU and the US. Channel owners publish these posts openly. If you go on to combine this data with personal data, that is on you to handle under GDPR. Apify's ethical scraping guide covers the wider picture.

👍 Your feedback

Found a bug, or want a field that is not here yet? Open an issue on the Actor's Issues tab. Requests that make the data more useful get built, and problems get fixed quickly.

🔎 You might also like

ActorWhat it does
Website Contact ScraperEmails, phones, socials and addresses from company websites, one record per domain
Wayback Machine ScraperEvery archived capture of a URL, what changed between them, and the original bytes
Company Email FinderPublished company addresses, the naming pattern behind them and an MX check