Telegram Scraper | Channel Posts, Views and Reactions avatar

Telegram Scraper | Channel Posts, Views and Reactions

Pricing

from $1.49 / 1,000 posts

Go to Apify Store
Telegram Scraper | Channel Posts, Views and Reactions

Telegram Scraper | Channel Posts, Views and Reactions

Telegram scraper (Телеграм, تلگرام, 电报) for public channels, no account or API key. Export every post with text, views, reactions, photos, videos, links, forwards and exact subscriber counts. Search channels by keyword or paste post links. 100 posts in 7 seconds, 29 fields each, to JSON or CSV.

Pricing

from $1.49 / 1,000 posts

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

5 hours ago

Last modified

Security

Limited permissions

Share

Telegram Scraper (Телеграм) | Channel Posts, Views, Reactions and Keyword Search (2026)

2 URLs. 100 Telegram posts. 29 fields per post.

From SilentFlow. Creators of Pinterest Scraper (#1 for “pinterest pins scraper” in Apify Store search) and Leboncoin Scraper Ppe, with 230,000+ combined lifetime runs.

Every post of any public Telegram channel, as one clean row: text, views, reactions, photos, videos, links, forwards, replies and the channel's exact subscriber count. Our test run returned 100 posts from two channels in 7 seconds, with no Telegram account, no phone number and no API key.

Why choose this actor?

Scrolling a channel for an hour to copy posts into a sheet? Getting "10.7M subscribers" when you need the real number? Filling a ten-field form and picking a mode before you get a single post?

  • 29 fields filled per post, not 16. On the default run (100 posts from durov and cointelegraph), 29 fields carry a value on at least half the rows: text, views, every reaction with its count, reactionsCount, links, photos, the post signature, the edited, forwarded and reply flags, the channel's id, title, description, photo, verified badge, exact subscriber count and its photo, video, file and link counters, the date and the post link. The most used Telegram keyword scraper announces 16 fields.
  • Five ways in, in one field. A username (durov), an @handle, a channel link (https://t.me/cointelegraph), a single post link (https://t.me/durov/528) or a search link (https://t.me/s/cointelegraph?q=bitcoin), plus keywords searched inside every channel with Telegram's own search. In our keyword run, 80 posts of 80 contained their keyword. The most used Telegram keyword scraper takes keywords and channel names, not links.
  • Five form fields, none of them required. Paste channels and press Start: the prefilled input runs as is. The most used Telegram keyword scraper has ten fields and asks you to pick a mode first.

Try Telegram Scraper

Try your first 100 posts

Paste this input in the JSON tab of the Input page and press Start. It reads the 50 latest posts of Pavel Durov's channel and the 50 latest posts of Cointelegraph, newest first.

{
"startUrls": ["durov", "https://t.me/s/cointelegraph"],
"maxItems": 50
}

It runs on the Apify Free plan. Each post becomes one row of your dataset: open the Output tab to see the table, or export it as JSON, CSV or Excel.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it the full picture of this scraper:

You have access to the Telegram Scraper on Apify: silentflow/telegram-scraper
It reads public Telegram channels (no account) and returns one row per post, newest first.
Input schema (no field is required):
- startUrls (array of strings): channels and posts. Accepts a username (durov), an @handle (@telegram),
a channel link (https://t.me/cointelegraph or https://t.me/s/cointelegraph), a post link
(https://t.me/durov/528) or a search link (https://t.me/s/cointelegraph?q=bitcoin).
Groups, private chats and invite links (t.me/+...) have no public posts and are skipped.
- keywords (array of strings): words searched inside every channel of startUrls with Telegram's own search.
Keywords need at least one channel.
- maxItems (integer, default 100): max posts per channel and per keyword search. Post links always return their post.
- oldestPostDate (string): only posts newer than this date. Absolute (2026-09-01) or relative (7 days, 1 month).
- debugMode (boolean, default false): detailed logs.
Output per post (45 fields, null when absent):
- id (string, "channel/messageId"), url (string, permanent post link), messageId (integer)
- text (string), mediaType (text | photo | video | album | link | document | audio | voice | sticker | poll | location)
- links, hashtags, mentions (arrays of strings)
- isEdited, isForwarded, isReply (booleans), forwardedFrom, forwardedFromUrl, replyToUrl, replyToText (strings)
- author (string, post signature)
- channelUsername, channelTitle, channelUrl, channelDescription, channelPhotoUrl (strings), channelId (integer), channelIsVerified (boolean)
- views (integer), reactions (array of {emoji, emojiId, count, isPaid}), reactionsCount (integer)
- channelSubscribers (integer, exact), channelPhotos, channelVideos, channelFiles, channelLinks (integers)
- date (string, RFC 3339 UTC)
- imageUrls, videoUrls (arrays of strings), videoThumbnailUrl (string), videoDuration (integer, seconds), documentTitle (string)
- linkPreviewUrl, linkPreviewSiteName, linkPreviewTitle, linkPreviewDescription, linkPreviewImageUrl (strings)
- foundBy (channel | search | post), searchKeyword (string), scrapedAt (string, RFC 3339 UTC)
Use apify-client for Python or JavaScript: client.actor("silentflow/telegram-scraper").call(run_input=...).

How to scrape Telegram channel posts

Three inputs, from the simplest to the most complete. Each one runs as is.

Export the latest posts of one channel

{
"startUrls": ["durov"],
"maxItems": 100
}

The 100 latest posts of the channel, newest first, each with its text, views, reactions, media and link. A username, an @handle and a t.me link all work.

Find every Bitcoin post in two crypto channels

{
"startUrls": ["cointelegraph", "https://t.me/s/binance_announcements"],
"keywords": ["bitcoin", "ETF"],
"maxItems": 20
}

Each keyword is searched inside each channel with Telegram's own search, so a row always matches its keyword and says which one found it in searchKeyword. In our test run this input returned 80 posts in 5 seconds, 20 per channel and keyword, and every one of them contained its keyword.

Pull the last 7 days of several channels

{
"startUrls": ["cointelegraph", "durov", "https://t.me/telegram", "@tginfo"],
"oldestPostDate": "7 days",
"maxItems": 500
}

Each channel is read newest first and stops at the first post older than 7 days, so a quiet channel is done after one page and a busy one gives you its whole week. Set the date to 1 day and schedule the run every morning for a daily digest.

Input parameters

ParameterTypeDefaultDescription
startUrlsarray of stringsprefilled with durov and https://t.me/s/cointelegraphChannels, post links and search links to read. See the accepted formats below.
keywordsarray of stringsnoneWords searched inside every channel of startUrls with Telegram's own search: bitcoin, ETF, #AI. Empty reads the whole history.
maxItemsinteger100Max posts per channel and per keyword search. Post links always return their post. No fixed limit.
oldestPostDatestringnoneOnly posts published after this date: 2026-09-01, or an age such as 7 days, 2 weeks, 1 month.
debugModebooleanfalseDetailed logs, only needed when something looks wrong.

Accepted formats in startUrls:

You pasteThe run reads
durov, @durovthe channel's posts, newest first
https://t.me/durov, t.me/durov, https://telegram.me/durovthe channel's posts, newest first
https://t.me/s/durov (the web preview)the channel's posts, newest first
https://t.me/durov/528, https://t.me/s/durov/528that single post
https://t.me/s/cointelegraph?q=bitcoinTelegram's search for bitcoin inside that channel
tg://resolve?domain=durovthe channel's posts, newest first
{"url": "https://t.me/durov"}the same as the plain link, for lists exported from other tools

Invite links (https://t.me/+..., https://t.me/joinchat/...), private chat links (https://t.me/c/...), groups and personal accounts have no public posts: the run skips them and names them in the log, and the rest of the input still runs.

What data can you extract from Telegram?

Each row is one post, with 45 top-level fields grouped the way you read them. Each reaction in reactions carries 4 fields of its own.

GroupFields
Identity (3)id (channel/messageId, stable), url (permanent post link), messageId
Content (12)text, mediaType, links, hashtags, mentions, isEdited, isForwarded, forwardedFrom, forwardedFromUrl, isReply, replyToUrl, replyToText
Author and channel (8)author (the post signature), channelUsername, channelTitle, channelUrl, channelId, channelDescription, channelPhotoUrl, channelIsVerified
Measures (8)views, reactions, reactionsCount, channelSubscribers, channelPhotos, channelVideos, channelFiles, channelLinks
Time (1)date (RFC 3339, UTC)
Media and links (10)imageUrls, videoUrls, videoThumbnailUrl, videoDuration (seconds), documentTitle, linkPreviewUrl, linkPreviewSiteName, linkPreviewTitle, linkPreviewDescription, linkPreviewImageUrl
Meta (3)foundBy (channel, search or post), searchKeyword, scrapedAt

What the values look like:

  • Numbers are numbers. Telegram shows 16.5M views; the row says 16500000. Views and reaction counts are the figures Telegram displays, so above a thousand they are rounded the way Telegram rounds them. channelSubscribers is the exact count from the channel's own page: 10656365 for Pavel Durov's channel on 24 Sep 2026, where the preview only shows 10.7M.
  • Reactions keep their kind. A standard reaction has its emoji ("😍"). A custom reaction only has the id of its custom emoji in emojiId, and emoji is null. Paid star reactions have isPaid: true and the emoji "⭐".
  • Albums are one row. A post with several photos and videos is one row with mediaType: "album" and every link in imageUrls and videoUrls.
  • Absent is null. A post without a signature has author: null, never an empty string. Lists are empty lists.

Output example

A real row from the default run (the long image links are shortened here):

{
"id": "durov/525",
"url": "https://t.me/durov/525",
"messageId": 525,
"text": "🔄 Telegram’s new update is out. Lots of great new features.\n\n😂 But most importantly: the announcement is actually fun to read.",
"mediaType": "link",
"links": ["https://telegram.org/blog/watch-apps-and-more"],
"hashtags": [],
"mentions": [],
"isEdited": false,
"isForwarded": false,
"forwardedFrom": null,
"forwardedFromUrl": null,
"isReply": false,
"replyToUrl": null,
"replyToText": null,
"author": "Pavel Durov",
"channelUsername": "durov",
"channelTitle": "Pavel Durov",
"channelUrl": "https://t.me/durov",
"channelId": 1006503122,
"channelDescription": "Founder of Telegram.",
"channelPhotoUrl": "https://cdn4.telesco.pe/file/jmUrXq4NGgJZk5-drukGUq79pujfyRNIZNcp1H9AwRICo3kuLNp.jpg",
"channelIsVerified": true,
"views": 16500000,
"reactions": [
{ "emoji": "⭐", "emojiId": null, "count": 4450, "isPaid": true },
{ "emoji": null, "emojiId": "5265077361648368841", "count": 19900, "isPaid": false },
{ "emoji": null, "emojiId": "5465587407350942612", "count": 8080, "isPaid": false },
{ "emoji": null, "emojiId": "5399847211989246390", "count": 6090, "isPaid": false },
{ "emoji": null, "emojiId": "5936157098181135162", "count": 1180, "isPaid": false },
{ "emoji": null, "emojiId": "5373223594484587136", "count": 273, "isPaid": false }
],
"reactionsCount": 39973,
"channelSubscribers": 10656365,
"channelPhotos": 102,
"channelVideos": 46,
"channelFiles": null,
"channelLinks": 200,
"date": "2026-06-12T19:15:19Z",
"imageUrls": [],
"videoUrls": [],
"videoThumbnailUrl": null,
"videoDuration": null,
"documentTitle": null,
"linkPreviewUrl": "https://telegram.org/blog/watch-apps-and-more",
"linkPreviewSiteName": "Telegram",
"linkPreviewTitle": "Smartwatch Apps, Rich Text for Bots, AI Guardians for Groups, and Much More",
"linkPreviewDescription": "Today’s update brings Telegram to Apple Watch and Android smartwatches, adds filthy rich text for bots, lets AI admins screen new group members, and introduces smarter polls, browser controls, and much more.",
"linkPreviewImageUrl": "https://cdn4.telesco.pe/file/rKIjM7Jntr0cso3unW32hMD8muIiacTHPWGFOB68PfgHn.jpg",
"foundBy": "channel",
"searchKeyword": null,
"scrapedAt": "2026-09-24T02:53:37Z"
}

Advanced usage

Five recipes for what the examples above do not show. Each JSON runs as is.

Build a daily digest of 10 channels

{
"startUrls": ["cointelegraph", "durov", "telegram", "tginfo", "binance_announcements", "nytimes", "whale_alert_io", "meduzalive", "tass_agency", "svtvnews"],
"oldestPostDate": "1 day",
"maxItems": 300
}

Schedule this input every morning in the Schedules tab. Each channel stops at the first post older than 24 hours, so the run only reads what is new and every row is a post you have not seen yet. Send the dataset to Slack, Google Sheets or your warehouse with an Apify integration.

Turn a list of post links into full rows

{
"startUrls": [
"https://t.me/durov/528",
"https://t.me/durov/300",
"https://t.me/telegram/441",
"https://t.me/cointelegraph/72289"
]
}

A list of links from a spreadsheet, a newsletter or a monitoring tool comes back with the text, views, reactions, media, date and channel of each post. A link to one photo of an album returns the album. A deleted post gives no row and is counted in the run log.

Paste a search you made in the browser

{
"startUrls": ["https://t.me/s/cointelegraph?q=ETF", "https://t.me/s/binance_announcements?q=listing"],
"maxItems": 100
}

Search a channel on its web preview, copy the address, paste it here. Each search link is read page after page, newest first, and searchKeyword keeps the word you searched.

Track a brand or a ticker across a set of channels

{
"startUrls": ["cointelegraph", "binance_announcements", "whale_alert_io"],
"keywords": ["BlackRock", "SEC", "#BTC"],
"oldestPostDate": "1 month",
"maxItems": 200
}

Every keyword runs inside every channel (nine searches here) and a post found by two keywords is delivered once. Hashtags work as keywords too. Filter the dataset on searchKeyword to count mentions per word, and on views and reactionsCount to see which ones got attention.

Archive a channel's history

{
"startUrls": ["cointelegraph"],
"maxItems": 5000
}

A channel is read back as far as you ask. In our test, 500 posts of Cointelegraph took 30 seconds and reached back six weeks, to 10 Aug 2026. Media links expire, so download the images and videos you want to keep soon after the run; the post link in url stays valid.

FAQ

Do I need a Telegram account, a phone number or an API key? No. The scraper reads the public web preview every public channel has at t.me/s/{channel}. Nothing is asked of you except the channels you want.

What is Telegram? Telegram (Телеграм in Russian, تلگرام in Persian, 电报 in Chinese) is a messaging app. Its public channels are one-to-many feeds, used by news outlets, crypto projects, brands, creators and governments, and many of them publish on Telegram first.

Can I search all of Telegram by keyword? No, and no tool can do it without an account: Telegram has no public search across all channels. Keywords here run Telegram's own search inside each channel you give, which returns every post of that channel that matches, not a sample. To cover a topic, list the channels of that topic and add your keywords.

Can it read groups, private channels or comments? No. Groups, private channels, personal chats and the comment threads under posts are not public on the web. The run names every group or private link it skips in the log and delivers the rest.

Why do some channels return nothing? Three reasons, each named in the log: the name is a group, a user or a bot, not a channel; the channel turned off its web preview; or the channel is restricted in the country the run connects from. The run ends with a message that says which one.

How fresh is the data? Live. Every run reads the channels at that moment: a post published a minute before the run is in it, and views and reactions are the counts at run time.

How far back can I go? As far as the channel's public history goes. maxItems sets how many posts per channel, oldestPostDate sets how old; the run stops at whichever comes first. There is no fixed limit on either.

Are views and subscriber counts exact? channelSubscribers is exact: it comes from the channel's own page (10,656,365 for Pavel Durov's channel on 24 Sep 2026). Views and reaction counts are the numbers Telegram displays under each post, so above a thousand they are rounded as Telegram rounds them (16.5M, 19.9K).

Which links are permanent? url (the post link), channelUrl and the links inside the post text are permanent. imageUrls, videoUrls, videoThumbnailUrl, channelPhotoUrl and linkPreviewImageUrl point to Telegram's media servers and expire after a while: download the files you want to keep soon after the run.

Can I combine keywords, several channels and a date? Yes. startUrls with five channels, keywords with three words and oldestPostDate: "7 days" runs 15 searches and returns every matching post of the last week, each post once.

Can I run it on a schedule? Yes. Save your input as a task and add a schedule in Apify. With oldestPostDate set to 1 day, a daily run returns only the new posts.

How do I get the data into my tools? Every run's dataset exports to JSON, CSV, Excel, XML or RSS from the Output tab, or from the API: https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv. Apify integrations send it to Google Sheets, Slack, Zapier, Make or a webhook.

Is it legal to scrape Telegram channels? The scraper reads public posts that anyone can see in a browser without logging in. How you use them is up to you: see the Legal compliance section below.

More SilentFlow scrapers

🛒 E-commerce

💼 Jobs

🏠 Real estate

📣 Social media

🏢 Business data

✈️ Travel

🎯 Lead generation

🔎 SEO

Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This Actor extracts publicly available data from Telegram's public channel previews on t.me. It does not bypass any login, paywall or CAPTCHA, and never uses a Telegram account. Users are responsible for complying with Telegram's terms of service and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). Posts can name people, and post signatures (author) and channel titles can be personal data: handle them accordingly, keep only what you need, and honor removal requests. The data returned is informational; verify accuracy for regulated use cases.

Telegram Scraper by SilentFlow: public channel posts, views and reactions, ready for your spreadsheet.