Telegram Channel Scraper - Public Posts, No Login avatar

Telegram Channel Scraper - Public Posts, No Login

Pricing

from $1.44 / 1,000 posts

Go to Apify Store
Telegram Channel Scraper - Public Posts, No Login

Telegram Channel Scraper - Public Posts, No Login

Scrape posts from public Telegram channels, with no bot token or login. Each row holds the message text, exact time, views, author, media type and thumbnail, outbound link and post link, with the channel's subscriber count. Up to 10,000 posts per channel. $1.50 per 1,000 posts.

Pricing

from $1.44 / 1,000 posts

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Name a public Telegram channel and get its posts back as rows: the message text, the exact timestamp, the view count, whether media is attached and which kind, and a direct link to the post. It pages back through the history until it has the number you asked for.

Public channels only, the ones with a web preview page. Private channels, invite links and groups have no public page, so none of them work here. And views and subscriber counts arrive the way Telegram prints them, 1.15M, not as numbers.

InputChannel usernames, @handles or t.me links
OutputOne row per post: text, time, views, author, media type and thumbnail, outbound link and post link, plus an optional summary row per channel
Ceiling10,000 posts per channel
Account neededNone, and no bot token
Price$1.50 per 1,000 posts on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 3,300

🔍 What Telegram Channel Scraper does

It reads a channel's public web preview and walks back through it until it hits your limit or reaches the first message ever posted. Posts are deduped by message id inside a run.

Each post row carries the channel title and subscriber count alongside the message, so a run over several channels stays sortable without joining anything. With the summary row switched on you also get one row per channel with the description and the photo, video and link totals.

A channel that is private, deleted or has no public preview reports itself and does not stop the others.

📋 What data you get from each Telegram post

What you getField
The channel, the message number and the post linkchannel, messageId, postUrl
The message texttext
The exact time it was posteddate
The view count, as Telegram prints itviews
Who signed itauthor
Whether media is attached, which kind, and its thumbnailhasMedia, mediaType, mediaUrl
The outbound link Telegram previewed under the postlink
The channel's title and subscriber countchannelTitle, subscribers
Summary rows: username, description, media and link totals, posts returnedchannelUsername, channelDescription, photosCount, videosCount, linksCount, postsReturned

▶️ How to scrape a Telegram channel

  1. Open Telegram Channel Scraper and click Try for free.
  2. Put one channel per line into Channels. A username like durov is enough.
  3. Set Max posts per channel. Start around 20 to see the output shape.
  4. Leave Emit a channel info row on if you want the subscriber and media totals.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost to scrape Telegram channels?

$1.50 per 1,000 posts on the Free plan. Paid plans pay a little less: $1.48 on Starter, $1.46 on Scale and $1.44 on Business. On the free plan, the $5 Apify gives you each month covers about 3,300 posts.

Posts are what you pay for. Channel summary rows and diagnostic rows are free, duplicates within a run are dropped before they reach you, and a channel that turns out to be private or empty costs you nothing.

📥 What you give it

{
"channels": ["telegram", "@durov", "https://t.me/durov"],
"maxItems": 100,
"includeChannelInfoRow": true
}
FieldDefaultWhat it is
channelsnoneOne entry per channel. A bare username, an @handle or a full t.me link all resolve to the same thing. The form opens with telegram and durov filled in.
maxItems100Posts per channel, up to 10,000. Three channels at 100 is up to 300 post rows.
includeChannelInfoRowtrueWrites one summary row per channel before its posts. Turn it off for a clean posts-only dataset.
notionConnector, notionParentIdnoneOptional. Write every post into your own Notion as well as the dataset.
proxyConfigurationoffOptional, and off by default because a normal run does not need it.

Invite links do not work. A t.me/+abc123 or t.me/joinchat/abc123 link points at a private channel, and those have no public page. Use the public t.me/{name} form.

📤 What you get back

A real post row from a real run, with the message text cut short and its emoji removed:

