Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

Pay per event

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

Export post history from any public Telegram channel via its no-login web preview. We rotate browser fingerprints, retry on rate limits, and walk the pagination cursor so deep channel history lands clean — text, media links, view counts, and forwards, as JSON or CSV. Pay only for posts that land.

Pricing

Pay per event

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Telegram Channel Scraper

Telegram Channel Scraper

We do the dirty work so your dataset stays clean. 😈

$2.20 / 1,000 posts — pay only for results that land. No credit card required to try.

Export post history from any public Telegram channel via its no-login web preview (t.me/s/{channel}) — no Telegram API key, no bot token, no MTProto session to babysit. We rotate browser fingerprints, retry on rate limits, and walk the pagination cursor backward through a channel's history so you get clean, structured rows: text, media links, view counts, and forwards.

🎯 What this scrapes

  • Public Telegram channel post history via the server-rendered /s/{channel} preview surface.
  • Channel-level metadata (title, subscriber count, description) captured once per channel.
  • Post text, timestamps, view counts, media (photo/video/document), outbound link previews, and forward attribution.
  • Every field lands typed and validated — no raw HTML fragments, no guessing at date formats.

🔥 Features

  • What we handle for you: browser fingerprint rotation, exponential back-off on rate limits, pagination cursor walking, and Pydantic-validated rows.
  • Works on any public channel — no login, no bot token, no MTProto setup.
  • Detects private/nonexistent channels and skips them with a clear warning instead of failing the whole run.
  • Pay only for results that land — no data means no result charges (only the small actor-start warm-up fee).
  • Clean, typed dataset rows — Pydantic-validated on the way out, so downstream tools never choke on a malformed field.

💡 Use cases

  • OSINT analysts tracking a watchlist of political/activist channels for narrative shifts, without opening a Telegram account.
  • Crypto researchers archiving trading-signal channels to backtest signal accuracy after the fact.
  • News teams backfilling a monitoring dashboard with a channel's full history on day one, instead of only capturing posts going forward.
  • Compliance / trust-and-safety teams pulling a channel's public post history as evidence before it goes dark or gets banned.

⚙️ How to use it

  1. Open the Actor input form.
  2. Add one or more channel usernames to Channel usernames (with or without @/t.me/ prefix).
  3. Adjust Max posts per channel (default 100, maximum 5000).
  4. Optionally set Since date to stop paginating once posts get older than a given date.
  5. Click Start and watch the run log. Results stream into the default dataset in real time.

📥 Input

FieldTypeRequiredDefaultDescription
usernamesarray of stringyesPublic channel usernames, with or without @/t.me/ prefix
maxPostsPerChannelintegerno100Cap on posts fetched per channel (1–5000)
sinceDatestring | nullnonullISO-8601 date/datetime; stop paginating once older posts are reached
proxyConfigurationobjectno{"useApifyProxy": true}Apify Proxy configuration
{
"usernames": ["durov"],
"maxPostsPerChannel": 100,
"sinceDate": null,
"proxyConfiguration": { "useApifyProxy": true }
}

📤 Output

One row per post (row_type: "post"), plus one summary row per channel (row_type: "channel_meta"), sharing a single dataset.

{
"row_type": "post",
"channel": "durov",
"post_id": 522,
"datetime": "2026-05-20T09:12:03+00:00",
"text": "New update for Telegram...",
"view_count": 4510000,
"media_type": "photo",
"media_url": "https://cdn4.telesco.pe/file/....jpg",
"outbound_links": ["https://telegram.org/blog/watch-apps-and-more"],
"forwarded_from": null,
"reply_count": null,
"permalink": "https://t.me/durov/522"
}

🔌 Integrate it

Call it from any Python pipeline via apify-client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("DevilScrapes/telegram-channel-scraper").call(
run_input={"usernames": ["durov"], "maxPostsPerChannel": 500}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

No Python shop? Wire the same call into n8n or Make via their built-in Apify node — point it at DevilScrapes/telegram-channel-scraper with the same input JSON and the run drops straight into your workflow.

💰 Pricing

Pay-Per-Event (PPE) — you pay only for what lands in your dataset:

EventPrice (USD)When
actor-start$0.20Once per run, at boot
result$0.002Per post row written to the dataset (channel-meta rows are never charged)

Example: scraping 1,000 posts across a handful of channels costs $0.20 (start) + 1,000 × $0.002 (results) = $2.20 per 1,000 posts. No subscription, no minimum, no card required to try it.

🚧 Limitations

  • Private / invite-only channels have no public preview and are out of reach by design.
  • Comment threads / linked discussion groups are not scraped.
  • Reply/comment counts are not exposed on the public preview surface and stay null.

❓ FAQ

Do I need a Telegram account to use this Actor?

No. The /s/{channel} preview is Telegram's own no-login, search-engine-facing surface. You run the Actor; we handle the rest.

Can I scrape private or invite-only channels?

No, the /s/{channel} preview only exists for public channels; private channels have no public preview to fetch, by design.

How far back can I go in a channel's history?

As far as the channel's public history goes, up to the Max posts per channel cap (up to 5000) or the Since date cutoff, whichever comes first.

Will I get charged for channels that don't exist or are private?

No. The Actor detects empty/nonexistent previews and skips them with a run-log warning — only the one-time actor-start fee plus result charges for post rows that actually land apply.

Can I get comment/reply counts on posts?

Not from this surface; reply_count is always null (see Limitations).

💬 Your feedback

Found a bug, hit a rate limit, or need a new field on the output row? Open an issue on the Actor's Apify Store page or contact the Devil Scrapes team at apify.com/DevilScrapes. We ship updates within days of validated reports.