Telegram Channel Scraper - Posts & Views, No Login avatar

Telegram Channel Scraper - Posts & Views, No Login

Pricing

from $0.40 / 1,000 post rows

Go to Apify Store
Telegram Channel Scraper - Posts & Views, No Login

Telegram Channel Scraper - Posts & Views, No Login

Scrape posts from public Telegram channels without login or API keys: text, date, views, media, links, forwards, reactions and channel info. Search inside channels, filter by date and get only new posts on a schedule.

Pricing

from $0.40 / 1,000 post rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Scrape posts from public Telegram channels with no login, no phone number and no API keys, and get clean JSON rows with text, date, view count as a number, media links, reactions, forwards and channel info with the exact subscriber count.

Use it for news and crypto monitoring, research archives or AI pipelines: the smallest run is one channel name, such as durov, and two channels with 20 posts each finish in about 5 seconds for about $0.08 on the Free plan.

Telegram Channel Scraper: channel names, @handles or t.me links in; every public post with views, media and reactions out as clean rows. No login.

Table of contents

What it does

The Actor reads the public web preview of a Telegram channel (t.me/s/<channel>), the page that anyone can open in a browser without a Telegram account. For each channel you give, it saves the newest posts (or the posts that match your search), plus one row about the channel. It can stop at a date, search inside the channel with Telegram's own search, and on a schedule return only posts that are new since the last run. Every channel gets a clear status, so a wrong name is never mixed up with a quiet channel.

Good fit

  • Follow what a list of public news, crypto or brand channels posted today.
  • Build a dataset of posts with text, views, reactions, media and links.
  • Find posts about a keyword or #hashtag inside many channels at once.
  • Get subscriber counts and descriptions of many channels.
  • Send only new posts to a spreadsheet, a chat or an AI agent every hour.

Not a fit / limits

  • Only public channels that have a web preview. Private channels, invite links (t.me/+...), groups, chats, users and bots are not supported.
  • No comments, no member or subscriber lists, no DMs, no global Telegram search: only posts of the channels you give.
  • Telegram rounds view and reaction counts on the web (for example 830K). The Actor turns them into numbers (830000); it cannot make them more exact than Telegram shows.
  • Videos: the web preview usually gives only a preview image, not the video file. Photo links work, but all media links are temporary.
  • One run reads about 1,800 posts in full; at about 4.5 minutes it stops and keeps what it has (see Limits).

Quick start

  1. Open the Input tab.
  2. Add one or more channels to Channels (channels), for example durov and telegram (this is the prefill).
  3. Keep Max posts per channel (maxPostsPerChannel) at 20, or set a higher number.
  4. Click Start.
  5. Open the Output tab: the Posts view shows the post columns (channel, date, text, views, media); the Channels view shows the channel columns (status, title, subscribers). Both views list all rows; the Row type column tells posts and channels apart.

Expected result: 20 posts per channel, newest first, and one channel row each, in about 5 seconds.

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
channelsChannelsarray of stringsyesprefill ["durov", "telegram"]1–100 items: name, @name, https://t.me/name or https://t.me/s/namewhich channels to read["bbcrussian", "@telegram"]Repeats in any spelling are read once. Invalid values are skipped and counted in the run message; the rest still run.
maxPostsPerChannelMax posts per channelintegernodefault 20, prefill 201–1000how many posts per channel, newest first200Each post row is charged; keep it small for frequent runs.
sinceOnly posts sincestringnoempty (no date limit)date 2026-10-01, date-time 2026-10-01T12:00:00Z, or 30 minutes, 24 hours, 7 days, 2 weeks, 1 monthskips older posts and stops reading the channel there"7 days"The best way to keep runs short and cheap.
searchQuerySearch inside channelsstringnoemptyup to 200 characters; a word, phrase or #hashtag, any languagereturns only posts that Telegram's channel search matches"bitcoin"Leave empty to get all posts.
includeChannelInfoExact subscriber countbooleannotruetrue / falseone extra request per channel for the exact number in subscribersfalseTurn off when the rounded subscribersText (10.4M) is enough.
onlyNewOnly new posts since the last runbooleannofalsetrue / falseremembers the newest post per channel and next time returns only newer poststrueFor schedules; see Scheduling and monitoring.
stateKeyMonitoring namestringnodefault1–40 letters, digits, - or _keeps separate memory for different schedules"crypto-news"Use one name per schedule.

