Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

$1.10 / 1,000 messages

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

Export posts from any public Telegram channel without an account or bot token. Get message text, publish time, view counts, full reaction breakdowns, media URLs, links and hashtags. Search inside channels by keyword and filter by date range.

Pricing

$1.10 / 1,000 messages

Rating

0.0

(0)

Developer

Crikit

Crikit

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

What is Telegram Channel Scraper?

Telegram Channel Scraper lets you export the full post history of any public Telegram channel, helping you track competitors, monitor breaking news and crypto calls, measure which posts actually travel, and build datasets nobody else has.

No API key. No phone number. No Telegram account. You paste a channel name and get structured rows.

  • Monitor channels at scale: pass a list of channels and export all of them in one run, with per-channel caps so one busy feed cannot eat the whole budget.
  • Find the posts that matter: search inside a channel by keyword using Telegram's own index, instead of downloading a year of history and grepping it yourself.
  • Measure real reach: every row carries the view count, the full reaction breakdown emoji by emoji, and a computed reactions-per-view rate you can sort on.
  • Pull a clean date range: set a start date, an end date, or both, and get exactly that window.
  • Feed a pipeline: media URLs, link previews, outbound links, hashtags and @mentions arrive as separate fields, already split out.

The official Telegram Bot API cannot read a channel your bot is not an admin of, and the client APIs need a phone number and a logged-in session. This Actor reads the public web preview Telegram publishes for every public channel, so there is nothing to authenticate and nothing to get banned.

What data does Telegram Channel Scraper extract?

Per message

  • ๐Ÿ†” Message ID and permalink (messageId, messageUrl)
  • ๐Ÿ•’ Exact publish timestamp in ISO 8601 (postedAt)
  • ๐Ÿ“ Full message text with line breaks preserved, plus its length (text, textLength)
  • ๐Ÿ‘ View count, expanded from Telegram's "79.4K" to a real integer (views)
  • โค๏ธ Every reaction, emoji by emoji, with counts (reactions, totalReactions)
  • ๐Ÿ“ˆ Reactions per view, computed (engagementRate)
  • ๐Ÿ–ผ Media type, count, and direct URLs for photos, videos, documents, voice notes and stickers (mediaType, media)
  • ๐Ÿ”— Link preview title, description, site name and image (linkPreviewTitle, linkPreviewUrl)
  • ๐ŸŒ Every outbound link in the post (links)
  • #๏ธโƒฃ Hashtags and @mentions, taken from Telegram's own linkification rather than a regex (hashtags, mentions)
  • โ†ฉ๏ธ Reply target, its author and the quoted text (replyToMessageUrl, replyToAuthor, replyToText)
  • โžก๏ธ Forward source and its link (forwardedFrom, forwardedFromUrl)
  • ๐Ÿ“Š Poll question, options and percentages (poll)
  • โœ๏ธ Edited flag and author signature (isEdited, authorSignature)

Per channel, attached to every row

  • ๐Ÿ“› Channel title, @username and URL (channelTitle, channelUsername)
  • ๐Ÿ‘ฅ Subscriber count as an integer (channelSubscribers)
  • โœ… Verified badge (channelIsVerified)
  • ๐Ÿ“„ Channel description and avatar URL
  • ๐Ÿ“ท Lifetime photo, video and link counts (channelPhotosCount, channelVideosCount, channelLinksCount)

Channel fields are copied onto every message row on purpose, so a CSV export is usable in a spreadsheet without a join.

How to use Telegram Channel Scraper

  1. Enter one or more channels. A username (durov), an @handle (@durov) or any t.me link works, including a link to a single message.
  2. Optionally type a keyword in Keyword to search for inside the channels to return only matching posts.
  3. Optionally set From date and To date to limit the window.
  4. Set Max messages, then click Start.
  5. Export to JSON, CSV or Excel, or pull the dataset from the API.

Input

{
"channels": ["durov", "@telegram", "https://t.me/bloomberg"],
"searchQuery": "inflation",
"fromDate": "2026-01-01",
"toDate": "2026-06-30",
"maxItems": 500,
"maxMessagesPerChannel": 200,
"proxyConfiguration": { "useApifyProxy": true }
}
FieldTypeNotes
channelsarrayRequired. At least one public channel.
searchQuerystringOptional. Uses Telegram's in-channel search.
fromDate / toDatestringOptional, YYYY-MM-DD. toDate includes the whole day.
maxItemsintegerTotal cap across every channel. 0 means no limit.
maxMessagesPerChannelintegerOptional per-channel cap.
proxyConfigurationobjectApify datacenter proxy is enough. Leave the group unset.

Output

One row per message, newest first.

