Telegram Channel Analytics for Ad Buyers - Reach & Ad Share
Pricing
from $14.50 / 1,000 channel analyzeds
Telegram Channel Analytics for Ad Buyers - Reach & Ad Share
Vet public Telegram channels before buying an ad: exact subscribers, median views per post, reach % (ERR), posts per day, share of labelled ad posts, best hour and weekday, and ranks across the channels you list. Every row states the posts and dates it was measured on.
Pricing
from $14.50 / 1,000 channel analyzeds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Telegram Channel Analytics for Ad Buyers - reach, ad share and the exact subscriber count
Check a Telegram channel before you pay for an ad in it. Give this Actor one channel or a list of them and it returns one row per channel with the numbers an ad buyer asks for: the exact subscriber count, the median views per post, reach % (ERR), posts per day, how many posts were labelled ads and how those ads were read compared with the other posts, the best hour and weekday to post, the advertising contact named in the channel description, and ranks across every channel in the run.
Every number says what it was measured on. Each row carries postsUsed, periodFrom,
periodTo and a plain-English basisSummary such as "20 post(s) from 2026-01-09 to 2026-09-03 (the
channel has no older posts). View figures use 20 post(s) older than 24 h." An average without its
basis is not something you can compare, so this Actor does not return one.
The subscriber count is the exact one. Telegram's preview page shows a rounded figure - Bloomberg's
channel reads 172K there - while the channel's own profile page publishes 171,899. Reach % is
calculated only against that exact figure; when it cannot be read, reach % is left empty and
subscribersNote says why, instead of dividing by a rounded number.
No login, no Telegram API key, no account. Only the pages Telegram serves to anyone without logging in are read. Export as JSON, CSV or Excel.
What one channel row gives you
| Column | What it is |
|---|---|
channel, channelTitle, channelUrl, verified, description | the channel |
adContactHandles | @usernames named next to "реклама", "ads", "сотрудничество", "promo" and similar words in the description - who to contact to buy an ad |
subscribers, subscribersAreExact, subscribersDisplay, subscribersNote | the exact count from the profile page, the rounded figure the preview shows, and why the exact count is missing when it is |
postsUsed, periodRequestedDays, periodFrom, periodTo, daysCovered, postsLimitedBy, basisSummary | which posts the figures were measured on, and why reading stopped where it did |
viewsMedian, viewsMean, viewsMin, viewsMax, postsWithViewsCounted, postsTooNewForViews | views per post, from posts old enough for their views to have settled |
errPct, errMedianPct | reach %: mean (and median) views per post divided by the exact subscriber count |
reactionsMedian, reactionsPer1kViews | how much readers react |
postsPerDay, postsPerWeek, medianHoursBetweenPosts, lastPostAt, daysSinceLastPost | posting rhythm, and whether the channel has gone quiet |
viewsTrendPct, cadenceTrendPct (with the medians and counts behind them) | is the channel growing or fading within the period: newer half against older half |
adPosts, adPostsPct, adPostsPerWeek, adMarkersFound, adPostUrls | how many posts carried an ad label, which labels, and links to those posts |
adViewsMedian, otherViewsMedian, adViewsVsOtherPct | how ads were read compared with the channel's other posts - the number to look at before you buy |
forwardedPosts, forwardedPct, topForwardSources, topMentionedChannels | which channels it reposts and mentions (useful for finding similar channels) |
photoPct, videoPct, linkPreviewPct, textOnlyPct | the content mix |
timezone, bestHour, bestWeekday, postingHours[], postingWeekdays[] | posts and median views by hour and weekday, in the time zone you choose |
topPosts[] | the five most-viewed posts with their links |
channelsCompared, rankBySubscribers, rankByViewsMedian, rankByErr, rankByPostsPerDay, rankByFewestAds | ranks across the channels in the same run (1 = best; ties share a rank) |
Turn on includePosts to also get one row per post used (rowType: "post") with its views,
reactions, isAd, the ad labels found in it and countedInViewFigures, so any figure in the channel
row can be checked post by post.
How ads are recognised
Only by the labels written in the post - nothing is guessed from the topic or the wording:
- the Russian ad registration id erid, written in the text or carried in a link (
?erid=...) - the legal label line "Реклама." / "Реклама," at the start of a line, "на правах рекламы", "партнёрский материал" / "партнерский пост"
- "sponsored post", "paid partnership", a line that says only "Sponsored" or "Advertisement"
- the hashtags #реклама, #ad, #ads, #sponsored, #advertising, #promo, #промо, #партнер, #partner, #спонсор
- any words you add in
extraAdMarkers
Checked on a real feed: on the vc.ru news channel, 2 of 19 posts on one page carried an erid link and both were found, and none of the other 17 were marked. A news post that merely mentions advertising ("Зрителей достала реклама в телевизоре") and a description line that names the ad contact ("Реклама: @name") are not counted as ads.
Input
| Field | What it does |
|---|---|
channels | the public channels to analyze, as @durov, durov, https://t.me/durov or a link to a single post |
periodDays | measure the posts of the last N days (default 30; 0 = the most recent posts up to the maximum) |
maxPostsPerChannel | how far back each channel is read at most (default 300; Telegram serves 20 posts per page) |
settleHours | leave posts younger than this out of the view figures (default 24) |
timezone | the IANA time zone for the hour and weekday tables (default UTC) |
includePosts | also return one row per post used |
extraAdMarkers | extra words that mark a post as an ad on a particular channel |
useProxy | retry through a proxy if Telegram ever answers with a bot check |
Rows that are never charged
When there is nothing to sell, you get a row that says why, and it is free:
status | What happened |
|---|---|
no-such-channel | nobody has taken the name. Telegram answers a free name with its generic download page instead of a profile |
not-a-public-channel | the name exists, but has no public post preview: Telegram answers the preview URL with a 302. It does that for a bot, a personal account, a group, and a channel whose owner turned the preview off, so this row does not claim which |
no-results | the channel page loaded and Telegram published no posts on it |
blocked | Telegram answered with a bot check instead of the page |
unreadable | the page could not be read, or the input was not a public channel name; nothing is guessed |
duplicate-channel | the same channel is listed twice, or the name is another username for a channel already analyzed in this run (t.me/techmeme and t.me/arstechnica once led to the same channel), so it is not charged twice |
budget-reached | the run hit the maximum total charge you set and stopped; the row says how many rows were left behind |
A channel that exists but posted nothing in the period does get its analysis row: subscribers,
lastPostAt and daysSinceLastPost tell you it has gone quiet, which is worth knowing before buying.
Limitations
- View counts are rounded by Telegram to three significant figures (
24.2M,53.1K) on the public pages, and there is no exact view count published anywhere without logging in. Median views and reach % are therefore close approximations (the rounding is at most about 0.5% of a value); every row says so inviewsAreRounded. - Ads without a label are not detected. A native post written as ordinary content with no erid,
legal label or ad hashtag counts as a normal post.
adPostsPctis the share of labelled ads. - Share counts and the list of who forwarded a post are not public, so they are not returned.
topForwardSourcescounts the other way round: which channels this channel reposts. - Subscriber history (growth over months) is not on the public pages; trends here are measured from the posts in the period you choose.
subscribersis filled only when Telegram labels the figure "subscribers". A group that reports "members" leaves it empty rather than passing off a different number as subscribers.- Very active channels can post more than
maxPostsPerChannelwithin the period. The row then sayspostsLimitedBy: "max-posts", and the figures cover the dates inperiodFromtoperiodTo. bestHourandbestWeekdayare filled only when at least two hours (or weekdays) each have three or more settled posts and one is strictly ahead; a tie is left empty rather than picking the earlier one.- Invite links (
t.me/+...,t.me/joinchat/...) andt.me/c/...are private entrances. They are rejected rather than read. - Email addresses and phone numbers in descriptions and post text are replaced with
[email removed]/[phone removed].
Connection
Measured on 2026-10-19: t.me/robots.txt answers 404 - nothing is declared as disallowed - and
the public preview pages answered directly from Apify, so no proxy is used by default. Each page is
requested with a pause between requests, and only as many pages as the period needs.
Thanks for using this Actor
We build these tools for people who run them every day, and we improve them from what users tell us.
- Missing a number you check before buying an ad? Tell us in the Issues tab. If the data is public, we add it.
- Found a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.
If this Actor saved you time, a short review helps other people find it.