Telegram Channel Scraper
Pricing
from $2.50 / 1,000 post returneds
Telegram Channel Scraper
Scrape posts from public Telegram channels by keyword, with views, reactions and reposts deduplicated. No login, no API key, no Telethon.
Pricing
from $2.50 / 1,000 post returneds
Rating
0.0
(0)
Developer
Stanislav Shupilkin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Scrape any public Telegram channel by keyword — no login, no phone number, no API key. Point this Actor at one or more public channels and it returns their posts as clean structured rows: text, views, reactions, media, post date and a direct t.me link. Add a keyword and it uses Telegram's own built-in per-channel search to return only matching posts, scored by relevance.
It reads Telegram's public web preview (https://t.me/s/<channel>) — the same page Telegram serves to a logged-out browser. No Telegram account, no Telethon, no MTProto, no headless browser. Channel names in, structured posts out.
What you can do with it
- Keyword monitoring — track a brand, ticker, product or topic across dozens of channels and get back only the posts that mention it, newest and most relevant first.
- Lead and signal generation — scrape channels where people post offers, jobs or "looking for X", then filter by views and reactions to keep only the posts that got traction.
- Content and trend research — pull a channel's recent posts with engagement numbers attached and feed them straight into your own analysis, LLM or spreadsheet.
- OSINT and news monitoring — collect public channel output at scale without an account tied to your phone number, with reposts collapsed so you read each story once.
- Dataset building — export thousands of posts as JSON, CSV or Excel to train, benchmark or archive.
Output fields
One dataset row is one post. Every row carries:
| Field | Type | What it is |
|---|---|---|
channel | string | Channel username the post came from |
message_id | integer | Telegram message id |
url | string | Direct t.me/<channel>/<message_id> link |
date | string | When it was posted, ISO 8601 UTC |
text | string | The post text, HTML stripped and unescaped |
views | integer | View count as a number (1.38M → 1380000), or null if hidden |
reactions | integer | Total reactions across every emoji, including paid star reactions |
reactions_by_emoji | object | Per-emoji breakdown, e.g. {"❤": 231, "🔥": 88, "⭐": 4} |
media | array | Media on the post: type (voice, round_video, video, document), url, duration_sec, title |
is_repost | boolean | true on a post detected as a near-identical repost of another |
duplicate_of | string | On a repost, the t.me link of the original it copies |
relevance_score | number | Keyword relevance (BM25) when a search query is set, otherwise null |
Example output
{"channel": "telegram","message_id": 441,"url": "https://t.me/telegram/441","date": "2026-05-14T16:08:31+00:00","text": "Bot-to-Bot Communication is here — bots can now talk to each other.","views": 1380000,"reactions": 342,"reactions_by_emoji": { "❤": 231, "🔥": 88, "⭐": 23 },"media": [],"is_repost": false,"duplicate_of": null,"relevance_score": null}
How to scrape a Telegram channel
- Paste one or more public channels into Telegram channels —
@durov,t.me/durovandhttps://t.me/durovall point at the same channel and all work. - Optionally type a keyword search to scrape only posts that match it, using Telegram's own in-channel search.
- Optionally set a date range, a minimum view count, or a minimum number of reactions under Filters.
- Run it. Rows stream into the dataset, then near-identical reposts are collapsed at the end.
Input options
| Field | What it does | Default |
|---|---|---|
channels | Public channels to scrape (@name, t.me/name or a full link) | required |
query | Keyword — scrape only matching posts via Telegram's per-channel search | none |
since / until | Only posts inside this date range (YYYY-MM-DD) | no limit |
minViews | Drop posts below this view count (posts hiding views are dropped) | none |
minReactions | Drop posts below this total reaction count | none |
maxPostsPerChannel | How many recent (or matching) posts to scan per channel | 100 |
maxResults | Hard cap on unique posts across all channels | no cap |
dedupeReposts | Collapse near-identical reposts into one original | true |
Pricing: pay per event
You are charged for results, not for runtime:
| Event | Price |
|---|---|
channel-searched — one channel fetched and scanned | $0.001 |
post-returned — one unique post returned | $0.0025 |
Scanning three channels and getting 200 unique posts back costs 3 × $0.001 + 200 × $0.0025 = $0.503. Reposts are free — you pay once for the original, whether the repost is collapsed away or kept as a flagged row. A dead or private channel, a search that returns nothing, and posts removed by your filters are not charged.
If you set a maximum spend on the run, the Actor stops as soon as your limit is reached and finishes successfully with everything collected up to that point — you keep the partial dataset and pay nothing extra.
How it works
- It reads the public web preview,
https://t.me/s/<channel>— the same page a logged-out browser gets. No account, no phone number, no Telegram API, no headless browser. That is why only public channels are reachable. - Keyword search is Telegram's own. When you set a query, the Actor uses the channel's built-in
?q=search and pages through its results, so you get exactly what Telegram's own search would show — not a client-side text match on a handful of recent posts. - Reposts are detected by text, not by luck. Posts are shingled and compared (MinHash-style Jaccard) so copy-paste reposts across channels cluster together; the earliest post (or the most-viewed on a date tie) is kept as the original and the rest are collapsed or flagged.
- Relevance is ranked with BM25 over the run's own posts when a query is set — a cheap, CPU-only score, no LLM and no embeddings — so the most on-topic posts come first.
- Reactions are parsed in full, including custom and paid star reactions, into a total and a per-emoji breakdown.
Limits worth knowing before you run it
- Public channels only. Private channels, groups and DMs are not reachable without a Telegram account, and this Actor deliberately uses none.
- A channel that is missing, private or briefly unreachable is skipped, not fatal. The run logs a warning, moves on and finishes successfully with whatever it did collect — and you are not charged for it.
- Only what the preview shows. The web preview carries text, views, reactions, post date and media links. Comment threads, the full subscriber list and members are not part of it.
- Media links on Telegram's CDN are signed and expire, so download any media URLs during the same run.
- Reposts are matched on text. A repost that only shares an image or a forwarded media file, with different or no caption, is not treated as a text duplicate.
Keywords: telegram channel scraper, telegram scraper, telegram keyword search, scrape telegram posts, telegram channel export, telegram no login, telegram data scraper, telegram reactions, telegram views.