Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

Pay per usage

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

Telegram channel scraper that exports public posts with views, reactions, and media, plus subscriber counts, so you can monitor t.me channels without a login or a bot token.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

BigiByte

BigiByte

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Categories

Share

Telegram Channel Scraper: Export Public Posts, Views, and Reactions

This Telegram scraper reads public channels from the web preview at t.me/s/{channel} and saves posts, views, reactions, and channel details. You can download JSON, CSV, or Excel, or send the dataset to Google Sheets, Make, Zapier, or n8n. There is no login, no bot token, and no Telegram API key.

It only sees what Telegram shows on the public preview. Private channels, invite links, and channels that have turned the preview off (BBC News and Reuters, for example) do not return posts.

Use cases

  • News and crypto monitoring: keep the text, view count, and reactions from a list of public channels.
  • Brand mentions: search inside a channel with searchQuery, then page back through older hits.
  • OSINT and research: export forwards, reply links, and dates without opening Telegram.
  • Competitor channels: store subscriber counts from the public landing page and rerun them on a schedule.
  • Content and AI datasets: save post text as plain text, Markdown, or HTML, with the photo and video URLs Telegram embeds.

How to run it

  1. Choose posts, a single post URL, or channel info.
  2. Paste usernames (durov, @durov), channel links (https://t.me/durov, https://t.me/s/durov), or post links (https://t.me/durov/400).
  3. Set a max result count. The free cap is 2,000 rows per run.
  4. Start the run and export the dataset.

A bad username does not stop the run. The actor writes an error row and moves on.

Input

ParameterTypeDefaultDescription
modestringpostsposts, post_details, or channel_info.
channelsstring[]durov, telegramUsernames, t.me links, or post URLs.
searchQuerystringemptyOptional keyword. Telegram's preview search (?q=).
dateFromstringemptyYYYY-MM-DD. Paging stops once posts are older than this date.
dateTostringemptyYYYY-MM-DD. Newer posts are skipped.
includeChannelInfobooleanfalseAdd the channel object onto each post.
includeServiceMessagesbooleanfalseKeep service messages such as "channel created".
textFormatstringtexttext, markdown, or html.
maxItemsinteger100Cap for the whole run. Maximum 2000.
maxPostsPerChannelinteger100Cap for each channel.
maxConcurrencyinteger5Simultaneous requests. Maximum 5.
timeoutSecsinteger300Stop after this many seconds and keep rows already saved.
requestTimeoutSecsinteger30Per-request timeout.
proxyConfigurationobjectNo proxyOptional Apify proxy. Leave it off unless you hit 429 or 403.

Posts

{
"mode": "posts",
"channels": ["durov", "https://t.me/s/telegram"],
"maxItems": 100,
"maxPostsPerChannel": 40
}

One post

{
"mode": "post_details",
"channels": ["https://t.me/durov/400"],
"textFormat": "markdown"
}

Channel info

{
"mode": "channel_info",
"channels": ["durov", "@telegram", "https://t.me/cnnbrk"]
}

What data does this actor extract?

Every row has mode, scrapedAt, and sourceInput. Failures use error and statusCode. Codes: PREVIEW_DISABLED, NOT_FOUND, PRIVATE_NOT_SUPPORTED, HTTP_<code>, PARSE_ERROR, INVALID_INPUT.

The channel table uses channelTitle and channelDescription because Apify's dataset schema rejects the field names title and description. The JSON row still includes title and description with the same values. Link previews keep their own title and description inside linkPreview.

View and reaction numbers are parsed from labels such as 5.79M and 54.6K. Those parsed values are rounded. viewsRaw, countRaw, and subscribersRaw keep the original text.

Posts

{
"mode": "posts",
"postId": 531,
"channel": "durov",
"url": "https://t.me/durov/531",
"date": "2026-07-16T20:45:25+00:00",
"text": "Telegram now has a Rich Text Editor.",
"views": 5790000,
"viewsRaw": "5.79M",
"authorSignature": "Pavel Durov",
"isForwarded": false,
"photos": [],
"videos": [{"thumbnailUrl": "https://cdn4.telesco.pe/file/example", "videoUrl": "https://cdn4.telesco.pe/file/example.mp4?token=..."}],
"reactions": [{"emoji": null, "emojiId": "5265077361648368841", "count": 54600, "countRaw": "54.6K", "isPaid": false}],
"isService": false,
"sourceInput": "durov"
}
FieldTypeDescription
postId, channel, url, dateinteger, string, string, stringMessage id, username, permalink, and the datetime Telegram prints.
text, textHtmlstringText in the format you chose, plus the HTML. Custom emoji keep the inner character.
views, viewsRawinteger, stringParsed views and the original label.
authorSignaturestringSigned author, when the post has one.
isForwarded, forwardedFromName, forwardedFromUrlboolean, string, stringForward label and the source message link.
replyToUrlstringThe message this post replies to.
links, photosstring[]Links in the text, and photo URLs from background-image.
videosobject[]thumbnailUrl and videoUrl. The file URL is a temporary token. It expires.
isAlbumbooleanGrouped photo or video post.
linkPreviewobjecturl, siteName, title, description, imageUrl.
reactions, totalReactionsobject[], integerEmoji or custom emoji id, parsed count, raw count, and whether it is a paid star reaction.
isServicebooleanService message. Skipped unless you opt in.
channelInfoobjectPresent when includeChannelInfo is on.

Channels

{
"mode": "channel_info",
"channel": "durov",
"url": "https://t.me/durov",
"title": "Pavel Durov",
"channelTitle": "Pavel Durov",
"description": "Founder of Telegram.",
"isVerified": true,
"subscribers": 10428980,
"subscribersRaw": "10 428 980 subscribers",
"photosCount": 102,
"videosCount": 47,
"linksCount": 200,
"previewEnabled": true
}
FieldTypeDescription
channel, url, title, channelTitlestringUsername, public URL, and display name.
description, channelDescriptionstringThe public description.
photoUrl, isVerifiedstring, booleanPhoto and the verified badge.
subscribers, subscribersRawinteger, stringExact count from the landing page when Telegram prints one, otherwise the compact counter from the preview.
photosCount, videosCount, filesCount, linksCountintegerCounters from the preview header. Empty when the preview is off.
previewEnabledbooleanTrue when t.me/s/{channel} returns posts.
lastPostId, lastPostDateinteger, stringNewest post on the first preview page.

Limits and notes

  • 2,000 results per run. maxItems stops the run once that many rows are stored. Duplicate post ids are skipped.
  • Each preview page has about 20 posts. The actor follows rel="prev" (?before=) toward older posts.
  • Channels with the web preview disabled, such as bbcnews and reuters, return PREVIEW_DISABLED in posts mode. Channel info still uses the public landing page, which may have a title and subscriber count or almost nothing.
  • A username that redirects to telegram.org, such as wsj when this was checked, returns NOT_FOUND.
  • Invite links (t.me/+..., joinchat) return PRIVATE_NOT_SUPPORTED.
  • Video file URLs include a token and expire. Save the file during the run if you need the bytes later.
  • Subscriber figures are whatever Telegram prints in public. A landing page count like 10 429 228 subscribers is exact. A header label like 10.4M is already rounded by Telegram, and parsing it keeps that rounding.
  • This is not an official Telegram product. Use it within Telegram's terms. It does not log in and it does not join private chats.

FAQ

Does this use the Telegram API?

No. It downloads the public web preview at https://t.me/s/{channel} and the channel landing page at https://t.me/{channel}. You do not need an API id, a bot token, or a logged-in session.

How far back can a Telegram channel scraper go?

It pages with ?before={postId} until Telegram stops offering an older page, the post id reaches 1, your date filter hits, or the result cap is full. Channels with a long history can take many requests. maxPostsPerChannel is there for that.

Can it scrape groups or private channels?

No. Public channels with the web preview on are the supported case. Private invites are rejected. If the preview is off, post text is not on the public page.

Why is the view count not exact?

Telegram prints compact labels such as 5.79M on the preview. The actor stores that string in viewsRaw and a parsed integer in views. 5.79M becomes 5790000, which is the label times one million, not a secret exact counter.

Do the photo and video URLs keep working?

Photo URLs from the preview are plain CDN links. Video src URLs carry a token and expire, so a later download can 404 even though the post row is fine.

A Substack newsletter scraper is the usual pair if you are tracking writers who post in both places. For a large channel list, alerts, or a pipeline that stores media before the video token expires, that is a different job than this actor.

Need monitoring of hundreds of channels, alerts, or a custom pipeline? BigiByte builds custom scrapers and APIs: https://bigibyte.com

Trademark Notice

Telegram and related names, logos, and trademarks belong to their respective owners. Their use in this documentation is solely to identify the source of the data and does not imply affiliation, sponsorship, endorsement, or partnership.

Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, sponsored by, or otherwise officially associated with Telegram.

Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.

This actor reads public pages or official public APIs. It does not log in and it does not bypass access controls.

This is not legal advice. For the longer explanation, see Apify's article Is web scraping legal?.