Telegram Channel Scraper — Search Without a Handle or Login
Pricing
Pay per event
Telegram Channel Scraper — Search Without a Handle or Login
Scrape public Telegram channels without an account: full post text, view counts, reactions, links, inline buttons, exact subscriber counts and server-side keyword search. Or search a curated catalog of verified channels by niche. No login, no phone number, no bot token, no API key.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Oswaldo Carabano
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
Telegram Channel Scraper
Read public Telegram channels without an account. Full post text, view counts, reactions, links, inline buttons, exact subscriber counts, and keyword search that runs on Telegram's side.
No login. No phone number. No bot token. No API key. No cookies.
That is not a limitation, it is the design. Scrapers that sign in with a phone number get their account banned and stop working; this one reads the same public preview pages Telegram serves to any anonymous visitor, so there is no session to expire and nothing to ban.
Three ways to use it
1. You know the channels. Put handles or URLs in channels. All of these mean the
same channel: durov, @durov, t.me/durov, https://t.me/s/durov.
2. You know the keyword, not the channels. Use mode: "discover" with
searchTerms and a niche. It searches a curated catalog of verified public
channels that ships with the Actor, so you do not need to know any channel names.
3. You want reach numbers. Use mode: "channel-info" for metadata and the exact
subscriber count, one row per channel.
What makes this one different
Keyword search runs on Telegram's side. Reading the whole history of a job channel to find 20 posts mentioning "react" took 25 requests and 712 KB. With keyword search it is 1 request and 24 KB for the same 20 results. You pay for relevant rows, not for the crawl.
Exact match is on by default, and it is free. Telegram's search uses stemming, not
substring matching: a search for hiring will return a post that says "hire a cab".
This Actor removes those false positives before delivery — and you are not charged
for a discarded candidate.
Exact subscriber counts. The channel preview shows a rounded 11.1M. This Actor
fetches one extra 4 KB page and gives you 11143438. You get both numbers, so you can
audit the conversion. Every abbreviated number is delivered as a pair: views and
views_raw.
t.me handles, not just @mentions. Telegram contacts are published two ways:
@SomeHandle and https://t.me/SomeHandle. Most scrapers only match the first. The
second is more common, and both get their own column.
Real diagnostics instead of "not found". When a channel cannot be read, the Actor makes one extra 4 KB request to tell you why: the channel does not exist, or it is a group, or a bot, or a user account, or a public channel with its web preview switched off. These rows are never charged.
The internal channel ID (telegram_channel_id) is in every row. It survives a
channel renaming its @username, which the handle does not.
Pricing
| Event | Price |
|---|---|
| Post | $0.001 |
| Search result | $0.001 |
| Channel record | $0.002 |
| Run start | $0.00001 |
Lower per result than any Telegram Actor on Apify with real usage — and with fields they do not return.
Three things you are never charged for:
- Error rows. A channel that redirects, a timeout, a truncated response: you get the diagnostic row for free.
- Candidates discarded by exact match. The stemming false positives above.
- Rows you already received. If a run is interrupted and resumed, delivered rows are not billed twice.
Charging happens immediately after each row is delivered, never in a batch at the end. If a run dies halfway, you paid for exactly what you received.
Output fields, with their measured fill rates
Measured over 893 posts across 9 channels. No field is promised here without a measured fill rate.
| Field | Fill rate | Notes |
|---|---|---|
datetime | 100% | ISO 8601, exact to the second |
telegram_channel_id | 100% | internal ID, survives a rename |
message_id, url, channel_username | 100% | |
text | 99.6% | full text, never truncated |
views / views_raw | 99.2% | typed value and the string as shown |
links / link_domains | 80.7% | read from the link target, not from the text |
has_photo | 52.4% | |
tme_handles | 43.2% | 64.2% in job channels |
hashtags | 37.4% | |
mentions | 30.8% | 53.5% in job channels |
has_video | 11.6% | |
reactions / reactions_total | 11.0% | |
author | 11.0% | only channels that sign their posts |
is_reply / reply_to_url | 11.0% | |
forwarded_from | 8.0% | |
is_edited | 5.3% | ⚠️ being re-measured; this figure is an underestimate |
emails | 3.0% overall / 9.0% in job channels | see note below |
has_poll / poll | 0.2% | verified with a positive case |
buttons | verified, rate not yet measured | inline buttons like Apply or Contact |
subscribers (channel rows) | 100% | exact when includeExactSubscribers is on |
About emails: the 3.0% overall figure averages news channels (0%) with job
channels (9.0%), so both numbers are given. In one job channel measured on its own it
was 35%. Do not plan around the average.
Known limits, stated up front
Attachments are not extracted. No documents, voice notes, audio files, stickers,
locations or round videos. After searching 29 channels and 893 posts there was not one
positive case: the public preview almost certainly does not render attachments at all.
A scraper that signs in with a phone number can download files, and this one cannot.
Fields that would always be false were removed rather than shipped.
Only public channels. Never groups, never private channels, never invite links. If you pass one, you get a free diagnostic row explaining which it was.
The catalog is a curated list. Discover mode searches the verified public channels that ship with the Actor, grouped by niche. The catalog is built and checked by hand, and the run log tells you exactly how many channels were searched. It does not reach channels outside that list.
The catalog is global, and mostly not in English. Telegram's largest job channels
are in Arabic, Persian, Chinese and Russian, and the catalog reflects that. In practice
this matters less than it sounds for technical searches, because technical terms stay in
the Latin alphabet even inside an Arabic post: a search for react returned 180 results
across 13 channels, every one of them a genuine React job posting. But a search for an
everyday English word like remote or hiring will return less than you might expect,
because the surrounding text is in another language. Search for the technology, the tool
or the company name rather than for the phrasing.
Media URLs expire. Telegram's CDN links carry a token and stop working after a while. They are given as a reference, not a permanent link.
Data protection
This Actor returns the full text of public channel posts, plus any email addresses, phone numbers, @mentions and t.me handles they contain. Output may include personal data. You are the data controller for whatever you do with it.
Set includeContactFields to false and those four columns come back empty. The post
text is always returned in full either way.
What this Actor does not do: it does not cross-reference authors between channels, does not enrich anything from outside sources, does not build profiles of people, and does not discover channels by following mentions. It returns what a channel published, to the person who asked for that channel.
Removal requests: privacy@actorstack.dev · policy: https://telegram.actorstack.dev
Cached pages are held for 7 days and archives for 90, both expiring automatically.
Every row tells you whether it came from cache (from_cache), when it was fetched
(fetched_at) and how old it is (data_age_hours). Set maxCacheAgeDays to 0 to
force a fresh fetch.
Example input
Read the latest 200 posts from two channels:
{"mode": "messages","channels": ["durov", "https://t.me/s/tgbeta"],"maxMessagesPerChannel": 200}
Find React jobs without knowing any channel names:
{"mode": "discover","niche": "jobs","searchTerms": ["react", "typescript"],"maxChannels": 40}
Reach metrics with exact subscriber counts:
{"mode": "channel-info","channels": ["durov", "telegram"],"includeExactSubscribers": true}