If no value in channels is a valid channel name, the run fails with Invalid input and only the start fee is charged.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Both setmaxPostsPerChannelsincereading stops at whichever comes first200 and "1 day"fewer posts and requests
Search and datesearchQuerysincematches newer than since, newest first"#news" and "7 days"fewer posts
MonitoringonlyNewmaxPostsPerChannelat most this many new posts per run, oldest new post first; the rest come next runtrue and 50no gaps between runs
Monitoring and searchonlyNewsearchQuerymemory is kept per channel and search; the newest matches come firsttrue and "ton"set maxPostsPerChannel above the expected number of new matches
Monitoring and dateonlyNewsinceboth apply; posts older than since are skippedtrue and "1 day"—

Input examples

Latest posts of two channels

{
"channels": ["durov", "telegram"],
"maxPostsPerChannel": 20
}

Expected behavior: about 4 requests, about 5 seconds. Expected output: 40 post rows and 2 channel rows with subscribers. Cost: $0.0841 on the Free plan.

Last 7 days of several channels, search for a word

{
"channels": ["bbcrussian", "meduzalive", "nexta_live"],
"since": "7 days",
"searchQuery": "Россия",
"maxPostsPerChannel": 100
}

Expected behavior: only posts that Telegram's search matches, newer than 7 days. Expected output: post rows with searchQuery set; channel rows with status.

Hourly monitoring

{
"channels": ["durov", "telegram"],
"maxPostsPerChannel": 50,
"onlyNew": true,
"stateKey": "telegram-news",
"includeChannelInfo": false
}

Expected behavior: the first run returns the newest posts and remembers them; every next run returns only posts published after that. Expected output: new post rows only; with nothing new, the run ends as NO_RESULTS with 2 channel rows.

Output

Results go to the default Dataset. Each row has recordType: post or channel. The dataset has two views, Posts and Channels. A view only picks columns, it does not hide rows: post rows and channel rows are in both views. To keep only posts, filter by recordType = post (for example in Excel, Google Sheets or your code). A run summary is saved as RUN_SUMMARY in the key-value store. The Output tab links all three.

Output example

{
"recordType": "post",
"channel": "durov",
"channelTitle": "Pavel Durov",
"postId": 552,
"url": "https://t.me/durov/552",
"date": "2026-10-11T14:52:40+00:00",
"edited": false,
"text": "✨ Designers × AI\n\n🆕 The mockup era is over. …",
"author": "Pavel Durov",
"views": 830000,
"viewsText": "830K",
"forwardedFrom": "Telegram Designers",
"forwardedFromUrl": "https://t.me/designers/266",
"replyToPostId": null,
"replyToUrl": null,
"mediaType": "video",
"mediaUrl": "https://cdn4.telesco.pe/file/…",
"media": [
{
"type": "video",
"url": null,
"thumbnailUrl": "https://cdn4.telesco.pe/file/…",
"durationText": "1:15",
"title": null
}
],
"linkPreview": null,
"poll": null,
"links": ["https://t.me/designers"],
"hashtags": [],
"reactions": [
{ "emoji": "⭐", "paid": true, "count": 5280, "countText": "5.28K" },
{ "emoji": "custom:5936157098181135162", "paid": false, "count": 10700, "countText": "10.7K" }
],
"searchQuery": null,
"sourceUrl": "https://t.me/s/durov",
"fetchedAt": "2026-10-14T15:01:48.976Z"
}

