Telegram Channel Scraper · Posts, Views, Media, No API Key
Pricing
from $0.36 / 1,000 posts
Telegram Channel Scraper · Posts, Views, Media, No API Key
Telegram channel scraper for public channels: posts with text, date, views, photos, videos, polls, forwards and link previews, plus subscriber counts. No API key, login or phone number. Keyword search, date filter, since-last-run checkpoint. $0.60 per 1,000 posts; first 25 posts each month free.
Pricing
from $0.36 / 1,000 posts
Rating
0.0
(0)
Developer
AgentsGearbox
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
Telegram Channel Scraper
Scrape posts from any public Telegram channel without a Telegram API key, login or phone number: text, date, view count, photos, videos, documents, polls, forwards, replies and link previews, plus subscriber counts. Built for hourly monitoring: a keyword filter and a date filter run on Telegram's side, and a since-last-run checkpoint means a scheduled run only fetches posts you have not seen yet. $0.60 per 1,000 posts, nothing charged for errors, summaries or empty runs. The first 25 posts each month are free for every account.
Why this one
| This actor | |
|---|---|
| Credentials | None. Reads the public web preview Telegram serves for every open channel. |
| Price | $0.0006 per post ($0.60 per 1,000), $0.0012 per channel-info record, $0.002 per run. No platform usage charged on top. |
| Scheduled monitoring | onlyNewSinceLastRun stores the newest post ID per channel and stops there next time. A run that finds nothing new costs only the $0.002 start fee, so put all your channels in one run. |
| Filters | searchQuery (Telegram-side keyword search), postedAfter (date cut-off), maxPostsPerChannel. |
| Output | Structured fields for media, polls, forwards, replies and link previews; plain text plus textHtml; extracted links. |
| Reliability | One summary record per channel with status and stoppedBy; private or missing channels produce an error record instead of a failed run; tested against live channels every day. |
| Speed | No browser. About 20 posts per request; 1,000 posts in well under a minute. |
What people use it for
- Monitoring: new posts from crypto, finance, tech, OSINT or local-news channels every hour into Slack, Google Sheets, a webhook or your own app.
- Brand and competitor tracking: who mentions your product, what competitors announce, and how many views each post gets.
- Datasets: thousands of posts per run for research, trend analysis or model training, with views as an engagement signal.
- AI agents and RAG: fresh channel content through the Apify API or the Apify MCP server.
- Archiving: posts and media links before they are edited or deleted.
Example tasks
Ready-made configurations you can open, copy and run as they are:
- Monitor Telegram channels for brand mentions every hour: three news channels filtered for one keyword, with the since-last-run checkpoint on, so an hourly schedule returns only new mentions.
Input
| Field | Type | Default | Description |
|---|---|---|---|
channels | array | required | Usernames (durov, @telegram) or links (https://t.me/bloomberg, https://t.me/s/bloomberg). |
maxPostsPerChannel | integer | 100 | Stop after this many posts per channel, newest first. Up to 100,000. |
postedAfter | string | – | ISO date (2026-01-01 or 2026-01-01T12:00:00Z) or a relative value (7d, 12h, 2w). Older posts are skipped and pagination stops. |
searchQuery | string | – | Keyword filter applied by Telegram, like the search box on t.me. You pay only for matching posts. Telegram's public search returns the newest ~22 matches per channel per run, so schedule it with onlyNewSinceLastRun for monitoring, or scrape without a query and filter yourself for full history. |
onlyNewSinceLastRun | boolean | false | Checkpoint mode for schedules: remembers the newest post ID per channel and stops there on the next run. |
checkpointStoreName | string | telegram-channel-scraper-state | Key-value store that holds the checkpoints. Use different names for independent monitors. |
includeChannelInfo | boolean | true | Also output one channel record per channel. |
proxyConfiguration | object | none | Optional Apify Proxy. Telegram's preview rarely blocks; enable only on HTTP 429. |
{"channels": ["durov", "https://t.me/telegram"],"maxPostsPerChannel": 200,"postedAfter": "2026-10-01","onlyNewSinceLastRun": true}
Output
Three record types share one dataset, told apart by type.
post (charged, $0.0006 each). A real row from the channel durov, URLs shortened:
{"type": "post","channelUsername": "durov","channelTitle": "Pavel Durov","postId": 552,"url": "https://t.me/durov/552","datetime": "2026-10-11T14:52:40+00:00","text": "✨ Designers × AI\n\n🆕 The mockup era is over. Today’s AI tools give every designer a superpower: you can now craft your ideas, not just draw them.\n\nThe gap betwee…","textHtml": "<tg-emoji emoji-id=\"5325547803936572038\"><i class=\"emoji\" style=\"background-imag…","views": 827000,"author": "Pavel Durov","isForwarded": true,"forwardedFromTitle": "Telegram Designers","forwardedFromUrl": "https://t.me/designers/266","replyToUrl": null,"replyToText": null,"isEdited": false,"hasMedia": true,"mediaCount": 1,"photos": [],"videos": [{"src": null,"thumbnail": "https://cdn4.telesco.pe/file/eFjP3GIB6wa2kR_lnaHB7AArrvWLaHK1V1vSlTRnC…","duration": "1:15"}],"documents": [],"sticker": null,"poll": null,"linkPreview": null,"links": ["https://t.me/designers"],"scrapedAt": "2026-10-14T14:16:47.061Z"}
| Field | Type | Notes |
|---|---|---|
postId, url | number, string | Message ID inside the channel and its public link. |
datetime | string | ISO 8601 with timezone, as Telegram serves it (UTC). |
text, textHtml | string | Plain text with line breaks kept; original HTML with links and formatting. |
views | number | Parsed from Telegram's 5.8K / 1.2M labels. |
author | string or null | Post signature when the channel shows authors. |
isForwarded, forwardedFromTitle, forwardedFromUrl | boolean, string | Source of forwarded posts. |
replyToUrl, replyToText | string | Quoted post when the message is a reply. |
photos | array of URLs | Full-size photo URLs from Telegram's CDN. |
videos | array | src, thumbnail, duration per video. |
documents | array | title, extra (size and type) per file. |
sticker | string or null | Sticker image URL. |
poll | object or null | question, type, options[{text, percent}], voters. |
linkPreview | object or null | url, siteName, title, description, image. |
links | array of URLs | External links found in the text. |
hasMedia, mediaCount, isEdited, scrapedAt | misc | Convenience fields. |
channel (charged, $0.0012 each, once per channel when includeChannelInfo is on):
{"type": "channel","channelUsername": "durov","url": "https://t.me/durov","title": "Pavel Durov","description": "Founder of Telegram.","subscribers": 10400000,"photos": 102,"videos": 47,"files": null,"links": 200,"isVerified": true,"photoUrl": "https://cdn4.telesco.pe/file/FWIGUGKY0bM70FOlazh5shsW7eGb3MwXQM8PmHDN4…"}
summary (free, one per channel at the end of the run). status is COMPLETE, PARTIAL (stopped by your spending limit or a failed request), EMPTY or ERROR; stoppedBy is maxPosts, postedAfter, checkpoint, endOfChannel, chargeLimit or requestFailed:
{"type": "summary","channelUsername": "durov","status": "COMPLETE","postsScraped": 3,"newestPostId": 552,"oldestPostId": 548,"newestPostDate": "2026-10-11T14:52:40+00:00","oldestPostDate": "2026-09-11T16:04:02+00:00","stoppedBy": "maxPosts","checkpointUsed": null}
error (free): {"type": "error", "channelUsername": "...", "error": "Channel is private, does not exist, or Telegram disabled its web preview."}
Pricing and cost examples
Try it free. The first 25 posts each calendar month are free for every Apify account, with nothing to enter: the actor keeps count in a small key-value store in your account (free-slice-telegram-channel-scraper) and charges only from the 26th on. The free results are real results you keep; the counter resets on the first of each month.
| Job | Posts | Cost |
|---|---|---|
| One-off export of a channel's last 1,000 posts | 1,000 | $0.60 |
| Hourly monitor of 20 channels averaging 5 new posts an hour each, with the checkpoint on | 2,400 a day | about $1.45 a day, $44 a month |
Keyword watch (searchQuery) that matches 30 posts a day across your channels | 30 a day | under $0.02 a day |
| Archive of a 50,000-post channel | 50,000 | $30, in a few minutes |
Platform compute is included in the prices. Every run starts with a fixed $0.002 (one more per GB of memory above 1 GB); a run that finds nothing new costs only that, so a schedule with all your channels in one run is the cheapest way to monitor.
Discounts for paid Apify plans, applied automatically to the buyer's plan: Bronze 10% off, Silver 25% off, Gold and enterprise tiers 40% off the prices above. Free-plan users pay the listed price.
Scheduling: hourly monitoring in two minutes
- Create a task from this actor with your channels and
onlyNewSinceLastRun: true. - Add an Apify schedule (for example every hour).
- Add an integration on the task: Slack, Google Sheets, email, Make, Zapier, n8n or a webhook. Each run delivers only new posts; the
summaryrecords tell you per channel whether the run was complete.
The first checkpoint run fetches up to maxPostsPerChannel posts; later runs stop at the previous newest post. To start over, change checkpointStoreName or delete the key-value store.
Run it from your code
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('agentsgearbox/telegram-channel-scraper').call({channels: ['durov', 'telegram'], maxPostsPerChannel: 100, onlyNewSinceLastRun: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((i) => i.type === 'post'));
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("agentsgearbox/telegram-channel-scraper").call(run_input={"channels": ["durov", "telegram"], "maxPostsPerChannel": 100, "onlyNewSinceLastRun": True})posts = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i["type"] == "post"]
cURL (synchronous, returns the dataset):
curl -X POST "https://api.apify.com/v2/acts/agentsgearbox~telegram-channel-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"channels": ["durov"], "maxPostsPerChannel": 50}'
For AI agents
Give your agent hands. Instead of fetching pages, getting blocked and reasoning over HTML, it calls this actor as a tool and gets verified results back as JSON, priced per result. Reading 1,000 Telegram posts through a browser tool is about a million tokens of HTML. This actor returns them as clean JSON with views, media and links for $0.60.
- MCP, this actor only: add
https://mcp.apify.com?tools=agentsgearbox/telegram-channel-scraperto Claude Desktop, Claude Code, Cursor or any MCP client (with your Apify token), then ask for "the last 50 posts from the Bloomberg Telegram channel, summarized".
- MCP, all agentsgearbox actors:
https://mcp.apify.com?tools=agentsgearbox/telegram-channel-scraper,agentsgearbox/google-play-reviews-scraper,agentsgearbox/substack-scraper,agentsgearbox/google-news-scraper,agentsgearbox/brand-name-generator,agentsgearbox/ai-readiness-audit,agentsgearbox/company-lookup,agentsgearbox/app-intelligence,agentsgearbox/app-store-reviews-scraper,agentsgearbox/company-jobs-scraper,agentsgearbox/apple-podcasts-scraper,agentsgearbox/remote-jobs-scraper
- No Apify account? This actor is eligible for Apify's agentic payments: an agent can buy a spend-capped token through agi.apify.com (x402, MPP or Skyfire) and call the API directly.
- Prices are per result and known in advance, so the agent can set a spending limit; error records come back as data instead of failed runs.
Limitations, stated plainly
- Public channels only. Private channels, channels that disabled the web preview and most groups return an
errorrecord. - Comments live in a linked discussion group and are not part of the preview; reactions are not shown either.
- Photo and video URLs point to Telegram's CDN and can expire after some hours. Download them right away if you need to keep them.
searchQueryuses Telegram's own search, which matches words, not substrings, and returns only the newest ~22 matches per channel per run (a Telegram limit, measured on several channels and words).- Telegram serves about 20 posts per page, so a 100,000-post archive takes a few minutes.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
error record for a channel | The channel is private, misspelled, or has the preview disabled. Open https://t.me/s/<name> in a browser: if it redirects to the app page, the actor cannot read it either. |
| 0 posts with the checkpoint on | Nothing new since the last run. Check the summary record: stoppedBy: "checkpoint". |
Exactly 22 (or fewer) posts per channel with searchQuery | Telegram's public search exposes only the newest ~22 matches per channel per request, whatever the word. |
| HTTP 429 in the log | Rare; enable Apify Proxy in proxyConfiguration. |
Run stopped with PARTIAL | Your spending limit for the run was reached. Raise it or lower maxPostsPerChannel. |
Track record
- Published 13 October 2026 and tested every day since by an automated run against public channels; every test run has succeeded. The Store's run statistics on this page reflect those runs with a delay of up to a day.
- Built without a browser, so a run cannot fail on Chrome crashes or memory limits, which is the usual failure mode of browser-based scrapers in this category.
- Changes are released only after a local test and a real platform run, and every actor from this account is monitored daily, so a breaking change on the target site is normally fixed the same day.
More from agentsgearbox
- Google Play Reviews Scraper: Google Play reviews with replies and versions, any market.
- Substack Scraper: Substack posts with full text and comments, custom domains too.
- Google News Scraper: Google News with real publisher URLs and full text.
- Brand & Business Name Generator: brand names verified live on domains, handles and app stores.
- AI Readiness Audit: how well AI search engines and agents can read a site: crawler access, llms.txt, structured data, content without JavaScript, scored with fixes.
- Company Lookup: one row per domain with legal identity and VAT validation, contacts, socials, tech stack, open jobs, apps, news and Wikidata facts.
- App Intelligence: App Store and Google Play in one run: search, top charts, full app details and each app's twin on the other store.
- App Store Reviews Scraper · iOS + Google Play, Any Country: Reviews of any iOS or Android app from both stores in one run: stars, text, version, votes, developer replies, since-last-run checkpoint, rating trend per app..
- Company Jobs Scraper: every open job on a company's careers page: nine applicant tracking systems, one schema, salaries where stated, hiring signals free.
- Apple Podcasts Scraper: Apple Podcasts search, charts, episodes with audio links and listener reviews, any country.
- Remote Jobs Scraper: remote jobs from six boards and the Hacker News hiring thread in one schema, deduplicated, only-new mode for alerts.
All of them are pay-per-event, run without a browser, and are compared with their alternatives on agentsgearbox.com.
Support
Open an issue on this actor's Issues tab, usually answered within a day, or email support@agentsgearbox.com. More actors and daily comparisons of scrapers for 200+ websites at agentsgearbox.com.
Legal and fair use
This actor only reads pages Telegram serves publicly without logging in. Respect Telegram's terms, channel owners' rights and privacy law (such as GDPR) when storing or republishing content.