{"name":"telegram-channel-scraper","id":"sfoln/telegram-channel-scraper","title":"Telegram Channel Scraper – Public Posts","description":"Scrape posts from public Telegram channels without login: text and markdown, date, views, reactions, links, media URLs (photos, videos, files), forwards and replies, plus the channel's title, description and subscriber count. $0.80 per 1,000 posts, channel info free.","version":"0.1","status":"ready","family":{"id":"social-media-data","name":"Social media data","description":"Profiles, posts, comments, followers and account audits from X, Instagram, TikTok, YouTube, Reddit, Threads, LinkedIn, Facebook, Bluesky, Telegram, Hacker News and Substack.","actors":31},"categories":["SOCIAL_MEDIA","NEWS","LEAD_GENERATION"],"availability":"on_request","seoTitle":"Telegram Channel Scraper – Posts, Views & Media","seoDescription":"Scrape public Telegram channel posts without login: text, date, views, reactions, links, photo and video URLs, plus channel subscribers. $0.80 per 1,000 posts.","summary":"Scrape posts from public Telegram channels without a Telegram account, phone number or API key. For each channel you get its newest posts as clean rows — text and markdown, date, views, reactions, links, hashtags, photo/video/file URLs, forwards and replies — plus the channel info (title, description, subscribers, photo, verified badge) for free. Built for news and crypto monitoring, brand and community tracking, research datasets and AI agents.","pricing":{"model":"pay-per-event","currency":"USD","billedBy":"Apify","freePlanMaxItemsPerRun":10,"events":[{"name":"post","title":"Telegram post","description":"Charged once per channel post delivered (text, date, views, reactions, links, media URLs).","priceUsd":0.0008}]},"input":{"description":"Public Telegram channels to read. Each channel delivers its newest posts first (one charged row per post) and one free summary record with the channel info.","required":["channels"],"fields":[{"name":"channels","title":"Channels","type":"array","required":true,"description":"Public channel usernames or links, one per line: telegram, @telegram, https://t.me/telegram or https://t.me/s/telegram (a post link works too). Private channels and invite links (t.me/+…) have no public preview. Accounts on the Apify free plan can process up to 10 channels per run, with up to 20 posts each.","prefill":["telegram"],"editor":"stringList"},{"name":"maxPostsPerChannel","title":"Max posts per channel","type":"integer","required":false,"description":"Newest posts to deliver per channel (Telegram serves 20 per page).","default":20,"prefill":10,"minimum":1,"maximum":5000},{"name":"postedAfter","title":"Posted after","type":"string","required":false,"description":"Only posts on or after this date: YYYY-MM-DD, an ISO date-time, or a relative period such as \"7 days\". Paging stops at the first older post.","editor":"textfield"},{"name":"beforePostId","title":"Start before post ID","type":"integer","required":false,"description":"Start with the posts older than this post ID (e.g. the oldestPostIdSeen of an earlier run) to continue a backfill.","minimum":2},{"name":"maxChannels","title":"Max channels","type":"integer","required":false,"description":"Safety cap on channels in this run; the rest are ignored and counted as inputItemsDropped in the OUTPUT record.","default":100,"minimum":1,"maximum":1000},{"name":"concurrency","title":"Concurrency","type":"integer","required":false,"description":"Channels read in parallel (requests to t.me are rate limited for the whole run).","default":2,"minimum":1,"maximum":5},{"name":"includeRaw","title":"Include raw HTML","type":"boolean","required":false,"description":"Attach each post's HTML block from the public preview page (larger output).","default":false}]},"exampleInput":{"channels":["telegram"],"maxPostsPerChannel":10},"outputFields":[{"name":"input","type":"string | object","title":"Input","description":"The channel this record belongs to (canonical username)."},{"name":"recordType","type":"string","title":"Record type","description":"post (charged) or summary (one per channel, with the channel info; free).","example":"post"},{"name":"position","type":"integer","title":"Position","description":"Post number within its channel in this run (1 = newest)."},{"name":"status","type":"string","title":"Status","description":"ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered","example":"ok"},{"name":"charged","type":"boolean","title":"Charged","description":"Whether this record incurred a pay-per-event charge."},{"name":"chargedEvent","type":"string","title":"Charged event","description":"Pay-per-event event charged for this record (present only when charged)."},{"name":"chargedCount","type":"integer","title":"Events charged","description":"Events actually charged when the charge came back short of the requested count (present only then; a warning explains it)."},{"name":"source","type":"string","title":"Source","description":"Upstream data source."},{"name":"fetchedAt","type":"string","title":"Fetched at","description":"ISO timestamp."},{"name":"error","type":"object","title":"Error","description":"{ code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: rate_limit, timeout, network, server, client, invalid_response, not_found; this Actor: invalid_input."},{"name":"warnings","type":"array","title":"Warnings","description":"Notes about this record, e.g. a cap or the budget that stopped a channel early."},{"name":"channel","type":"string","title":"Channel","description":"Channel username (lower case)."},{"name":"postId","type":"integer","title":"Post ID","description":"Message id within the channel."},{"name":"url","type":"string","title":"Post URL","description":"https://t.me/<channel>/<postId>"},{"name":"date","type":"string | null","title":"Date","description":"Publication time, ISO 8601 UTC."},{"name":"edited","type":"boolean","title":"Edited","description":"The post was edited after publication."},{"name":"author","type":"string | null","title":"Author signature","description":"Author name shown on the post, when the channel signs posts."},{"name":"text","type":"string | null","title":"Text","description":"Plain text of the post or caption."},{"name":"markdown","type":"string | null","title":"Markdown","description":"The same text with bold, italic, links, code and quotes as markdown."},{"name":"views","type":"integer | null","title":"Views","description":"View count (approximate when Telegram abbreviates it)."},{"name":"viewsText","type":"string | null","title":"Views (as shown)","description":"The view count as Telegram shows it, e.g. 1.56M."},{"name":"reactions","type":"array","title":"Reactions","description":"[{ emoji, count }]: the emoji, paid (Telegram Stars) or custom:<id> for a custom emoji."},{"name":"reactionsTotal","type":"integer | null","title":"Reactions total","description":"Sum of all reaction counts."},{"name":"forwardedFrom","type":"object | null","title":"Forwarded from","description":"{ name, url, username } of the original sender of a forwarded post (fields are null when hidden)."},{"name":"replyTo","type":"object | null","title":"Reply to","description":"{ postId, url, author, text } of the post this one replies to."},{"name":"links","type":"array","title":"Links","description":"Links in the text and the link preview."},{"name":"hashtags","type":"array","title":"Hashtags","description":"#hashtags in the text."},{"name":"mentions","type":"array","title":"Mentions","description":"@mentions in the text."},{"name":"linkPreview","type":"object | null","title":"Link preview","description":"{ url, siteName, title, description, imageUrl } of the attached link preview."},{"name":"poll","type":"object | null","title":"Poll","description":"{ question, type, options: [{ text, percent }] }."},{"name":"media","type":"array","title":"Media","description":"[{ type, url, thumbnailUrl, postUrl, durationSecs, title, details }]; type: photo, video, round_video, document, audio, voice, sticker, location."},{"name":"mediaTypes","type":"array","title":"Media types","description":"Distinct media types of the post."},{"name":"mediaNotSupported","type":"boolean","title":"Media only in the app","description":"Telegram shows this post's media only in its apps."},{"name":"channelTitle","type":"string | null","title":"Channel title","description":"The channel's display name."},{"name":"raw","type":"string","title":"Raw HTML","description":"The post's HTML block from the preview page (only with includeRaw)."},{"name":"channelDescription","type":"string | null","title":"Channel description","description":"Summary records: the channel's description."},{"name":"subscribers","type":"integer | null","title":"Subscribers","description":"Summary records: subscriber count (approximate when abbreviated)."},{"name":"subscribersText","type":"string | null","title":"Subscribers (as shown)","description":"Summary records: e.g. 9.33M."},{"name":"photoUrl","type":"string | null","title":"Channel photo","description":"Summary records: channel photo URL."},{"name":"verified","type":"boolean","title":"Verified","description":"Summary records: the channel has Telegram's verified badge."},{"name":"counters","type":"object","title":"Counters","description":"Summary records: other header counters (photos, videos, files, links)."},{"name":"channelUrl","type":"string | null","title":"Channel URL","description":"Summary records: https://t.me/<channel>."},{"name":"oldestPostIdSeen","type":"integer | null","title":"Oldest post ID seen","description":"Summary records: the oldest post ID this run delivered (null when none); pass it as beforePostId to continue further back."},{"name":"resultsDelivered","type":"integer","title":"Posts delivered","description":"Summary records: charged post rows of this channel."},{"name":"stopReason","type":"string","title":"Stop reason","description":"Summary records: limit | free_plan | end | budget | aborted | deadline | empty_pages | max_pages | error."}],"outputExample":[{"input":"synthetic_news","recordType":"post","position":1,"channel":"synthetic_news","postId":101,"url":"https://t.me/synthetic_news/101","date":"2026-10-10T08:00:00.000Z","edited":true,"author":"Synthetic Editor","text":"✨ Big update is out: read the release notes.","markdown":"✨ **Big update** is out: read the [release notes](https://example.com/blog/update).","views":15300,"viewsText":"15.3K","reactions":[{"emoji":"👍","count":1200},{"emoji":"paid","count":12}],"reactionsTotal":1212,"forwardedFrom":null,"replyTo":null,"links":["https://example.com/blog/update"],"hashtags":["#release"],"mentions":[],"linkPreview":{"url":"https://example.com/blog/update","siteName":"Example Blog","title":"Release notes","description":"Everything new in this release.","imageUrl":"https://cdn4.example-cdn.test/file/preview.jpg"},"poll":null,"media":[{"type":"photo","url":null,"thumbnailUrl":"https://cdn4.example-cdn.test/file/photo-101.jpg","postUrl":"https://t.me/synthetic_news/101","durationSecs":null,"title":null,"details":null}],"mediaTypes":["photo"],"mediaNotSupported":false,"channelTitle":"Synthetic News","status":"ok","charged":true,"chargedEvent":"post","source":"telegram","fetchedAt":"2026-10-14T12:00:00.000Z"},{"input":"synthetic_news","channel":"synthetic_news","channelTitle":"Synthetic News","channelDescription":"Test headlines for a synthetic channel.","subscribers":1250000,"subscribersText":"1.25M","photoUrl":"https://cdn1.example-cdn.test/file/channel-photo.jpg","verified":true,"counters":{"photos":412,"videos":38,"links":2100},"channelUrl":"https://t.me/synthetic_news","oldestPostIdSeen":82,"recordType":"summary","resultsDelivered":20,"stopReason":"limit","status":"ok","charged":false,"source":"telegram","fetchedAt":"2026-10-14T12:00:02.000Z"}],"faq":[{"question":"Do I need a Telegram account, phone number or API key?","answer":"No. The Actor reads the public web preview Telegram shows for every public channel at `t.me/s/<channel>`; no login is involved."},{"question":"Which channels work?","answer":"Public channels with a username. Private channels, invite links (t.me/+…), groups, bots and user accounts have no public preview and come back as not_found (free)."},{"question":"Are view and subscriber counts exact?","answer":"Telegram rounds them on the preview (for example 1.56M). The Actor returns the number it shows (views: 1560000) next to the original text (viewsText: \"1.56M\")."},{"question":"How do I scrape only new posts every day?","answer":"Schedule the Actor with postedAfter set to a relative period such as \"1 day\", or keep the oldestPostIdSeen of a run and pass it as beforePostId to continue a backfill."}],"mcpExamplePrompt":"Use telegram-channel-scraper to get the last 20 posts of the telegram channel and summarize what was announced, with dates and view counts.","related":["hacker-news-scraper","substack-scraper","reddit-subreddit-posts","brand-mentions-monitor","youtube-channel-videos","url-to-markdown-summary"],"urls":{"site":"https://www.sfoln.com/actors/telegram-channel-scraper/","siteJson":"https://www.sfoln.com/actors/telegram-channel-scraper.json","siteMarkdown":"https://www.sfoln.com/actors/telegram-channel-scraper.md","runSync":"https://api.apify.com/v2/actors/sfoln~telegram-channel-scraper/run-sync-get-dataset-items","runAsync":"https://api.apify.com/v2/actors/sfoln~telegram-channel-scraper/runs","mcp":"https://mcp.apify.com?tools=sfoln/telegram-channel-scraper","requestAccess":"mailto:contact@sfoln.com?subject=Access%20request%3A%20Telegram%20Channel%20Scraper%20%E2%80%93%20Public%20Posts%20(sfoln%2Ftelegram-channel-scraper)&body=Please%20publish%20telegram-channel-scraper.%20What%20we%20plan%20to%20use%20it%20for%3A"},"publisher":{"name":"SFOLN LLC","apifyUsername":"sfoln","url":"https://www.sfoln.com","apifyProfile":"https://apify.com/sfoln","email":"contact@sfoln.com"},"generatedAt":"2026-10-22T04:28:58.477Z"}