This post row is from the first input example; the text, media links and reactions are shortened. null means Telegram shows no value for this post (not a reply, no link preview, no poll). For this video the web preview has only a preview image, so media[0].url is null.

Post fields

FieldMeaningTypeCan be empty?Example / enumNotes
recordTyperow typestringnopost
channelchannel usernamestringnodurovas in the channel link
channelTitlechannel namestringyesPavel Durov
postIdpost number in the channelintegerno552with channel, a stable key to remove duplicates
urllink to the poststringnohttps://t.me/durov/552
datewhen it was postedstringyes2026-10-11T14:52:40+00:00ISO 8601, UTC
editedthe post was editedbooleannofalse
textpost textstringcan be ""✨ Designers × AI…line breaks kept; "" for media-only posts
authorsignature shown under the poststringyesPavel Durovonly if the channel signs posts
viewsviews as a numberintegeryes830000from viewsText; rounded by Telegram
viewsTextviews as Telegram shows themstringyes830K
forwardedFrom, forwardedFromUrloriginal channel or person of a forwarded poststringyesTelegram Designersnull if not forwarded
replyToPostId, replyToUrlthe post this one replies tointeger, stringyesnull
mediaTypemain media typestringyesphoto, video, round_video, document, audio, voice, sticker, poll, location, album, unsupportednull for text-only posts
mediaUrlfirst media linkstringyeshttps://cdn4.telesco.pe/file/…photo image or video preview image; temporary
mediaall media: type, url, thumbnailUrl, durationText, titlearraycan be []see exampleurl is null when the preview has no file link
linkPreviewlink card: url, siteName, title, description, imageUrlobjectyesnull if the post has no link card
pollquestion, type, votersText, options[] (text, percent)objectyesnull if no poll
linkslinks in the textarraycan be []["https://t.me/designers"]
hashtagshashtagsarraycan be []["#news"]
reactionsemoji, paid (Telegram Stars), count, countTextarraycan be []see examplecustom emoji appear as custom:<id>
searchQuerythe search that found this poststringyesnullnull when no search was used
sourceUrlpage the post was read fromstringnohttps://t.me/s/durov
fetchedAtwhen the run read itstringno2026-10-14T15:01:48.976Zviews and reactions are as of this time

Channel fields

One channel row per valid channel, also when the channel is not found. If the run stops in the middle of a channel (time or request limit), that channel gets one more row with status: capped; this row is free.

FieldMeaningTypeCan be empty?Example / enum
recordTyperow typestringnochannel
statusresult for this channelstringnocomplete, not_found, error, capped
statusCodewhy, when not completestringyesNOT_FOUND, NO_PUBLIC_PREVIEW, or an error code
statusReasonplain explanationstringyes"telegram" exists on Telegram but has no public channel preview…
channel, urlusername and linkstringnodurov, https://t.me/durov
title, descriptionchannel name and descriptionstringyesPavel Durov, Founder of Telegram.
verifiedverified badgebooleanyestrue
avatarUrlchannel photo (temporary link)stringyes
subscribersexact subscriber countintegeryes10386608 — null when includeChannelInfo is off
subscribersTextsubscribers as Telegram shows themstringyes10.4M
photos, videos, files, linksSharedmedia counters from the channel pageintegeryes102, 47, null, 200
postsReturnedposts saved for this channelintegeryes
sourceUrl, fetchedAtpage and timestringno

Run summary (RUN_SUMMARY)

FieldMeaning
statusCOMPLETE, PARTIAL (some channels not found or failed), NOT_FOUND (no channel found), NO_RESULTS (channels found, no posts matched), CAPPED (stopped at a limit, rows kept), SOURCE_ERROR, ERROR, INVALID_INPUT
messagethe same text as the run status message
requestedthe settings used
countschannels, postRows, channelRows, notFound, errors, chargedPostRows, chargedChannelRows, invalidChannels, unprocessedChannels
channels[]one entry per channel: channel, outcome (complete, no_posts, not_found, no_public_preview, error, capped, unprocessed), posts, pages, newestPostId, oldestPostId, watermarkBefore, watermarkAfter (monitoring), reason
warnings, http, source, timingwarnings, request counters, data source note, start and finish time

