Telegram Channel Scraper — Search Without a Handle or Login avatar

Telegram Channel Scraper — Search Without a Handle or Login

Pricing

Pay per event

Go to Apify Store
Telegram Channel Scraper — Search Without a Handle or Login

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

Oswaldo Carabano

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

8 days ago

Last modified

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

EventPrice
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:

  1. Error rows. A channel that redirects, a timeout, a truncated response: you get the diagnostic row for free.
  2. Candidates discarded by exact match. The stemming false positives above.
  3. 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.

FieldFill rateNotes
datetime100%ISO 8601, exact to the second
telegram_channel_id100%internal ID, survives a rename
message_id, url, channel_username100%
text99.6%full text, never truncated
views / views_raw99.2%typed value and the string as shown
links / link_domains80.7%read from the link target, not from the text
has_photo52.4%
tme_handles43.2%64.2% in job channels
hashtags37.4%
mentions30.8%53.5% in job channels
has_video11.6%
reactions / reactions_total11.0%
author11.0%only channels that sign their posts
is_reply / reply_to_url11.0%
forwarded_from8.0%
is_edited5.3%⚠️ being re-measured; this figure is an underestimate
emails3.0% overall / 9.0% in job channelssee note below
has_poll / poll0.2%verified with a positive case
buttonsverified, rate not yet measuredinline 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
}