{
"channelUsername": "durov",
"channelTitle": "Pavel Durov",
"channelSubscribers": 10900000,
"channelIsVerified": true,
"messageId": 546,
"messageUrl": "https://t.me/durov/546",
"postedAt": "2026-08-31T16:30:15+00:00",
"text": "Gram Wallet in Telegram is ready and is now accessible to a select group of users.\n\nWe'll be gradually rolling it out to our billion+ users over the next couple of weeks.",
"textLength": 406,
"views": 1300000,
"reactions": [
{ "emoji": "๐Ÿ‘", "count": 56000 },
{ "emoji": "โค", "count": 41000 }
],
"totalReactions": 97000,
"engagementRate": 0.074615,
"mediaType": "photo",
"media": [{ "type": "photo", "url": "https://cdn5.telesco.pe/file/..." }],
"links": ["https://telegram.org/blog/wallet"],
"hashtags": [],
"isEdited": false,
"scrapedAt": "2026-09-02T13:58:04.221Z"
}

The Overview table view shows channel, publish time, message, views, reactions, media type and link. A second Engagement view swaps in subscriber count and the reactions-per-view rate for reach analysis.

How much does it cost to scrape Telegram?

A flat $1.10 per 1,000 messages. One price, every message, no tiers and no separate charge for starting a run.

MessagesCost
1,000$1.10
10,000$11.00
100,000$110.00

The cheapest comparable Telegram scraper on the Store charges $2.00 per 1,000 messages plus a per-run start fee. This one is about 45% cheaper and has no start fee.

Measured coverage

Measured across 386 messages from 5 channels (durov, durov_russia, telegram, bloomberg, tginfo), run through the Apify datacenter proxy.

FieldCoverageNotes
messageId, messageUrl, postedAt100%Guaranteed on every row
channelTitle, channelSubscribers100%Guaranteed on every row
views99.5%Telegram omits the counter on a small number of posts
text98.4%Media-only posts have no caption
totalReactions100%0 when a channel has reactions disabled
media48.7%Present only on posts that carry media
links57.5%Present only on posts that link out
linkPreviewUrl16.8%Present only when Telegram rendered a preview card
hashtags10.1%Varies enormously by channel
replyToText3.1%Present only on replies
forwardedFrom0.3%Present only on forwards

Conditional fields are low by nature, not by failure. A post with no link cannot have a link.

Limits

  • Public broadcast channels only. Telegram publishes a web preview for public channels. Private channels, groups, and channels whose owner disabled the preview cannot be read without a logged-in account, and this Actor will not ask you for one. Those inputs come back as an explanatory row rather than a failed run.
  • Reactions are the aggregate only. Telegram's public preview shows how many people reacted with each emoji, not who they are.
  • No comment threads. Discussion-group comments under a post live in a separate linked group and are not part of the channel preview.
  • Views are rounded above 1,000. Telegram itself publishes "79.4K", so the integer is 79,400. The original string is kept in viewsLabel so you can see the precision you actually have.
  • In-channel search is Telegram's own. It matches whole words and behaves like the search box in the app.
  • No message deletion history. Deleted posts are gone from the preview and cannot be recovered.

FAQ

This Actor reads only the public web preview that Telegram itself publishes at t.me/s/<channel> for public broadcast channels. That page is served without a login, is indexed by search engines, and is intended to be publicly readable. No account, cookie or credential is used, and no private chat, group or direct message is accessible. Channel posts are public broadcasts rather than personal correspondence. You remain responsible for how you use the data, including under GDPR and any local rules that apply to you.

Do I need a Telegram account or a bot token?

No. That is the point. The Bot API cannot read a channel your bot does not administer, and the client APIs require a phone number. This Actor needs neither.

Can I use Telegram Channel Scraper as an API?

Yes. Every Actor on Apify is callable over REST. See the Apify API docs and the API tab on this Actor's page for ready-made snippets.

Can I use this in Python?

Yes, with apify-client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("cirkit/telegram-channel-scraper").call(
run_input={"channels": ["durov"], "maxItems": 100}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["postedAt"], item["views"], item["text"])

Can I integrate Telegram Channel Scraper with other apps?

Yes. Apify connects to Zapier, Make, n8n, Slack, Google Sheets, Airtable and plain webhooks, so a run can push new posts straight into a sheet or a channel alert.

How do I schedule Telegram Channel Scraper to run automatically?

Use Schedules in Apify Console to run it hourly or daily. Pair it with fromDate set to the last run, or a small maxItems, to keep incremental runs cheap.

Why did I get fewer results than expected?

Most often the channel has less visible history than you assumed, or your date range does not overlap it. Other causes: maxMessagesPerChannel capped the channel before maxItems did, a keyword matched fewer posts than you expected, or the channel has no public preview at all. The run log names which one happened, and a run that finds nothing writes a single row explaining why rather than failing.

What happens if a channel is private or does not exist?

The run still succeeds and writes one row with isNoResults: true and a noResultsReason explaining that Telegram publishes no preview for it. A scheduled job then sees a clear reason instead of a failed run.

Can I get a field that is not listed?

If it appears on the public channel page, probably. Open an issue on the Actor's Issues tab and describe the field.

How far back can it go?

To the start of the channel's visible history. Long-running channels regularly return thousands of posts; set maxItems to 0 and a fromDate to control how deep it goes.

You might also like

Changelog

0.1 - 2026-09-02 - First release. Multi-channel export, in-channel keyword search, date range filtering, full reaction breakdown, media and link extraction.