Output entities and surfaces

SituationWhereResult shapeUser action
NormalDataset, Posts and Channels viewspost rows + one channel row per channelopen, export or call the API
Channel does not existChannels view, RUN_SUMMARYstatus: not_found, statusCode: NOT_FOUNDcheck the name
Group, user, bot or preview turned offChannels viewnot_found / NO_PUBLIC_PREVIEWonly public channels work
No posts in the period or no search matchRUN_SUMMARYNO_RESULTS, channel rows complete, outcome no_postswiden since or change the search
Stopped at a limitDataset + RUN_SUMMARYrows kept, CAPPED, cut channel status: capped, unread channels unprocessedsplit the list into smaller runs
Telegram not answeringRUN_SUMMARY, run FAILEDSOURCE_ERROR (rows kept) or ERRORtry again later

Runs with COMPLETE, PARTIAL, NOT_FOUND, NO_RESULTS or CAPPED end as SUCCEEDED; SOURCE_ERROR, ERROR and INVALID_INPUT end as FAILED.

Pricing

Pricing unit

You pay per event. Prices per 1,000 events:

EventFreeBronzeSilverGoldPlatinumDiamond
Post — one saved post row$2.00$1.60$1.30$0.40$0.40$0.40
Channel — one channel row (found or not found)$2.00$1.80$1.50$1.00$1.00$1.00

Each run also has a start fee of $0.0001. Platform usage is included.

  • A channel that Telegram answered about is charged once: found (complete) or not found (not_found). A channel row with status: error is free.
  • Invalid input values are not charged. A run with no valid channel pays only the start fee.
  • A run with no matching posts, or a monitoring run with nothing new, pays only for the channel rows and the start fee.
  • If you set a maximum cost per run, the Actor stops before it goes over it and keeps the rows already saved.

Cost examples (Free plan prices)

ScenarioInput scopeEventsChargeTime
Prefill2 channels × 20 posts2 channels + 40 posts$0.0841about 5 s
Medium5 channels × 100 posts5 + 500$1.0101about 1 minute
Large10 channels × 180 posts10 + 1,800$3.6201about 3.5 minutes
Nothing new2 channels, onlyNew, no new posts2 channels$0.0041a few seconds
Wrong names3 channels not found3 channels$0.0061a few seconds

On the Gold, Platinum and Diamond plans the prefill run costs $0.0181.

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Hourly news or crypto monitoringchannels + onlyNewpostdate, text, url, viewsSchedule + webhook, Google Sheets, Slack
Post engagement researchchannels + maxPostsPerChannelpostviews, reactions, forwardedFromCSV / Excel export
Keyword trackingchannels + searchQuery + sinceposttext, date, searchQueryAPI, spreadsheet
Channel directorychannels + includeChannelInfochannelsubscribers, title, description, verifiedAPI, spreadsheet
AI agent contextchannels (small)posttext, date, urlMCP

Scheduling and monitoring

Create a schedule (for example every hour) with onlyNew: true and a stateKey such as telegram-news. The first run returns the newest posts and remembers the newest post of each channel. Every next run returns only posts published after it, oldest first, without gaps: if more posts arrived than maxPostsPerChannel, the rest come in the next run. The memory is kept in your account, in the key-value store telegram-channel-scraper-state; use a different stateKey for each schedule. A run with nothing new ends as NO_RESULTS and costs only the channel rows. Add a webhook or an integration to send new rows to Slack, a sheet or your own API when the run finishes.

Without onlyNew, use since: "1 day" and remove duplicates by channel + postId.

Switching from another Telegram scraper

Some Telegram scrapers return rows like username, fullName, followers and a message object, and give views as text. This Actor uses flat fields and numbers:

