# Telegram Channel Analytics: Stats, Growth & Fake Check (`s_actors/telegram-channel-analytics`) Actor

Telegram channel stats without login: exact subscribers, reach per post, ERR, growth history, ads and advertisers, fake-subscriber signals, best posting time. Compare channels, map a niche, check groups (members, online), export posts. A TGStat alternative with an API.

- **URL**: https://apify.com/s\_actors/telegram-channel-analytics.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Social media, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Telegram Channel Analytics: Stats, Growth & Fake Check

Get **Telegram channel stats without logging in**: exact subscribers, **average reach per post, ERR**, subscriber **growth**, **ads and advertisers**, **fake-subscriber signals**, best posting time and the formats that work. Put several channels in one run and get them **ranked side by side**. Check **groups** too: members and how many are online.

A **TGStat / Telemetr alternative with an API**: pay per channel, no subscription, export as JSON, CSV or Excel, schedule it and get **only the changes**. No Telegram account, no bot token, no phone number.

#### How it works

1. Choose what to do: **Analyze & compare channels**, **Find ads and advertisers**, **Find mentions of a brand**, **Map a niche** or **Export posts**
2. Add public channels or groups: `@durov`, `durov` or `https://t.me/durov`
3. Optional: how many recent posts to analyze (default 100), a date limit, and **Only report changes** for scheduled monitoring

#### Why this Actor

