Telegram Posts Scraper | Views, Reactions and Comments avatar

Telegram Posts Scraper | Views, Reactions and Comments

Pricing

from $1.66 / 1,000 posts

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

Telegram Posts Scraper | Views, Reactions and Comments

Telegram posts scraper (Телеграм) for public channels, no account. Get each post's text, views, every reaction, media, links and date plus the channel's exact subscriber count, 28 fields per post: 40 posts from 2 channels in 2 seconds. Search keywords inside channels or pick a 2026 date range.

Pricing

from $1.66 / 1,000 posts

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Features

Limited permissions

Share

Telegram Posts Scraper (Телеграм) | Views, Reactions, Comments and Date Ranges (2026)

Telegram posts, 28 fields each, from any username.

From SilentFlow. Creators of Facebook Search Scraper and JD Products Scraper (#1 for “jd scraper” in Apify Store search), with 910,000+ combined lifetime runs.

Every public Telegram post you need, one clean row each: text, views, every reaction, media, links and date, next to the channel's exact subscriber count. 40 posts from two channels in 3 seconds, no Telegram account.

Why choose this actor?

Scrolling a channel for an hour to reach last spring's posts? Getting twenty search results when the channel has hundreds of matches? Copying view counts by hand into a sheet?

  • 23 fields filled on every post, not 16. On the default run (40 posts from durov and nytimes), 23 data fields carry a value on every single row: the post id, link and number, text, media type, the edited, forwarded and reply flags, views, every reaction with its count, reactionsCount, the date, and the channel's username, title, link, numeric id, description, photo, verified badge, exact subscriber count and its photo, video and link counters. 27 fields are filled on at least half the rows, 47 exist per row. The most used Telegram posts scraper announces 16 fields, with no reactions and no subscriber count.
  • Three ways in: channel usernames, post links and keywords. Read whole channels (durov, @telegram, https://t.me/nytimes), paste single posts (https://t.me/durov/528), or look for words inside every channel you list. The most used Telegram posts scraper takes channels and post links, and its search field only looks up one channel handle.
  • Keywords that go past Telegram's own search. Telegram's search inside a channel stops after about twenty matches: for bitcoin in Cointelegraph it returned 20 posts in our test. This actor then reads the older posts and keeps the ones that say bitcoin: 40 posts for Cointelegraph, 47 with Pavel Durov's channel, in 11 seconds. With a date range it goes straight to that period: 15 bitcoin posts from March 2025 in 16 seconds.

Try Telegram Posts Scraper free

Try your first 40 posts

Paste this input in the Input tab, or keep the prefilled form, and press Start:

{
"channelUsernames": ["durov", "nytimes"],
"maxItems": 20
}

You get 20 posts from Pavel Durov's channel and 20 from The New York Times, newest first, each with its text, views, reactions, media, links and date, and each channel's exact subscriber count. Our run took 3 seconds. Swap the usernames for the channels you follow, raise maxItems to go further back.

The Apify Free plan is enough to try it: no credit card, no Telegram account, no phone number, no API key.

How it works

SilentFlow · Telegram suite
  Telegram Scraper
Channel Posts, Views and
Telegram Posts Scraper
You are here

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the Telegram Posts Scraper on Apify: silentflow/telegram-posts-scraper
It reads public Telegram channel posts from t.me, without any Telegram account.
Input (no field is required):
- channelUsernames (array of strings): public channels, as a username (durov), an @handle or a link (https://t.me/nytimes)
- postUrls (array of strings): single post links (https://t.me/durov/528); search links (https://t.me/s/cointelegraph?q=ETF) and channel links also work
- keywords (array of strings): words looked for inside every channel of channelUsernames; Telegram's search first, then older posts whose text contains the word
- maxItems (integer, default 100): max posts per channel and per keyword search; post links always return their post
- oldestPostDate (string): keep posts published after this date, "2026-09-01" or "7 days"
- newestPostDate (string): keep posts published before this date, the day included, "2025-03-31" or "1 year"
- minViews (integer, default 0): skip posts with fewer views
- includeComments (boolean, default false): add commentsCount and latestComments (5 latest) to each post, about one second more per post
- debugMode (boolean, default false)
Output: one row per post, 47 fields, flat:
- id (string, "channel/messageId"), url (string), messageId (integer)
- text (string|null), mediaType (text, photo, album, video, voice, audio, document, sticker, poll, location, link)
- links, hashtags, mentions (arrays of strings)
- isEdited, isForwarded, isReply (booleans), forwardedFrom, forwardedFromUrl, replyToUrl, replyToText (string|null)
- author (string|null, the post signature)
- channelUsername, channelTitle, channelUrl, channelId (integer), channelDescription, channelPhotoUrl, channelIsVerified (boolean)
- views (integer), reactions (array of {emoji, emojiId, count, isPaid}), reactionsCount (integer), commentsCount (integer|null)
- channelSubscribers (exact integer), channelPhotos, channelVideos, channelFiles, channelLinks (integers|null)
- date (RFC 3339 UTC)
- imageUrls, videoUrls (arrays), videoThumbnailUrl, videoDuration (seconds), documentTitle
- linkPreviewUrl, linkPreviewSiteName, linkPreviewTitle, linkPreviewDescription, linkPreviewImageUrl
- latestComments (array of {id, url, author, authorUrl, text, date, replyToId} | null)
- foundBy (channel, search or post), searchKeyword (string|null), scrapedAt (RFC 3339)
Use apify-client for Python or JavaScript, or the Apify API.

How to scrape Telegram posts

Three inputs, from the simplest to a full research query. Each one runs as is.

Export the latest posts of a channel

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

One row per post, newest first, with views, reactions, media and links. A channel of 100 posts takes a few seconds.

Turn post links into full rows with their comments

{
"postUrls": [
"https://t.me/durov/528",
"https://t.me/tginfo/4445",
"https://t.me/telegram/441"
],
"includeComments": true
}

Each link becomes a row with the post's text, views, reactions, media and date, plus its exact comment count and 5 latest comments when the channel has comments turned on.

Get the bitcoin posts of March 2025 in a crypto channel

{
"channelUsernames": ["cointelegraph"],
"keywords": ["bitcoin"],
"oldestPostDate": "2025-03-01",
"newestPostDate": "2025-03-31",
"maxItems": 50
}

The run goes straight to March 2025 and keeps the posts that mention bitcoin. Our test with maxItems at 15 returned 15 posts from 24 to 31 March 2025 in 16 seconds.

Input parameters

FieldTypeDefaultWhat it does
channelUsernameslist of textprefilled durov, nytimesPublic channels to read, newest post first
postUrlslist of textemptySingle posts, one row each; search and channel links work too
keywordslist of textemptyWords looked for inside every channel of channelUsernames
maxItemsinteger100Max posts per channel and per keyword search
oldestPostDatedate or ageemptyKeep posts published after this date
newestPostDatedate or ageemptyKeep posts published before this date, the day included
minViewsinteger0Skip posts seen fewer times
includeCommentsyes or nonoAdd the comment count and 5 latest comments of each post
debugModeyes or nonoDetailed logs

No field is required. An empty input stops at once with a message that says what to add.

Formats accepted for channels: a username (durov), an @handle (@telegram), a channel link (https://t.me/nytimes), its web preview (https://t.me/s/nytimes), telegram.me links, and tg://resolve?domain=durov links.

Formats accepted for posts: https://t.me/durov/528, t.me/durov/528, https://t.me/s/durov/528 and tg://resolve?domain=durov&post=528. A link to one photo of an album returns the whole album as one row.

Formats accepted for dates: a day (2025-03-31), a full timestamp (2025-03-31T18:00:00Z) or an age (12 hours, 7 days, 2 weeks, 1 month, 1 year).

What is skipped: groups, private chats, bots and invite links (t.me/+..., t.me/c/...) have no public posts on the web. They are named in the log, and the rest of the input runs.

What data can you extract from Telegram?

Each row is one post, with 47 fields in seven groups:

GroupFields
Identity (3)id, url, messageId
Content (12)text, mediaType, links, hashtags, mentions, isEdited, isForwarded, forwardedFrom, forwardedFromUrl, isReply, replyToUrl, replyToText
Author and channel (8)author, channelUsername, channelTitle, channelUrl, channelId, channelDescription, channelPhotoUrl, channelIsVerified
Measures (9)views, reactions, reactionsCount, commentsCount, channelSubscribers, channelPhotos, channelVideos, channelFiles, channelLinks
Time (1)date
Media, links and comments (11)imageUrls, videoUrls, videoThumbnailUrl, videoDuration, documentTitle, linkPreviewUrl, linkPreviewSiteName, linkPreviewTitle, linkPreviewDescription, linkPreviewImageUrl, latestComments
Meta (3)foundBy, searchKeyword, scrapedAt

Each reaction carries 4 fields (emoji, emojiId for custom emoji, count, isPaid for star reactions). Each comment in latestComments carries 7 (id, url, author, authorUrl, text, date, replyToId).

A few facts that help you use the data:

  • id (nytimes/3615) and url (https://t.me/nytimes/3615) are permanent: use them to join runs and remove repeats.
  • views is the number Telegram shows, so a large one is rounded the way the app rounds it (1.98M becomes 1980000). channelSubscribers is exact (10,126,263 for durov on 5 November 2026).
  • date and scrapedAt are RFC 3339 in UTC.
  • Photo and video links point to Telegram's media servers. They work for a while after the run, not forever: download the files you want to keep.
  • An absent value is null, never an empty string. A field that does not apply to a post stays null (forwardedFrom on a post that is not a forward).
  • commentsCount and latestComments stay null unless you turn on comments, and for channels whose posts have no comments.

Output example

A real row from the default run (long media links shortened):

{
"id": "nytimes/3615",
"url": "https://t.me/nytimes/3615",
"messageId": 3615,
"text": "Here are some of the stories we are covering from around the world:\n\nIsrael Advances in Lebanon and Seizes More Land, as Hezbollah Fight Escalates\n\n...\n\n@nytimes",
"mediaType": "video",
"links": ["https://nyti.ms/4sshBRX", "https://nyti.ms/40GacCx", "https://nyti.ms/4blf4TJ"],
"hashtags": [],
"mentions": ["nytimes"],
"isEdited": false,
"isForwarded": false,
"forwardedFrom": null,
"forwardedFromUrl": null,
"isReply": false,
"replyToUrl": null,
"replyToText": null,
"author": null,
"channelUsername": "nytimes",
"channelTitle": "The New York Times",
"channelUrl": "https://t.me/nytimes",
"channelId": 1606432449,
"channelDescription": "New York Times coverage from around the world, including the Russia-Ukraine war. Get the latest at https://www.nytimes.com/world",
"channelPhotoUrl": "https://cdn1.telesco.pe/file/Ze4fcZT_7DA48Hg5N0hZ...jpg",
"channelIsVerified": true,
"views": 131000,
"reactions": [
{ "emoji": "❤", "emojiId": null, "count": 303, "isPaid": false },
{ "emoji": "👍", "emojiId": null, "count": 149, "isPaid": false },
{ "emoji": "👎", "emojiId": null, "count": 147, "isPaid": false },
{ "emoji": "🤔", "emojiId": null, "count": 104, "isPaid": false },
{ "emoji": "😢", "emojiId": null, "count": 73, "isPaid": false }
],
"reactionsCount": 776,
"commentsCount": null,
"channelSubscribers": 188598,
"channelPhotos": 3320,
"channelVideos": 165,
"channelFiles": null,
"channelLinks": 2800,
"date": "2026-03-03T21:03:03Z",
"imageUrls": [],
"videoUrls": ["https://cdn4.telesco.pe/file/51b07e8bc4.mp4?token=OeN78cw6BV..."],
"videoThumbnailUrl": "https://cdn4.telesco.pe/file/mhg5HkekgsClWa-IjqVpie8...",
"videoDuration": 70,
"documentTitle": null,
"linkPreviewUrl": null,
"linkPreviewSiteName": null,
"linkPreviewTitle": null,
"linkPreviewDescription": null,
"linkPreviewImageUrl": null,
"latestComments": null,
"foundBy": "channel",
"searchKeyword": null,
"scrapedAt": "2026-11-05T03:47:04Z"
}

With includeComments on, the comment fields of a post from the tginfo channel looked like this in our run (2 of its 5 latest comments shown):

{
"commentsCount": 43,
"latestComments": [
{
"id": 1837842,
"url": "https://t.me/tginfo/4447?comment=1837842",
"author": "ₖᵢbₑᵣ.ᵢₒ",
"authorUrl": null,
"text": "Прочитай конец своего же предложения 😊",
"date": "2026-11-04T12:05:42Z",
"replyToId": 1837841
},
{
"id": 1837845,
"url": "https://t.me/tginfo/4447?comment=1837845",
"author": "DJ TORN@DO 🌪",
"authorUrl": "https://t.me/diskjockey_tornado",
"text": "Дуров, сделай возможность бесплатно изменить порядок аккаунтов в меню...",
"date": "2026-11-04T16:20:16Z",
"replyToId": null
}
]
}

Advanced usage

Keep only the posts that took off

{
"channelUsernames": ["durov", "telegram"],
"oldestPostDate": "2024-01-01",
"newestPostDate": "2024-12-31",
"minViews": 3000000,
"maxItems": 30
}

The posts of 2024 seen at least 3 million times. Our run returned 60 posts (30 per channel) in 12 seconds and skipped 11 below the floor. With a very high floor, each channel stops after checking 1,000 posts so a run never reads a whole archive for nothing.

Run a daily digest on a schedule

{
"channelUsernames": ["cointelegraph", "binance_announcements", "whale_alert_io", "tginfo"],
"oldestPostDate": "1 day",
"maxItems": 200
}

Save it as a task and schedule it every morning: each run returns only what was posted in the last 24 hours, then stops reading each channel at the first older post.

Measure engagement per post, comments included

{
"channelUsernames": ["tginfo", "cointelegraph"],
"maxItems": 30,
"includeComments": true
}

Views, reactions and the exact comment count side by side, plus the 5 latest comments of each post. Open the Engagement view of the dataset to compare them with the channel's subscriber count. Expect about one second more per post: in our test, 21 posts with their comments took 23 seconds.

Track a ticker beyond Telegram's latest matches

{
"channelUsernames": ["cointelegraph", "durov"],
"keywords": ["bitcoin", "ETF"],
"maxItems": 40
}

One search per channel and keyword. Each row keeps the keyword that found it in searchKeyword. In our run, bitcoin alone returned 40 posts for Cointelegraph where Telegram's own search stopped at 20.

Paste a search you made in the browser

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

A search link from a channel's web page runs as a keyword search inside that channel, the same way as the keywords field.

FAQ

What does this scraper extract? One row per public Telegram post: text, media type, links, hashtags, mentions, views, every reaction with its count, the post signature, the edited, forwarded and reply details, photos, videos, link previews and the date. Every row also carries the channel's title, description, photo, verified badge and exact subscriber count. Comments are added on request.

Do I need a Telegram account, a phone number or an API key? No. The scraper reads the public web pages of channels on t.me. No login, no phone number, no API id.

What is Telegram? Telegram (Телеграм) is a messaging app with more than a billion users, where public channels broadcast posts to their subscribers, like a feed that anyone can follow. News outlets, crypto exchanges, brands and public figures run channels with millions of subscribers. Russian speakers looking for a "Парсер постов Телеграм" (Telegram posts parser) are in the right place.

Can I get posts from a specific period? Yes. Set oldestPostDate and newestPostDate, for example 2025-03-01 and 2025-03-31 for March 2025, the last day included. The run goes straight to that period instead of reading every newer post first: in our test it reached March 2025 in Cointelegraph, whose latest post is number 73,063, with 15 pages instead of about 700.

How deep does keyword search go? Telegram's own search inside a channel returns about the twenty latest matches. When it stops, the scraper reads older posts and keeps the ones whose text, link preview or file name contains your word, until maxItems is reached. With a rare word, each channel stops after checking 1,000 posts (or 20 times maxItems if higher). Telegram's own search can also return a post where the word is not in the visible text (1 of its 20 bitcoin matches in our test); the older posts are kept only when the word itself appears.

Can I scrape groups, private channels or members? No. Only public channels have public posts on the web. Groups, private chats, bots and invite links are skipped and named in the log; the rest of the input runs.

How fresh is the data? Live. Every run reads the pages at run time: views and reactions are the numbers of that moment, and a post edited a minute ago shows its new text.

Are the view counts exact? Views are the numbers Telegram displays, so large ones are rounded the way the app rounds them (1.98M becomes 1980000). The subscriber count is exact, read from the channel's page (10,126,263 for durov, not 10.1M).

Can I scrape several channels and keywords in one run? Yes. List as many channels, post links and keywords as you need. maxItems applies to each channel and to each keyword search, and a post found twice is delivered once.

Why is commentsCount empty for some channels? Comments exist only when a channel links a discussion group. Pavel Durov's channel, for example, has none. When three posts in a row of a channel have no comments, the scraper stops asking for that channel and leaves the fields at null.

Do the photo and video links last? The post link (url) is permanent. Photo and video links point to Telegram's media servers and stop working after a while: download the files during or soon after the run if you need to keep them.

More SilentFlow scrapers

🛒 E-commerce

💼 Jobs

🏠 Real estate

📣 Social media

🏢 Business data

✈️ Travel

🎯 Lead generation

🔎 SEO

🎬 Video

📰 News

🧰 More tools

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 pages 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), comment authors 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 Posts Scraper by SilentFlow: public posts with their views, reactions and comments, for any period.