Telegram Public Channels Scraper avatar

Telegram Public Channels Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Telegram Public Channels Scraper

Telegram Public Channels Scraper

Scrape Telegram public channels via the web preview (t.me/s/{channel}) with channel metadata + recent posts with text, media URLs, view counts, and forwarded-from attribution. No login, no Telegram app, no proxy required.

Pricing

from $3.00 / 1,000 results

Rating

5.0

(21)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

21

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

Scrape any public Telegram channel via the web preview at t.me/s/{channel}. Pull channel metadata (title, bio, subscriber count, photo/video counts) plus recent posts with text, media URLs, view counts, and forwarded-from attribution. No login, no Telegram app, no proxy — datacenter IPs work fine.

Built for OSINT research, news monitoring, crypto-community tracking, and any analytics workflow that needs structured data from public Telegram channels.

What you get

Channel records (recordType=channel)

FieldDescription
channelChannel handle (without @)
idSame as channel (handle is canonical ID)
urlPublic Telegram URL (https://t.me/{channel})
titleChannel display name
descriptionChannel bio
avatarUrlChannel avatar URL
subscribersCountSubscriber count (parsed from 1.2M / 12K short form)
photosCountTotal photo count
videosCountTotal video count
filesCountTotal file/document count
linksCountTotal external-link count
verifiedtrue for verified channels

Post records (recordType=post)

FieldDescription
idPost message ID (channel-relative)
channelSource channel handle
urlDirect post URL (https://t.me/{channel}/{id})
publishedAtISO 8601 timestamp
textPlain-text post body (newlines preserved)
viewCountView count (parsed from 1.2K / 99M short form)
mediaAttachmentsArray of {type, url, [thumbnailUrl, title]} for photo / video / document
isForwardedtrue if the post was forwarded from another channel
forwardedFromSource channel handle (when isForwarded=true)
inReplyToUrlPermalink of the post being replied to
scrapedAtISO 8601 UTC timestamp

Empty fields are dropped from every record at every depth.

Input

ParameterTypeDefaultDescription
modeEnumchannelschannels (channel metadata + recent posts) or singlePost (one post by URL)
channelsArray["durov"]Channel handles (without @) or t.me/{channel} URLs (mode=channels)
postUrlsArrayt.me/<channel>/<post_id> URLs to fetch one-by-one (mode=singlePost)
searchQueryStringKeyword search within each channel's history (mode=channels) — uses t.me/s/<channel>?q=…
sinceStringEarliest post date (YYYY-MM-DD or ISO 8601). Pagination stops once the page is older than this.
untilStringLatest post date (YYYY-MM-DD or ISO 8601). Posts newer than this are dropped.
maxPostsPerChannelInteger50Hard cap on posts per channel (1-1000)
includeChannelMetaBooleantrueEmit a separate channel record for each channel
mediaOnlyBooleanfalseDrop posts without any media attachment
minViewsIntegerDrop posts with fewer views than this
excludeForwardedBooleanfalseDrop forwarded posts
maxItemsInteger100Hard cap on total emitted records

Album / grouped posts: when a post contains multiple images (a Telegram "album"), the actor emits all image URLs in mediaAttachments, sets isAlbum: true, and (when present) sets albumId to Telegram's data-grouped-id.

Example input — single channel

{
"mode": "channels",
"channels": ["durov"],
"maxPostsPerChannel": 50
}

Example input — keyword search within channels

{
"mode": "channels",
"channels": ["telegram", "tginfo"],
"searchQuery": "feature",
"maxPostsPerChannel": 100
}

Example input — date window

{
"mode": "channels",
"channels": ["durov"],
"since": "2026-01-01",
"until": "2026-04-30",
"maxPostsPerChannel": 500
}

Example input — single post by URL

{
"mode": "singlePost",
"postUrls": [
"https://t.me/durov/100",
"https://t.me/telegram/300"
]
}

Example input — multiple channels, posts only

{
"channels": ["durov", "telegram", "tginfo"],
"includeChannelMeta": false,
"maxPostsPerChannel": 30
}

Example input — high-engagement filter

{
"channels": ["breakingnews"],
"minViews": 10000,
"excludeForwarded": true,
"maxPostsPerChannel": 200
}

Example input — media tracking

{
"channels": ["spacepictures"],
"mediaOnly": true,
"maxPostsPerChannel": 100
}

Example output

{
"recordType": "channel",
"channel": "durov",
"id": "durov",
"url": "https://t.me/durov",
"title": "Pavel Durov",
"description": "Founder of Telegram. Building a platform for free communication.",
"avatarUrl": "https://cdn.telegram.org/photo/durov.jpg",
"subscribersCount": 12600000,
"photosCount": 523,
"videosCount": 42,
"scrapedAt": "2026-05-06T06:42:18Z"
}
{
"recordType": "post",
"id": "100",
"channel": "durov",
"url": "https://t.me/durov/100",
"publishedAt": "2026-04-15T14:32:00+00:00",
"text": "Big announcement coming next week.",
"viewCount": 1200000,
"mediaAttachments": [
{ "type": "photo", "url": "https://cdn.telegram.org/photo/abc.jpg" }
],
"scrapedAt": "2026-05-06T06:42:18Z"
}

Use cases

  • OSINT / intelligence research — Snapshot public Telegram channels of interest (geopolitical, journalism, dissident communities).
  • Crypto / market monitoring — Many trading communities publish first on Telegram; monitor for signals.
  • News monitoring — Track breaking-news channels for headlines as they post.
  • Brand monitoring — Track mentions of your brand or product in Telegram channels.
  • Compliance / regulatory — Monitor channels for misuse of trademarks or copyrighted material.
  • Academic research — Bulk-collect public discourse on Telegram for sociological / linguistic analysis.

FAQ

Do I need a Telegram account or the Telegram app? No. The actor uses Telegram's official web preview at t.me/s/{channel} — fully public, no login. Works against any "public" channel (the kind that has a t.me/ URL).

What about private / invite-only channels? Private channels (those joined via invite links and without a public t.me/ handle) are not accessible without a logged-in Telegram account, and this actor doesn't support that.

How many posts can I get per channel? Up to 1000 per channel via maxPostsPerChannel. The web preview returns ~16-20 posts per page; the actor paginates via ?before=N cursors to reach further back. Performance: ~1-2 seconds per page.

How does pagination work? The actor reads the smallest message ID on each page and uses it as ?before= cursor for the next page. This is the standard t.me/s/ pagination pattern.

How current is the data? Live — every run hits Telegram's web preview at request time. Schedule the actor for hourly / daily refreshes on watchlist channels.

Do I need a proxy? Usually no — t.me/s/ works from datacenter IPs out of the box. If you scrape from a region where Telegram is blocked at the network level (e.g. some corporate networks), enable proxy via Apify's platform-level config.

Are comments / reactions included? Comments and reaction counts aren't exposed on the public web preview (Telegram surfaces them only inside the app or via the Bot API). The actor returns post text, view count, and media — these are everything t.me/s/ publishes.

What about NSFW / sensitive channels? The actor returns whatever t.me/s/ serves. Telegram itself flags certain channels as sensitive; in those cases the page renders a warning shell with no posts, and the actor returns an empty result with a clear status message.

Limitations

  • Comments, reactions, and detailed engagement metrics aren't on the web preview (Telegram exposes those only in-app or via the Bot API with admin auth).
  • Voice/video notes don't have direct download URLs in the web preview.
  • Some country-blocked channels may not render outside their target region.
  • Telegram's t.me/s/ only shows the latest few thousand messages; very old archives are not paginatable indefinitely.