Telegram Channel Scraper - Messages, Views & Links, No Login
Pricing
from $2.00 / 1,000 results
Telegram Channel Scraper - Messages, Views & Links, No Login
Telegram OSINT scraper for any public channel via the t.me web preview - no API key, bot token, phone or login. Export Telegram channel messages and history: text, date, views, author, media type, links to CSV, JSON or Excel. Multiple channels, paginates history. Monitor crypto, news.
Pricing
from $2.00 / 1,000 results
Rating
5.0
(1)
Developer
Flash Scrape
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Pull messages from any public Telegram channel into a clean, structured dataset — no API key, no bot token, no phone number, no login. This actor reads the official Telegram web preview (t.me/s/<channel>), the same public page anyone can open in a browser, and turns each post into a row: message text, date, view count, author/signature, media type, and every link. It scrapes channel messages only — not group members (see What it does not do).
Copy-paste input — this is the whole configuration:
{"channels": ["telegram", "durov"],"maxItemsPerChannel": 50}
You get back one row per message with 10 columns (channel, message_id, message_url, text, date, views, author, media_type, has_links, links), exportable to CSV, JSON or Excel. Pricing is per message returned — $2 per 1,000 messages at the current rate (see cost).
What does it do?
Give it a list of public channel usernames or t.me links and how many recent messages you want per channel. The actor fetches each channel's public preview page, parses every post, and paginates backwards through the channel history to reach older messages until it hits your limit or the start of the channel. The result is a tidy, deduped, most-recent-first table — ready for a spreadsheet, a BI tool, or an LLM pipeline.
It reads public broadcast channels only — the kind that already show a public web preview. It does not log in, does not use a bot token, and cannot access private or invite-only channels or group chats. Because it uses plain HTTP against the public page, it runs fine on datacenter IPs with no proxy required.
Why use it / who's it for
- Crypto & DeFi researchers monitoring announcement, signal, and project channels — track calls, listings, and sentiment over time without babysitting the app.
- News & journalism teams archiving official channels from agencies, governments, and outlets that publish first (or only) on Telegram.
- OSINT & threat-intelligence analysts collecting public-channel posts into a searchable, timestamped dataset — including data-leak-monitoring and war-monitoring channels that publish only on Telegram.
- Community & competitor trackers watching a rival's or a niche's public channel — posting cadence, engagement (views), what links they push, what media they lean on.
- Data scientists & ML teams building text datasets from public broadcast channels for topic modeling, trend detection, or fine-tuning.
- Marketers & growth teams benchmarking which posts in a category get the most views, and mining the links a channel shares.
How do I export Telegram channel messages to CSV or Excel?
- Add one or more channels — usernames (
telegram),@handles(@durov), or full links (https://t.me/durov). All three formats are normalized automatically. - Set maxItemsPerChannel — how many of the most recent messages to pull from each channel (default 100, up to 1,000).
- Optionally paste a webhookUrl (Slack, Discord, n8n, Make, Zapier) to get a digest of the delivered messages the moment the run finishes — see Alerts.
- Run it. Then export the dataset to CSV, JSON, or Excel from the Output tab, or read it straight from the dataset API.
Everything has a default, channels included: a bare {} input scrapes the two demo channels (telegram, durov), so the "Try for free" run and an API call with an empty body both return rows. An explicitly empty channels list ends the run with a "supply channels" message and no charge.
Input
| Field | Type | Description |
|---|---|---|
channels | array of strings | Public channel usernames or t.me links. telegram, @durov, and https://t.me/durov all work. Defaults to ["telegram", "durov"] when left out entirely. Invite links (t.me/+...), t.me/c/... links and groups are rejected and named in the status message. |
maxItemsPerChannel | integer | Most-recent messages to pull per channel (default 100, max 1000). |
webhookUrl | string | Optional. Slack / Discord / n8n / Make / Zapier webhook that receives a digest when at least one message is delivered. Quiet runs send nothing. |
Output
One row per message:
| Field | Description |
|---|---|
channel | Channel username the message came from |
message_id | Numeric message id within the channel |
message_url | Direct link, https://t.me/<channel>/<id> |
text | Message text, with line breaks preserved |
date | Publish time (ISO 8601, UTC) |
views | View count as shown by Telegram (e.g. 1.18M, 907K) |
author | Post signature / author, when the channel signs posts |
media_type | photo, video, voice, audio, document, poll, sticker, location, link, or none |
has_links | true if the message text contains at least one link |
links | List of URLs found in the message text |
Example output row
{"channel": "telegram","message_id": 448,"message_url": "https://t.me/telegram/448","text": "AI Admins for Groups. Groups can now add AI bots as admins to process join requests with unique features like captcha support.","date": "2026-06-18T14:35:57+00:00","views": "1.06M","author": null,"media_type": "video","has_links": true,"links": ["https://t.me/telegram/449"]}
Alerts: get a Slack / Discord / webhook message when new rows land
Set webhookUrl and every run that delivers at least one message POSTs a digest there: a Slack incoming webhook gets a text message, a Discord webhook gets a message, and any other URL (an n8n / Make / Zapier catch hook, your own endpoint) gets JSON — {actor, delivered, run_url, dataset_url, rows[:20], text}. Each digest line is @channel date · views · text… url. Quiet runs (nothing delivered) send nothing. Pair it with an Apify Schedule and the actor becomes an alert service on its own; there is no only-new mode, so each run's digest carries the latest maxItemsPerChannel messages — dedupe by message_url downstream if you need "new since last time". Delivery is best-effort: a webhook that fails or answers non-2xx is reported in the run's status message and never fails the run.
{"channels": ["telegram", "durov"],"maxItemsPerChannel": 20,"webhookUrl": "https://hooks.slack.com/services/T000/B000/XXXX"}
Every run comes with a report
Every run that delivers messages also writes a REPORT record to its key-value store: a single self-contained HTML page with the headline numbers (messages, channels, share with text / media / links, total and top views), bar charts of messages per channel, views per channel, the top posts by views and the media-type split, the delivered rows ordered most-viewed first, and the same notes the status message carries. Find it in the run's Output → Storage → Key-value store (or follow the Report: link in the status message). It is safe to forward or screenshot; the dataset stays the source of truth.
What the status line tells you
The run's status message is written to be read, not just the log:
- Delivered count — "Done - 40 Telegram message(s) delivered from 2 channel(s): …" counts channels that actually produced rows, never channels merely requested.
- Per-channel notes — a channel that could not be loaded is named with its real cause (
HTTP 429rate limit,HTTP 404wrong username, a network error, or an unexpected error you should report); a private / invite-only / nonexistent name is reported as "no public preview"; a real channel with nothing posted as "shows no posts"; a channel whose pagination stopped early says how many of the requested messages came back and why. - Zero-row runs still succeed and say exactly why — "Could not load any of the channels" is a failure on Telegram's side worth retrying, "returned no public messages" is not — and always end with "You were not charged." A request that failed is never reported as an empty result.
- Time budget — the run reads its own timeout, keeps a reserve, and checks it before every page request. Each channel's messages are pushed to the dataset as soon as that channel is done (in chunks of at most 500 rows / 3.5 MB), so a run that hits its timeout keeps everything already collected; channels that were not started are listed in the status message. Raise the run timeout or lower
maxItemsPerChannelif you see that note. - Billing — delivered and billed are always the same number: rows are pushed first and charged after, and a
maxTotalChargeUsdlimit trims delivery to exactly what it pays for (the note says so). RUN_SUMMARY— a machine-readable receipt in the run's key-value store for API and scheduled callers: channels requested and rejected, per-channel status / pages / delivered counts, request count, the zero-row cause, charge-budget and time-budget flags, the webhook outcome and the report URL.
How much does it cost?
This actor uses pay-per-event pricing: a flat rate per message returned. At the rate current on 2026-08-23 that is $0.002 per message — $2 per 1,000 messages — plus a $0.00005 actor-start event; this page's Pricing tab is always authoritative if the rate changes. You're charged only for messages actually returned — no subscription, and no charge for empty runs. New Apify accounts get platform free credits, so you can pull a mid-size backlog from several channels and test the output before paying anything.
What it does not do
- No group members. It cannot scrape or export Telegram group member lists — the public web preview shows a channel's posts, not its subscribers. If you searched "scrape telegram group members", this is not that tool (and any keyless tool claiming to be should be treated with suspicion).
- No private or invite-only channels (
t.me/+...links), and no group chats. Public broadcast channels only. - No comments, reactions, or reply threads — the preview page exposes the posts themselves.
- No media file downloads. You get each message's
media_typeand links, not the photo/video files. - No login, ever — which is exactly why there's no account to ban and no session to maintain.
FAQ
Do I need an API key, bot token, or phone number?
No. The actor reads the official public web preview at t.me/s/<channel> — the same page any browser can open without logging in. There is no Telegram API key, no bot token, no phone-number login, and no session string. That also means there's nothing to get banned: it never authenticates as a user.
Is this a Telethon / Pyrogram alternative?
For reading public channel messages, yes: you get the same message text, dates, views and links without registering a Telegram API id, without a phone number, and without risking an account. For anything that requires a logged-in session (private channels, group member lists, sending messages), no — no keyless tool can do that, this one included.
Can it scrape Telegram group members?
No — see What it does not do. Member lists are only visible to logged-in clients; the public preview this actor reads never shows them.
Can it read private channels or group chats?
No. It only reads public channels that expose a public web preview. Private channels, invite-only channels, and group chats are not accessible this way, by design. If a channel doesn't return public messages, the actor names it in the run's status message ("no public preview") and skips it — the run still finishes cleanly for the channels that do work, and you are only billed for the messages that were delivered.
How far back can it go?
It paginates backwards through the channel's public history using Telegram's ?before= parameter, so you can pull well beyond the latest page. In practice you're bounded by maxItemsPerChannel (max 1,000 per channel per run) and by how much history Telegram serves in the public preview. Very large historical pulls are best split across several runs.
Can I monitor a channel on a schedule?
Yes — run it on an Apify Schedule (hourly, daily, weekly) and each run delivers the channel's most recent messages at that moment, timestamped and deduped by message_id within the run. Add a webhookUrl and each run also posts its digest to Slack / Discord / your automation. Note it has no "only new since last run" mode: a scheduled run re-pulls the latest maxItemsPerChannel messages, so dedupe across runs by message_url in your pipeline (or keep the per-run limit close to the channel's posting volume). This is how people track crypto announcement channels, war-monitor feeds and data-leak channels over time.
How fresh is the data?
It's fetched live at run time, so results reflect what the channel shows right now, including current view counts.
Why is a channel returning fewer messages than I asked for?
Either the channel simply has fewer public messages than your limit, or it reached the start of its public history. Service messages and some media-only edge cases may also be skipped. The actor de-duplicates by message id, so counts reflect unique messages. If pagination stopped early — Telegram rate-limited an older page (HTTP 429, retried with backoff and the server's Retry-After first) or the run's time budget ran out — the status message says so and how many of the requested messages came back; you are billed only for those.
What happens if the run times out?
Nothing already collected is lost. Messages are pushed per channel as soon as that channel is done, the run watches its own deadline before every page request, and the status message lists the channels that were not started. Raise the run timeout (Settings → Timeout) or lower maxItemsPerChannel for very large pulls.
Is scraping this data allowed?
The actor reads only publicly available data from Telegram's own public web preview — no login, no paywall, no private content. Use the collected data responsibly and in line with Telegram's terms and any laws that apply to your use case (privacy, copyright, etc.).
Use with AI agents & automation
Runs as a tool call through the Apify MCP server, so AI agents (Claude, ChatGPT, Cursor) can pull a channel's messages mid-conversation. Trigger runs and pipe rows into Make, n8n or Zapier, or sync the dataset to Google Sheets for a live channel archive.
Related actors
- Creator Leads Scraper — need creator/influencer leads with emails from TikTok, Instagram and YouTube instead of Telegram messages? Same publisher, one row per creator.
- Twitter / X Leads Scraper — pull public X/Twitter profiles and posts into structured leads.
- Wikipedia Scraper — extract clean article text and structured data from Wikipedia.
Questions or a channel that won't parse? Open an issue on the actor's Issues tab and we'll take a look.
Related Flash Scrape actors
- Multi Job Board Scraper — LinkedIn, Indeed, Glassdoor + 9 more boards, deduplicated, with only-new job alerts
- Local Business Leads Scraper — any category, any city, verified emails, lead scores
- Remote Jobs Aggregator — 10 keyless remote boards in one deduplicated feed
- All Flash Scrape actors — same house rules everywhere: pay per delivered row, honest status messages, only-new monitoring, webhook alerts, and a run report on every run.
More from Flash Scrape
Same publisher, same rules: no API keys, pay per row, filters run before billing.
- Multi Job Board Scraper - LinkedIn, Indeed, Glassdoor and 9 more boards in one deduplicated table
- Local Business Leads Scraper - local businesses in any category and city with MX-verified emails, phones and socials
- Remote Jobs Aggregator - 10 remote job boards in one feed, only-new-jobs monitoring
- Creator Leads Scraper - YouTube, TikTok and Instagram creator emails in one run