Telegram Channel Scraper - Public Posts, No Login
Pricing
from $1.44 / 1,000 posts
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
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
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.
| Input | Channel usernames, @handles or t.me links |
| Output | One row per post: text, time, views, author, media type and thumbnail, outbound link and post link, plus an optional summary row per channel |
| Ceiling | 10,000 posts per channel |
| Account needed | None, 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 get | Field |
|---|---|
| The channel, the message number and the post link | channel, messageId, postUrl |
| The message text | text |
| The exact time it was posted | date |
| The view count, as Telegram prints it | views |
| Who signed it | author |
| Whether media is attached, which kind, and its thumbnail | hasMedia, mediaType, mediaUrl |
| The outbound link Telegram previewed under the post | link |
| The channel's title and subscriber count | channelTitle, subscribers |
| Summary rows: username, description, media and link totals, posts returned | channelUsername, channelDescription, photosCount, videosCount, linksCount, postsReturned |
▶️ How to scrape a Telegram channel
- Open Telegram Channel Scraper and click Try for free.
- Put one channel per line into Channels. A username like
durovis enough. - Set Max posts per channel. Start around 20 to see the output shape.
- Leave Emit a channel info row on if you want the subscriber and media totals.
- 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}
| Field | Default | What it is |
|---|---|---|
channels | none | One 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. |
maxItems | 100 | Posts per channel, up to 10,000. Three channels at 100 is up to 300 post rows. |
includeChannelInfoRow | true | Writes one summary row per channel before its posts. Turn it off for a clean posts-only dataset. |
notionConnector, notionParentId | none | Optional. Write every post into your own Notion as well as the dataset. |
proxyConfiguration | off | Optional, 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"}
| Field | How to read it |
|---|---|
views, subscribers | Display text, not numbers. Parse them yourself if you need arithmetic. |
date | A real ISO timestamp, straight off the post, not a relative "2 days ago". |
text | null on a media-only post. Links inside the message keep their t.me form. |
mediaType | photo, video, roundvideo, voice, sticker, document or null. |
mediaUrl | The preview thumbnail, not the full-size file. |
messageId | The 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.
| Row | How to spot it | Billed |
|---|---|---|
| A post | rowType: "post" | yes |
| A channel summary | rowType: "channel" | no |
| A diagnostic | ok: false and an errorCode | no |
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.
| Code | What it means |
|---|---|
BAD_INPUT | No usable channel was given. Use a username, an @handle or a t.me link. |
NOT_FOUND | The channel does not exist, is private, or has no public preview page. |
NO_RESULTS | The channel resolved but has no public messages. |
RATE_LIMITED | Telegram asked for a slower pace. Re-run with a smaller maxItems. |
SERVER_ERROR | Telegram answered with a server error. Usually passes on its own. |
NOT_SERVED | This 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. |
NETWORK | Telegram could not be reached. |
TIME_LIMIT | The 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
messageIdas 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
linkready to follow.
From a call channel to the tokens it names, in three steps:
- Run this actor on the channels you follow, with a small
maxItems. - Pull the contract addresses out of the
textof the posts. - Put them into DexScreener Pair Price & Liquidity Scraper
as
searchTermsto 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.
viewsandsubscribersare strings.1.15Mis what Telegram prints and what you get.mediaUrlis 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
nullrather 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 want | Use |
|---|---|
| Posts from public Telegram channels | This one |
| Price, liquidity and volume for the tokens a channel names | DexScreener Pair Price & Liquidity Scraper |
| Posts from Bluesky accounts or a Bluesky search | Bluesky 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.
Is scraping Telegram channels legal?
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.