Telegram Channel Messages Scraper with Comments
CleanScrape · @cleanscrape
Public Telegram channel posts with views, reactions, media and comments, exact subscriber counts, and only new posts on a schedule.

About
Export public Telegram channel messages without a Telegram account, phone number or API key. Paste channel names or links and get every post's text, date, views, reactions, media and links as a table you can download as CSV, Excel or JSON. Add the public comments, search inside a channel, filter by date or words, and schedule it to get only new posts.
Each channel also gets a row with its name, description and exact subscriber count. This is an independent tool, maintained by CleanScrape.
Start with a small run
- In Channels or post links, keep
TelegramTipsor paste the channels you follow:@durov,https://t.me/telegram,t.me/s/tginfoor a link to one post all work, one per line. - Leave Posts per channel at 20 for a first look.
- Start the run and open its dataset. Download CSV or Excel for a spreadsheet, or JSON to keep reactions and media as lists.
No channel IDs, cookies or login are needed. Only public channels work: private channels, groups and invite links don't have a public web view.
Choose what to collect
Recent posts: posts come newest first. Posts per channel applies to each channel or post link, and the same channel pasted twice is read once.
One post: paste a link such as https://t.me/TelegramTips/576 to save that post (and its comments, if you turn them on).
Posts about a topic: Search within channels asks Telegram for the posts that match, in the channels you supplied. Telegram chooses the matches. For a strict check of the post text, use Include words or Exclude words: any included word or phrase keeps a post, any excluded one drops it, ignoring case.
A date range: Last 7 days, Last 30 days or Custom dates, by the post's publication time in UTC. The end date includes the whole day.
Comments: turn on Include comments to save up to Comments per post of each post's most recent public comments, for channels that have comments switched on. Each comment has its text, date, reactions, media, the comment it replies to and the commenter's display name as Telegram shows it to visitors who are not logged in (Telegram hides names in some regions; then the name is empty). Names are personal data: store and use them with care.
Get only new posts on a schedule
Turn on Only new posts and add a Bytewells schedule with the same input (hourly or daily, for example):
- The first run saves the newest posts (up to Posts per channel) as the starting point.
- Each later run saves only posts published since, and stops reading a channel as soon as it reaches posts it already covered, so a check takes a page or two per channel.
- If more new posts arrived than Posts per channel allows, the next run continues where this one stopped. No new post is skipped, and none is saved twice.
Runs with the same channels share one history. To keep the history when you add or remove channels, give it a Watch name, such as Crypto news channels. Changing the search or the words starts a new history, so different filters are never mixed. The history is kept in your own Bytewells account, and two runs of the same watch can't overlap.
Examples
The last 100 posts of three channels:
{
"channels": ["TelegramTips", "@durov", "https://t.me/telegram"],
"maxPosts": 100
}
Posts that mention a topic in the last 30 days, with their comments:
{
"channels": ["tginfo"],
"search": "Stories",
"period": "30days",
"includeComments": true,
"commentsPerPost": 50
}
A schedule that saves only new posts from a list of channels:
{
"channels": ["TelegramTips", "durov", "telegram"],
"maxPosts": 200,
"onlyNew": true,
"watchName": "telegram-news"
}
What you get
Bytewells gives a run one dataset, so posts, comments and channels are rows of the same table, told apart by rowType. Filter on it in your spreadsheet, or pick the Posts, Comments or Channels view.
rowType | Contents |
|---|---|
post | Channel, post ID, date, text, views, reactions, media, links, link preview, poll, forwarded from, signature, post link |
comment | One row per comment: post ID, comment ID, date, display name, text, reactions, media, the comment it replies to |
channel | Channel name, description and subscriber count |
The run summary (SUMMARY, a JSON record in the run's key-value store) lists for every input the posts saved, pages read, the oldest and newest post, and why collection stopped.
recordId (channel/post ID, plus the comment ID for comments) is a stable key for joining exports. IDs are kept as text.
Reading the counts
Telegram rounds views and reactions above 1,000: viewsText: "6.23K" becomes views: 6230 with viewsApproximate: true. It is a rounded number, not an exact count. Subscriber counts come from the channel page and are exact (subscribersApproximate: false). Missing values are null, never zero.
Media links point to files in Telegram's public preview; they can expire, and files are not downloaded. Custom emoji reactions have an ID but no readable character.
Check coverage before treating an export as complete
Posts per channel is a maximum, not a promise. Each input's reason in the run summary says why it stopped: the post limit, Pages per channel, the start date, the oldest visible post, no matching posts, or no public preview. A channel without a public preview may be private, renamed, removed, a group or a user account; the other channels still run.
Telegram's comment widget shows the most recent comments of a post (in one test, 97 of 104). The summary keeps the total Telegram shows and the number saved, so a large discussion is never presented as complete when it isn't.
This Actor does not search all of Telegram, list group members, read private chats or log in to an account.
Pricing
$19 a month to rent it, after a 7-day free trial, long enough to see a week of scheduled checks. Cancel at any time; access runs to the end of the month you paid for.
Runs use a little compute, paid from your Bytewells credit at Bytewells' rates, separately from the rental. No proxy is needed. In tests on Bytewells, the latest 20 posts of a channel used $0.0002 of credit, 5 posts with 220 comments $0.0004, 1,000 posts of one channel $0.0017, and a scheduled check of 3 channels with nothing new $0.0003.
There is no charge per post or comment, so monitoring many channels every hour costs the same rental.
Speed and limits
Requests to Telegram are paced (about one every 0.65 seconds) so runs stay polite and reliable. A page has about 20 posts, and each post with comments is one more request. Pages per channel (default 50) and Request limit (default 500) cap long runs; raise them for deep history, and give long runs a longer timeout. The run stops before its timeout and keeps what it saved.
Use it from the API
The Actor runs through the Bytewells API, which works with Apify's API clients: point the client's base URL at Bytewells (see Bytewells docs) and call cleanscrape/telegram-channel-messages-scraper with an input from the examples above. All rows are in the run's default dataset (filter on rowType); SUMMARY is a JSON record in its key-value store.
Common questions
Do I need a Telegram account or API key?
No. The Actor reads the public web view of channels (t.me/s/), which anyone can open in a browser without logging in.
Can it search all of Telegram?
No. It searches inside the channels you give it. Searching all of Telegram needs a logged-in account, which this Actor never uses.
Can I get private channels or group chats?
No. Only public channels have a public web view.
Are views exact?
Views and reactions are rounded by Telegram above 1,000 (viewsApproximate says when). Subscriber counts are exact.
How far back can it go?
As far as the channel's public history goes; one test reached posts from 2015. Raise Posts per channel, Pages per channel and Request limit for deep history.
What does a run cost on top of the rental?
Only the compute it uses, from your Bytewells credit. Test runs used $0.0002 to $0.0017 each.
Is it legal to scrape Telegram channels?
The Actor reads pages that Telegram publishes for anyone, without logging in, at a gentle pace, and it doesn't get around any protection. Telegram's terms restrict some uses of its content, including training AI models without consent, so check the rules that apply to how you store and use the data. This is not legal advice.
Support
CleanScrape maintains this Actor and fixes it when Telegram changes its pages. If something looks wrong, email [email protected] with the run ID and the channel or post link. Never include passwords, session cookies or private messages.
Disclaimer
This Actor is an independent tool developed by CleanScrape. It is not affiliated with, endorsed by, or sponsored by Telegram. Telegram and other trademarks belong to their owners and are used only to identify the source.
More tools from CleanScrape
- Google Trends Scraper API for Interest Over Time: search interest over time, by region, related queries and trending searches
- Economic Calendar API for Official Release Dates: release dates and times for CPI, jobs, GDP and central bank decisions in five economies
- Career Page Jobs Scraper for Workday, Greenhouse and Lever: open jobs from company career pages, with salaries and new or closed jobs
- Whatnot Scraper for Listings and Live Shows: Whatnot listings with prices and sellers, live shows, and alerts for new listings
- Whatnot Seller Tracker for Top Sellers and Sales: top Whatnot sellers per category, items sold, sales per day and followers over time
- Google Flights Scraper and Fare Tracker: flight prices, airlines, stops and times for your routes and dates, with only new or cheaper flights
- App Store and Google Play Reviews Scraper: reviews from both app stores in one table, with daily alerts for new low ratings
- Shopify Product Reviews Scraper for Judge.me and Okendo: Judge.me and Okendo reviews from Shopify product, collection or store links
- Flashscore Tennis Scraper for Tennis Matches and Stats: tennis results, statistics, point-by-point, form and head-to-head
- ATP and WTA Tennis Rankings Scraper: current ATP and WTA singles, doubles and race rankings with points and movement
- Google News Scraper and RSS Feed Reader: Google News searches, sections and publisher feeds, with only new articles on a schedule
- Google Hotels Scraper for Google Travel Hotel Prices: hotel prices and every booking offer for your dates, adults and currency
FAQ
- Do I need a Telegram account or API key?
- No. It reads the public web view of channels (t.me/s/), which anyone can open without logging in.
- Can it read private channels or groups?
- No. Only public channels have a public web view. Private channels, groups and invite links are skipped and reported.
- How do I get only new posts?
- Turn on Only new posts and add a schedule. Each run saves only posts published since the last run of that watch; none is skipped or saved twice.
- Why a 7-day trial?
- Long enough to run a schedule for a week and see what monitoring your channels gives you.
- What does a run cost on top of the rental?
- Only the compute it uses, from your Bytewells credit. Test runs used $0.0002 to $0.0017 each.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
Fields
channelsPaste public channel names or links, one per line. Examples: @TelegramTips, https://t.me/TelegramTips or a link to one post.
maxPostsThe most posts to save per channel. Actual results can be lower.
Leave unchanged for a standard run.
periodLimit posts by publication date. The post and page limits still apply.
startDateFor Custom dates only. Leave empty for no lower date limit.
endDateFor Custom dates only. Includes the entire day in UTC.
searchOptional phrase to search in the channels you supplied. Telegram chooses matches. Applies to channel inputs, not individual post links.
includeWordsKeep posts containing any of these words or phrases in their text. Case does not matter.
excludeWordsSkip posts containing any of these words or phrases in their text.
includeCommentsAlso save recent public comments in their own table, when available.
commentsPerPostMaximum recent comments to save for each collected post. Telegram may expose fewer.
Get only new posts on every scheduled run.
onlyNewFor scheduled runs: save only posts that earlier runs with the same watch name did not save. The first run saves the newest posts as the starting point; later runs save what was published since. A run cut short by Posts per channel or a limit continues where it stopped on the next run, so no new post is skipped.
watchNameLeave empty, and runs with the same channels share one history. Or give a name, such as "Crypto news channels", to keep the history when you change the channel list. Changing the search or the words starts a new history.
Usually no changes needed.
maxPagesStops long or narrow searches after this many pages. Each page usually contains about 20 posts.
maxRequestsSafety limit for all source requests, including comments and retries.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is cleanscrape/telegram-channel-messages-scraper (or cleanscrape~telegram-channel-messages-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"channels": [
"TelegramTips"
],
"maxPosts": 20,
"period": "all",
"includeComments": false,
"commentsPerPost": 20,
"onlyNew": false,
"maxPages": 50,
"maxRequests": 500
};
const run = await client.actor('cleanscrape/telegram-channel-messages-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"channels": [
"TelegramTips"
],
"maxPosts": 20,
"period": "all",
"includeComments": False,
"commentsPerPost": 20,
"onlyNew": False,
"maxPages": 50,
"maxRequests": 500
}
run = client.actor("cleanscrape/telegram-channel-messages-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/cleanscrape~telegram-channel-messages-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"channels":["TelegramTips"],"maxPosts":20,"period":"all","includeComments":false,"commentsPerPost":20,"onlyNew":false,"maxPages":50,"maxRequests":500}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

Economic Calendar API for Official Release Dates
CleanScrape · @cleanscrape
Official release dates and times for CPI, jobs, GDP, retail sales and rate decisions in the US, euro area, UK, Canada and Australia, with watches.
AIAutomationDeveloper tools$19/mo3-day free trial
Google News Scraper and RSS Feed Reader
CleanScrape · @cleanscrape
Google News searches, sections and publisher feeds in one article table, with word and publisher filters and new-article monitoring.
NewsMarketingAutomation$12/mo7-day free trial
App Store and Google Play Reviews Scraper
CleanScrape · @cleanscrape
App Store and Google Play reviews in one table, with ratings, text, dates and app versions, plus daily alerts for new low ratings.
Developer toolsMarketingAutomation$12/mo7-day free trial
ATP and WTA Tennis Rankings Scraper
CleanScrape · @cleanscrape
Current ATP and WTA rankings from Flashscore: singles, doubles and the races, with points, movement and country, by player or country.
OtherDeveloper toolsAutomation$12/mo7-day free trial
Career Page Jobs Scraper for Workday, Greenhouse and Lever
CleanScrape · @cleanscrape
Scrape jobs from company career pages on Workday, Greenhouse, Lever, Ashby and four more systems, with salaries and new or closed jobs.
AIAutomationJobs$29/mo3-day free trial
Flashscore Tennis Scraper for Tennis Matches and Stats
CleanScrape · @cleanscrape
Tennis results and match statistics from Flashscore by tournament, player or day, with point-by-point, form and head-to-head.
AutomationDeveloper toolsAI$19/mo3-day free trial