Telegram Channel Scraper — Public Posts, Views, Media, No Login avatar

Telegram Channel Scraper — Public Posts, Views, Media, No Login

Pricing

from $5.00 / 1,000 posts

Go to Apify Store
Telegram Channel Scraper — Public Posts, Views, Media, No Login

Telegram Channel Scraper — Public Posts, Views, Media, No Login

Scrape public Telegram channels with no account: messages with text, timestamp, views, media URLs, forwards. Search channels, fetch single posts, or pass a post-ID cursor to track a channel and pay only for new updates. Public channels only — member lists need a login, this Actor never signs in.

Pricing

from $5.00 / 1,000 posts

Rating

0.0

(0)

Developer

Petro Pankov

Petro Pankov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Share

Telegram Channel Scraper: public posts, views and media, no login

Scrape public Telegram channels without an account. Hand it channel handles or t.me links, get back every recent post as a clean row: full text, exact timestamp, view count, media URLs, forward attribution and a reply flag.

No API key. No login. No captcha. No proxy required.

Channel messages come back as structured rows you can send straight to a sheet, a database or an LLM pipeline.

What you get per post

fieldwhat it is
channel / channelTitlehandle and display name
postId / urlpost number and direct t.me link
datetimeexact publish time, ISO 8601 with timezone
textfull post text
viewsview count, expanded from Telegram's 1.2M shorthand to 1200000
mediaphoto / video / document / voice URLs attached to the post
forwardedFromoriginal channel when the post is a forward
isReplywhether the post replies to another
scrapedAtwhen this run collected it
channelSubscribers / channelDescriptionwith includeChannelMeta on

Input

{
"channels": ["durov", "https://t.me/telegram"],
"maxItemsPerChannel": 100,
"since": "2026-07-01",
"includeMedia": true,
"minViews": 1000,
"excludeForwarded": false,
"mediaOnly": false,
"includeChannelMeta": false
}

channels takes durov, @durov or https://t.me/durov. All three work.

since skips anything older than the date you give, so a daily run costs you the day, not the archive. maxItemsPerChannel caps posts per channel, which caps what you pay: billing is per post returned.

You are billed per post returned, and nothing else: a channel with no new posts costs nothing, a private or nonexistent one is skipped rather than charged, and the same channel listed twice — durov, @durov, https://t.me/durov — is scraped once, not billed twice.

minViews, excludeForwarded and mediaOnly filter posts out before they are returned, so they cut the bill and not just the file.

Running it on a schedule

A date is a blunt cursor. Two runs on the same day either hand you the boundary day twice or lose whatever landed between them, and you pay for the overlap either way. So every run reports the last post ID it saw per channel — in the log, and in the key-value store as LAST_POST_IDS:

Next incremental run: pass afterPostIds={"durov": 536}

Feed that back as afterPostIds (or afterPostId for a single cursor across all channels) and the next run returns only what is genuinely new. A quiet channel returns nothing and costs nothing.

Two other ways to ask

Search inside the channels. searchQuery runs Telegram's own in-channel search over the same public page, so you can watch twenty channels for one word and pay only for the posts that mention it. A channel with no match returns nothing rather than an error.

Fetch specific posts. postUrls takes links like https://t.me/durov/536 and returns those posts alone — useful when something else in your pipeline already found the link. Works with or without channels.

What people use it for

  • Channel monitoring: run it on a schedule, keep only what is newer than the last run.
  • Narrative tracking: forwardedFrom shows how a post spreads between channels.
  • Engagement research: views is on every post, so you can rank content without opening Telegram.
  • Archiving: text plus media URLs for the channels you care about.

Scope: public channels only, on purpose

This Actor reads Telegram's public channel preview, which anyone can open in a browser without an account. That is the whole design.

It will not scrape member lists, phone numbers or private groups. Those need a logged-in Telegram session, and session-based scrapers break the moment the account behind them gets flagged. Nothing here signs in, so there is no session to lose. A private, invite-only or nonexistent channel is skipped with a clear log line and an empty result rather than a mysterious error.

Fewer moving parts is the point: an anonymous HTML page keeps working.

Notes

  • Posts come back newest first.
  • Channels are processed one at a time, with a short delay between page requests, so Telegram is not being hammered and neither is your run.
  • A channel with no posts returns nothing and says so in the log.