| | |
|---|---|
| 📊 **Real channel analytics** | Average and median reach of settled posts, ERR (reach ÷ subscribers), reactions per 1,000 views, posts per day, reach trend. Other Telegram scrapers export posts; this one tells you what they mean |
| 🎯 **Exact subscribers** | The exact count from the channel page (3,110,102, not "3.11M"), and members + online for groups |
| 📈 **Growth history** | Every run saves the count; growth over 1, 7 and 30 days appears automatically on later runs. Schedule it daily to build the history TGStat charges for |
| 🕵️ **Fake-subscriber check** | Quality score 0-100 with reasons: reach far below subscribers, suspiciously even views, subscriber spikes, inactivity, few reactions |
| 💰 **Ads and advertisers** | Marked ads (`erid`, "Реклама", #ad, "Sponsored"), paid links, channel promos; the advertiser (company name or site), how often the channel sells ads and how much reach an ad gets compared to normal posts |
| 🏆 **Compare channels** | Rank channels by subscribers, reach, ERR, quality and growth in one table: pick where to buy ads |
| 🕸️ **Niche map** | Start from 1-5 channels and discover the channels they mention, forward and promote, each analyzed: who promotes whom |
| ⏰ **Best time & formats** | Hours (UTC) and weekdays with the highest reach, and which formats (photo, video, text, with a link) get more views |
| 🔔 **Only changes** | Scheduled runs return only channels that grew or shrank, ran new ads or changed quality, or only new posts / ads / mentions |

#### Use cases

- **Buying Telegram ads**: check reach, ERR and fake-subscriber signals before paying, compare channels, see who already advertises there and the ad contact from the channel description
- **Competitor tracking**: their growth, posting rhythm, ads they buy and sell, their top posts
- **Brand monitoring**: find posts that mention your brand, @channel or site in a list of channels, daily
- **Niche research**: map a topic from a few seed channels and rank everything you find
- **Channel owners**: best hours and formats for your own channel, reach trend, growth history
- **Researchers and AI agents**: clean Telegram data through the API or the Apify MCP server

#### Analyze & compare channels

One row per channel or group. Real run, September 2026: 15 channels, 100 posts each, **14 seconds**.

| Channel | Subscribers | Avg reach | ERR | Ads in 100 posts | Quality |
|---|---|---|---|---|---|
| Pavel Durov | 10,615,443 | 6,708,500 | 63.2% | 0 | 100 good |
| Mash | 3,110,095 | 414,243 | 13.3% | 4 (sber.ru, alfa.me, t2.ru) + 13 channel promos | 100 good |
| Эксплойт | 2,047,226 | 96,793 | 4.7% | 8 (sber.ru, huggingface.co…) | 100 good |
| РБК | 914,441 | 42,462 | 4.6% | 1 (ПАО «Сбербанк») | 100 good |
| Whale Alert | 299,975 | 8,702 | 2.9% | 0 | 80, flag `low_reach` |
| Python (group) | 95,470 members, 4.0% online | | | | 100 good |

| Field | Description |
|---|---|
| `username`, `title`, `type`, `verified`, `description`, `photo`, `url` | The channel or group (`type`: channel or group) |
| `subscribers` / `members`, `online`, `onlinePercent` | Exact counts from the channel page; online for groups |
| `subscribersChange1d`, `subscribersChange7d`, `subscribersChange30d`, `subscribersChange30dPercent`, `trackedSince` | Growth from the counts saved by earlier runs in your account (empty on the first run) |
| `avgReach`, `medianReach`, `err` | Views of posts older than 48 hours (settled reach) and reach ÷ subscribers in % |
| `avgViews`, `medianViews`, `maxViews`, `reachTrendPercent`, `viewsVariation` | All posts read; trend = newer half vs older half |
| `reactionsPer1000Views`, `paidStars` | Engagement; paid ⭐ reactions |
| `postsAnalyzed`, `postsPerDay`, `firstPostDate`, `lastPostDate`, `daysSinceLastPost` | Activity |
| `adPosts`, `adSharePercent`, `advertisers`, `lastAdDate`, `adReachPercentOfOrganic`, `adContacts` | Ads: count, share, who advertised, ad reach vs normal posts, whom to contact for ads |
| `promoPosts`, `promotedChannels`, `forwardedFrom`, `forwardedShare` | Channels this one promotes or reposts |
| `bestHoursUtc`, `bestWeekdays`, `formats`, `topPosts` | When and what works best |
| `qualityScore`, `qualityLevel`, `qualityFlags` | 0-100, `good` / `check` / `risky`, reasons (see below) |
| `rankBySubscribers`, `rankByReach`, `rankByErr`, `rankByQuality`, `rankByGrowth30d` | Places among the channels of the run (1 = best) |

**Quality flags.** `very_low_reach` (ERR < 1%), `low_reach` (< 3%), `reactions_disabled` (info only), `suspiciously_even_views` (bot-like flat views), `subscriber_spike` (a jump of 10%+ in a day in the saved history), `inactive` (no posts for 30+ days), `few_reactions`, `ad_heavy` (more than 40% ads), `few_online_members` (groups), `preview_disabled`. The score is an estimate from public data, not proof.

#### Find ads and advertisers

One row per ad or promo post. Real run: 6 news and tech channels, last 14 days, 3,500 posts read, **54 ad and promo posts in 29 seconds**: 43 marked ads, 42 of them with the advertiser, for example «ООО Т2 Мобайл» on vc.ru, «ПАО Сбербанк» on РБК, sber.ru and alfa.me on Эксплойт.

| Field | Description |
|---|---|
| `adType` | `marked_ad` (erid, "Реклама", #ad, Sponsored), `tracked_link` (paid-traffic link), `channel_promo` (invite link or "subscribe to @...") |
| `advertiser`, `inn`, `erid` | Company from the ad marking, or the advertised site / channel; Russian ad ID and tax number when present |
| `views`, `viewsPercentOfSubscribers`, `reactions`, `date`, `text`, `links`, `url` | The post |

#### Find mentions of a brand

Telegram's own search inside each channel for your words, @names or links. Real run: "Яндекс" and "@avito" in 4 channels, 65 posts in 5 seconds. `exactMatch` shows whether the text contains the term exactly (Telegram also matches word forms).

#### Map a niche

From the seed channels' last posts, the Actor collects every channel they mention, forward or promote, keeps those seen at least `minMentions` times, and analyzes each one. Real run from @tproger and @exploitex: 14 channels found, 8 analyzed, e.g. `ithumor` (60,591 subscribers, ERR 15.9%), `neuro_channel` (5 mentions, promoted), `yandex`. Rows add `mentionedBy`, `timesMentioned`, `timesForwarded`.

#### Export posts

Posts with text, date, views, reactions by emoji, media type, album, edited mark, forwarded-from, links, @mentions, hashtags and ad marks. The whole public history can be read, 20 posts per page, with a date limit.

#### Only report changes: how monitoring works

Turn on **Only report changes** and schedule the task (daily is typical). The first run returns everything and saves the state under **Monitor name**; later runs return only:

| Mode | Returned on later runs |
|---|---|
| Analyze | channels whose subscribers changed by **Report subscriber change of at least %** (default 1%), that published new ads, or whose quality level changed (`changes`, `previousCount`, `countChangePercent`) |
| Ads, Posts, Mentions | posts published since the last run |

Growth fields (`subscribersChange7d` and so on) fill in as the daily history builds up, with or without this option.

#### Pricing

Pay per event, no subscription:

| Event | Price |
|---|---|
| Run start | $0.002 |
| Channel analyzed (Analyze, Niche map) | $0.004 |
| Page of posts read (up to 20 posts) | $0.0002 |
| Post returned (Posts, Ads, Mentions) | $0.0005 |

Examples: 10 channels analyzed on 100 posts each = **$0.05**. 20 competitor channels checked daily for a month = **$0.60-2.50** (unchanged channels are free in monitoring mode). 1,000 posts exported = **$0.51**.

#### Ready-made tasks

Open one, change the channels, and run:

| Task | What you get |
|---|---|
| [Telegram Channel Stats Checker: Subscribers, Reach & ERR](https://apify.com/s_actors/telegram-channel-analytics/examples/telegram-channel-stats-checker) | Exact subscribers, average reach and ERR of any channels |
| [Check a Telegram Channel for Fake Subscribers](https://apify.com/s_actors/telegram-channel-analytics/examples/telegram-fake-subscribers-check) | Quality score with reasons before you buy an ad |
| [Telegram Channel Growth Tracker: Daily Subscriber Changes](https://apify.com/s_actors/telegram-channel-analytics/examples/telegram-channel-growth-tracker) | Daily subscriber changes on a schedule |

#### Good to know

- Only **public** channels and groups (a t.me/name link). Private invite links (t.me/+...) cannot be read.
- Views and reactions come from Telegram's public preview, rounded to 3 digits ("354K"); subscribers are exact.
- About 7% of channels switch the public preview off: you get the card (exact subscribers, description) and growth, but no post analytics (`preview_disabled`).
- Groups have no public messages: you get members, online share and growth. Member lists are not collected (they need a logged-in account and are personal data).
- A channel can post under another username (t.me/breakingmash posts as `mash`): post rows use the posting name.

#### Input example

```json
{
  "mode": "analyze",
  "channels": ["durov", "telegram", "https://t.me/breakingmash"],
  "postsToAnalyze": 100
}
```

#### Integrations

Use it from the Apify API, schedule it, send results to Google Sheets, Slack, Zapier, Make or n8n, or call it from AI agents through the Apify MCP server.

Questions or a missing metric? Open an issue on the Actor page.

# Actor input Schema

## `mode` (type: `string`):

Analyze: one row per channel or group with subscribers, reach, ERR, growth, ads, best time and a quality score; several channels are ranked against each other. Ads: the ad and promo posts of the channels, with the advertiser. Mentions: posts in the channels that mention your words, @names or links. Niche map: channels the seed channels mention, forward and promote, each analyzed. Posts: export posts with views and reactions.

## `channels` (type: `array`):

Public channels or groups: @name, name or a t.me/name link, one per line. For the niche map: 1-5 seed channels of the niche. Private invite links (t.me/+...) cannot be read.

## `postsToAnalyze` (type: `integer`):

Analyze, ads and niche map: how many of the latest posts to read per channel (20 per page).

## `searchTerms` (type: `array`):

Mentions mode: what to look for in the channels (Telegram search inside each channel), e.g. a brand, @competitor or yoursite.com.

## `maxPostsPerChannel` (type: `integer`):

Posts and mentions modes: how many posts to return per channel (and per word).

## `newerThan` (type: `string`):

Posts, ads and mentions: a date (2026-09-01) or a period ("30 days", "2 weeks", "6 months"). Empty = no date limit.

## `includeChannelPromos` (type: `boolean`):

Ads mode: also return posts that promote other Telegram channels (invite links, "subscribe to @..."), not only marked ads and tracked links.

## `minMentions` (type: `integer`):

Only channels mentioned or forwarded at least this many times in the seed channels' posts.

## `maxDiscoveredChannels` (type: `integer`):

How many discovered channels to analyze (most mentioned first).

## `onlyChanges` (type: `boolean`):

For scheduled runs. The first run returns everything and saves the state; later runs return only new posts, new ads or new mentions, and in Analyze only channels whose subscribers changed by the percent below, that ran new ads or whose quality level changed.

## `alertSubscriberChangePercent` (type: `integer`):

Monitoring in Analyze mode: report a channel when its subscribers changed by at least this many percent since the last run.

## `monitorName` (type: `string`):

Separate monitors keep separate memory. Use a different name for each scheduled task.

## `maxConcurrency` (type: `integer`):

How many requests run at the same time.

## Actor input object example

```json
{
  "mode": "analyze",
  "channels": [
    "durov",
    "telegram"
  ],
  "postsToAnalyze": 100,
  "maxPostsPerChannel": 100,
  "includeChannelPromos": true,
  "minMentions": 2,
  "maxDiscoveredChannels": 30,
  "onlyChanges": false,
  "alertSubscriberChangePercent": 1,
  "monitorName": "default",
  "maxConcurrency": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per channel or group: subscribers, reach, ERR, growth, ads, quality.

## `compare` (type: `string`):

Places among the channels of the run (1 = best).

## `ads` (type: `string`):

Ad and promo posts: advertiser, marking, reach.

## `mentions` (type: `string`):

Posts that mention your words, @names or links.

## `niche` (type: `string`):

Channels the seeds mention, forward and promote.

## `posts` (type: `string`):

Posts with views, reactions and ad marks.

## `changes` (type: `string`):

Monitoring: subscriber changes, new ads, quality changes.

## `all` (type: `string`):

Every field of every row.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "channels": [
        "durov",
        "telegram"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/telegram-channel-analytics").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "channels": [
        "durov",
        "telegram",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/telegram-channel-analytics").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "channels": [
    "durov",
    "telegram"
  ]
}' |
apify call s_actors/telegram-channel-analytics --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s_actors/telegram-channel-analytics"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7mQDb5gXqpjW6UL41/builds/JgiiI6kJdXPaAf7Dc/openapi.json
