Telegram Channel Scraper - Messages, Views & Links, No Login avatar

Telegram Channel Scraper - Messages, Views & Links, No Login

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Telegram Channel Scraper - Messages, Views & Links, No Login

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

Flash Scrape

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

4 days ago

Last modified

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?

  1. Add one or more channels — usernames (telegram), @handles (@durov), or full links (https://t.me/durov). All three formats are normalized automatically.
  2. Set maxItemsPerChannel — how many of the most recent messages to pull from each channel (default 100, up to 1,000).
  3. Optionally paste a webhookUrl (Slack, Discord, n8n, Make, Zapier) to get a digest of the delivered messages the moment the run finishes — see Alerts.
  4. 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

FieldTypeDescription
channelsarray of stringsPublic 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.
maxItemsPerChannelintegerMost-recent messages to pull per channel (default 100, max 1000).
webhookUrlstringOptional. 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:

FieldDescription
channelChannel username the message came from
message_idNumeric message id within the channel
message_urlDirect link, https://t.me/<channel>/<id>
textMessage text, with line breaks preserved
datePublish time (ISO 8601, UTC)
viewsView count as shown by Telegram (e.g. 1.18M, 907K)
authorPost signature / author, when the channel signs posts
media_typephoto, video, voice, audio, document, poll, sticker, location, link, or none
has_linkstrue if the message text contains at least one link
linksList 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 429 rate limit, HTTP 404 wrong 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 maxItemsPerChannel if you see that note.
  • Billing — delivered and billed are always the same number: rows are pushed first and charged after, and a maxTotalChargeUsd limit 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_type and 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.

  • 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.


More from Flash Scrape

Same publisher, same rules: no API keys, pay per row, filters run before billing.