Other scraperThis Actor
usernamechannel
fullNamechannelTitle (post row), title (channel row)
followerssubscribers (exact) and subscribersText
message.fulldatedate (ISO 8601, UTC)
message.views (1.16M as text)views (1160000) and viewsText
message.descriptiontext
message.linkurl
previewlinkPreview
image, videomedia[] with type, url, thumbnailUrl

Channels that are not found get their own row with status: not_found and a reason, not an empty row.

API, export and integrations

  • API: start a run with POST https://api.apify.com/v2/acts/cliqtomedia~telegram-channel-scraper/runs and the input JSON; read rows from the run's Dataset and keep the rows with the recordType you need (?view=posts or ?view=channels only picks the columns), and read the summary from the RUN_SUMMARY record.
  • Export: JSON, CSV, Excel, XML or RSS from the Dataset.
  • Webhooks / no-code: Apify integrations (Make, Zapier, Google Sheets, Slack) can send new rows when a run finishes.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/telegram-channel-scraper.
  • Smallest useful input: {"channels": ["durov", "telegram"], "maxPostsPerChannel": 20}.
  • Key fields: text (what was posted), date (when), url (link to cite), channel (where), views (reach as a number).
  • Two channels with 20 posts take about 5 seconds and cost about $0.08 on the Free plan. One run reads up to about 1,800 posts; use since or searchQuery to keep answers short.

Limits and partial results

  • Up to 100 channels per run and 1,000 posts per channel. Telegram's web preview gives about 20 posts per page, and the Actor reads about one page per second.
  • Each run stops reading Telegram after about 4.5 minutes, whatever the run timeout is. That is enough for about 1,800 posts. If the time runs out, saved rows stay, the run is CAPPED, the channel being read is capped and the rest are unprocessed. Split large lists into several runs.
  • If you set a maximum cost per run, the Actor stops before going over it: rows already saved stay, the run is SUCCEEDED with CAPPED in RUN_SUMMARY.
  • View, reaction and subscriber texts are rounded by Telegram; only subscribers with includeChannelInfo is exact.
  • Media links (telesco.pe) expire after some time. Download the files soon if you need them.

Troubleshooting

A channel returns no posts

Check its channel row (recordType = channel) in the Channels view: not_found / NOT_FOUND (wrong name), not_found / NO_PUBLIC_PREVIEW (a group, user, bot or a channel with the web preview turned off), or complete with outcome no_posts in RUN_SUMMARY (nothing matched since or searchQuery).

The run ends as CAPPED

Read RUN_SUMMARY.message: either the maximum cost you set was reached, or the run reached its 4.5-minute reading limit. Saved rows stay in the Dataset. Lower maxPostsPerChannel, use since, or split the channel list.

Some of my values were skipped as invalid

Only channel names (3–32 letters, digits or _, starting with a letter), @name and t.me links work. Invite links (t.me/+...) and other websites are skipped; the run message says how many.

The run fails with SOURCE_ERROR or ERROR

Telegram did not answer or asked the Actor to slow down several times. Rows saved before the error stay in the Dataset. Try again later.

FAQ

Do I need a Telegram account, phone number or API key?

No. The Actor reads only the public web preview that Telegram shows to anyone, without login.

Why are views like 830000 and not exact?

Telegram shows rounded counts on the web (830K). The Actor gives you the number (views) and the original text (viewsText). Exact view counts are not public.

Can I get comments, members or posts from private channels?

No. These are not in the public web preview.

Are the counts live?

Views, reactions and subscribers are as they were at fetchedAt. Run again to refresh them.

Is scraping Telegram allowed?

The Actor reads only public pages that Telegram shows without login, at a slow rate, and does not bypass any login or CAPTCHA. You are responsible for how you collect, store and reuse the content, including personal data and authors' rights, under Telegram's terms and the laws that apply to you.

Learn more

Support

Use the Issues tab of this Actor for bugs, questions and feature requests. Include the run ID, the input and the error text. Never post tokens, cookies or private data.