Telegram Channel Scraper — Posts, Views & Reactions
Pricing
from $1.50 / 1,000 post scrapeds
Telegram Channel Scraper — Posts, Views & Reactions
Scrape public Telegram channels with pure HTTP — no login, bot token or proxy needed. Posts, views, reactions, media, hashtags, forwards and channel info. Minimal JSON output for AI agents, relative date filters, profile-only mode and historical backfill.
Pricing
from $1.50 / 1,000 post scrapeds
Rating
0.0
(0)
Developer
XiaoZhi DataTools
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Telegram Channel Scraper — Posts, Views, Reactions & Media (No Login)
Scrape public Telegram channels without a bot token, phone login, or API
credentials. The Actor reads Telegram's public web preview (t.me/s/<channel>)
over plain HTTP — no headless browser and no residential proxies needed.
Each run returns structured posts (text, views, reactions, media URLs, forwards, hashtags, link previews) plus optional per-channel profile info. A built-in monitor mode returns only posts that are new since the previous run, making it ideal for scheduled channel tracking.
Why this Actor
- Zero credentials — no bot token, no phone number, no
api_id/api_hash. - Pure HTTP, no browser — fast and cheap; the Telegram preview pages have very light rate limits, so datacenter IPs and even direct connections work.
- Richer than the preview — reactions with counts, paid star reactions, photo/video/document URLs, link previews, hashtags, mentions, forwarded-from attribution, channel counters (subscribers / photos / videos / links).
- Monitor mode —
newPostsOnlykeeps a persistent cursor per channel, so scheduled runs deliver only fresh posts (great with Apify Schedules + Webhooks). - Filters — date range, minimum views, keyword match, media-only.
Input
| Field | Type | Default | Description |
|---|---|---|---|
channels | string[] | ["durov","telegram"] | Channel usernames, @handles, or URLs (t.me/durov, https://t.me/s/durov). One per line. |
postUrls | string[] | — | Direct post URLs, e.g. https://t.me/durov/528, to fetch specific posts. |
maxPostsPerChannel | integer | 50 | Max newest posts per channel (automatic ?before= pagination). Up to 5000. |
startDate / endDate | string | — | YYYY-MM-DD bounds on post publish date. startDate also accepts relative expressions: 7 days, 2 weeks, 1 month, 24 hours, today, yesterday. |
beforePostId | integer | — | Start pagination from posts older than this post ID instead of the newest posts. Useful for historical backfill in chunks. |
profileOnly | boolean | false | Only return channel profile info (title, description, subscribers, counters) and skip post history. Fast and cheap for channel discovery. |
outputFormat | full/minimal | full | minimal: compact post records (id, url, date, text, views, media, link preview URL) — cheaper and easier to feed into AI agents. |
minViews | integer | 0 | Drop posts with fewer views. |
textContains | string | — | Case-insensitive keyword filter; separate alternatives with | (e.g. bitcoin|ETF). |
mediaOnly | boolean | false | Only posts with photos, videos or documents. |
includeReactions | boolean | true | Include reactions, reaction counts and paid stars. |
includeChannelInfo | boolean | true | Emit a channel_info record per channel (title, description, subscribers, avatar, counters). |
newPostsOnly | boolean | false | Monitor mode: only posts newer than the last run (cursor stored in a named key-value store). |
requestConcurrency | integer | 5 | Channels scraped in parallel. |
proxyConfiguration | object | off | Optional Apify Proxy. Not needed for typical runs. |
Output
Dataset items have recordType: "post" (or "channel_info"). Example post:
{"recordType": "post","channelUsername": "durov","postId": 528,"postUrl": "https://t.me/durov/528","publishedAt": "2026-06-15T18:58:13+00:00","postText": "The UK government wants to ban social media…","views": 18900000,"repliesCount": 12400,"reactions": [{"emojiId": "5265077361648368841", "count": 132000}],"reactionsCount": 218766,"paidStars": 14300,"mediaType": "video","mediaUrls": ["https://cdn1.telesco.pe/file/….mp4?token=…"],"linkPreview": {"url": "https://telegram.org/safety", "siteName": "Telegram","title": "Telegram Safety Overview", "description": "…"},"links": ["https://telegram.org/safety"],"hashtags": ["news"],"mentions": ["durov"],"forwardedFrom": {"url": "https://t.me/other", "name": "Other channel"},"isPinned": false}
Notes:
views/subscribersare parsed from Telegram's compact notation (18.9M→18900000).- Media URLs are served by Telegram's CDN with time-limited tokens — download promptly if you need the files.
- Reaction
emojiIds are Telegram's internal custom-emoji identifiers. - Private channels, deleted channels, and channels without a public preview
are skipped with a warning (no public
t.me/s/page exists for them).
Use cases
- News & OSINT monitoring — track announcements across channels on a schedule.
- Market research — engagement (views/reactions) per post, hashtag trends.
- Content pipelines — feed channel posts into AI summarizers, newsletters,
or RAG datasets (pair with
newPostsOnly+ Webhooks, orfor compact AI-ready records).outputFormat: minimal - Lead discovery — mentions, links and forwarded-from attribution.
- Channel discovery —
profileOnlyreturns just the profile metadata (subscribers, counters) for many channels at minimal cost.
Cost
The Actor itself performs only lightweight HTTP requests. If you publish it
with pay-per-event pricing, a natural model is pay per post scraped
(e.g. via the apify-default-dataset-item charge event), with channel-info
records free or cheap. No third-party API costs are incurred.
Limitations
- Only public channels with a web preview (
t.me/s/<name>resolves) can be scraped; private/invite-only channels are not accessible without login. - The preview shows the most recent history; very old posts may require many paginated requests.
- Comments/replies content is not part of the preview page (only counts when shown).
Changelog
- 0.5 —
maxPostsPerChannelnow truly keeps the newest posts (previously the oldest posts on the first page were kept when the limit was hit mid-page);endDategiven asYYYY-MM-DDnow covers the whole day (previously posts published later that day were wrongly excluded);postUrlsfor older posts now resolve via the single-post embed page (previously only posts on the latest preview page could be fetched);includeReactions: falsenow stripsreactionsCount/paidStarstoo inpostUrlsmode, matching channel mode. - 0.4 — Previous release.