{
"ok": true,
"rowType": "post",
"channel": "telegram",
"messageId": 460,
"postUrl": "https://t.me/telegram/460",
"text": "For all the info from today's update and a look back at 13 years of Telegram features ... check out our blog:\nhttps://telegram.org/blog/welcome-messages-buttons-TG-13",
"date": "2026-08-26T19:12:34.000Z",
"views": "1.15M",
"author": "Telegram News",
"hasMedia": false,
"mediaType": null,
"mediaUrl": null,
"link": "https://telegram.org/blog/welcome-messages-buttons-TG-13",
"channelTitle": "Telegram News",
"subscribers": "9.56M"
}
FieldHow to read it
views, subscribersDisplay text, not numbers. Parse them yourself if you need arithmetic.
dateA real ISO timestamp, straight off the post, not a relative "2 days ago".
textnull on a media-only post. Links inside the message keep their t.me form.
mediaTypephoto, video, roundvideo, voice, sticker, document or null.
mediaUrlThe preview thumbnail, not the full-size file.
messageIdThe channel's own message number. Stable, so use it as your dedupe key across runs.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itBilled
A postrowType: "post"yes
A channel summaryrowType: "channel"no
A diagnosticok: false and an errorCodeno

Filter on rowType. The summary row shares the dataset with posts and renders mostly blank in the default table view, which is what a "why is there an empty line" question usually turns out to be.

CodeWhat it means
BAD_INPUTNo usable channel was given. Use a username, an @handle or a t.me link.
NOT_FOUNDThe channel does not exist, is private, or has no public preview page.
NO_RESULTSThe channel resolved but has no public messages.
RATE_LIMITEDTelegram asked for a slower pace. Re-run with a smaller maxItems.
SERVER_ERRORTelegram answered with a server error. Usually passes on its own.
NOT_SERVEDThis post was not served this run. Re-run it later. Runs before 13 October 2026 wrote BLOCKED here, and runs from 13 to 24 October wrote NETWORK.
NETWORKTelegram could not be reached.
TIME_LIMITThe run stopped just before its time limit. The posts written before it are yours and charged; give the run more time to get the rest. When time runs short, a channel's summary row comes after its posts and counts only the posts written.

One bad channel never stops the others, and a diagnostic row never fails the run. The one exception is TIME_LIMIT: the run ends as failed when the time limit stopped it before any post came back.

💡 What people use it for

  • Archiving a channel's history once, then topping it up weekly with messageId as the dedupe key.
  • Watching announcement channels for a product or a token and pulling the text into an alert.
  • Measuring which posts in a channel actually travelled, using the view counts next to the dates.
  • Collecting the outbound links a channel shares, which sit in link ready to follow.

From a call channel to the tokens it names, in three steps:

  1. Run this actor on the channels you follow, with a small maxItems.
  2. Pull the contract addresses out of the text of the posts.
  3. Put them into DexScreener Pair Price & Liquidity Scraper as searchTerms to get the price, liquidity and volume behind each one.

🚧 What it does not do

  • Public channels only. No private channels, no invite links, no groups, no direct messages.
  • No reactions and no comments. The preview page does not publish them.
  • views and subscribers are strings. 1.15M is what Telegram prints and what you get.
  • mediaUrl is a thumbnail. Full-size photos, videos and documents are not downloaded.
  • No forwarding chain. You get the post as the channel shows it, not where it was forwarded from.
  • No search. You name channels, not keywords. Filter the rows afterwards.
  • A very old channel takes many pages. Pulling thousands of posts takes a while, so give a large run enough time.
  • Media-only posts have no text, which shows as null rather than an empty string.
  • It is not an official Telegram tool. Dami's Studio is independent and is not affiliated with or endorsed by Telegram, or by any other company named on this page.

🧭 Which social scraper do you need?

If you wantUse
Posts from public Telegram channelsThis one
Price, liquidity and volume for the tokens a channel namesDexScreener Pair Price & Liquidity Scraper
Posts from Bluesky accounts or a Bluesky searchBluesky Scraper

❓ Questions people ask

Do I need a Telegram account or a bot token?

No. Nothing to register and nothing to log in to.

Can I read a private channel I am a member of?

No. This reads the public preview page, and a private channel has none.

Why are views a string like 1.15M?

Because that is exactly what Telegram publishes on the page. The rounding is theirs, and the actor cannot undo it.

How far back can it go?

To the first message, if you raise maxItems enough. It stops early when the channel runs out.

Can I call it from code or connect it to an AI assistant?

The API tab has code for Python, JavaScript and the CLI. MCP clients like Claude and ChatGPT use https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/telegram-channel-scraper; coding assistants can load our skill file. All three bill your Apify account at the same price.

These are public channels with public web pages. Posts can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the exact channel entry you used. The errorCode on the diagnostic row usually names the problem on its own.