# Telegram Subscriber Count Scraper | Channel Posts (`aurelix/telegram-channel-scraper`) Actor

Scrape public Telegram channel posts at $0.20 per 1,000 on the free plan: text, date, views, reactions, links, media URLs, forwards and the exact Telegram subscriber count. A Telegram scraper for many channels per run, with date filters and only-new-posts mode, no login.

- **URL**: https://apify.com/aurelix/telegram-channel-scraper.md
- **Developed by:** [Aurelix](https://apify.com/aurelix) (community)
- **Categories:** Social media, News, Marketing
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.12 / 1,000 post results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What is Telegram Subscriber Count Scraper?

**Export posts from public Telegram channels (text, date, views, reactions, links, media, forwards) to Excel, CSV or JSON for $0.20 per 1,000 posts, no login.**

For media monitoring, market and brand research: many channels per run, a date window and a new-posts feed. Your first run with the example input costs about $0.0052 (20 posts in our test run).

[![Telegram Subscriber Count Scraper: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/telegram-channel-scraper-card-v2.png)](https://console.apify.com/actors/c1i22Qvq9FWnN1ekE?addFromActorId=c1i22Qvq9FWnN1ekE)

[![Telegram Subscriber Count Scraper: 75-second demo video](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/telegram-channel-scraper-demo-thumb-v1.png)](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/telegram-channel-scraper-demo-v1.mp4)

**[▶ Watch the 75-second demo](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/telegram-channel-scraper-demo-v1.mp4)**

| | |
|---|---|
| **Source** | Telegram's public web preview, t.me/s/<channel> |
| **Filters** | Posted after / before, max posts per channel, only new posts since last run |
| **Output** | 31 fields per post incl. exact subscriber count; JSON, CSV, Excel, API |
| **Automate** | Slack/webhook digest, schedules, Zapier, Make, n8n, MCP for AI agents |
| **Price** | $0.20 per 1,000 posts (from $0.12 per 1,000 posts on paid Apify plans) |
| **Free to try** | Runs on Apify's free plan: the $5 monthly credit covers about 24,000 posts |
| **Login needed** | No |

### Why Telegram Subscriber Count Scraper users pick this one

- **Every post field.** Views, reactions, media, polls, forwards and link previews.
- **A daily feed, no repeats.** Only-new mode remembers each channel's newest post.
- **Clear answers, no charge.** Groups, users and closed previews are skipped and named.
- **Signatures, mentions, emails.** Author signatures, @mentions, emails and forward sources as shown.
- **$0.20 per 1,000 posts.** from $0.12 on paid plans; skipped channels cost nothing.

### Get started in 3 steps

1. Enter public channels as usernames, @names or t.me links, e.g. 'telegram' or 'https://t.me/s/durov'.
2. Optionally set 'Max posts per channel', 'Posted after' / 'Posted before' ('7 days' works) and 'Only new posts since last run'.
3. Click Start and download JSON, CSV or Excel, or schedule it and send new posts to Slack, Sheets or Zapier.

**[▶ Try it with the example input](https://console.apify.com/actors/c1i22Qvq9FWnN1ekE?addFromActorId=c1i22Qvq9FWnN1ekE)**

The form opens with an example input already filled in: that run costs about $0.0052 on the free plan.

### How much does it cost to scrape Telegram channels?

Pay per event: you pay only for what the run returns, plus a small start fee. Bronze, Silver, Gold and higher Apify plans pay less per result. Paid plans pay $0.15 (Bronze), $0.13 (Silver) and $0.12 (Gold and higher) per 1,000 posts.

| Posts | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| 100 | $0.0212 | $0.0162 | $0.0142 | $0.0132 |
| 1,000 | $0.20 | $0.15 | $0.13 | $0.12 |
| 10,000 | $2.00 | $1.50 | $1.30 | $1.20 |

Totals include the $0.0012 start fee per run, rounded to the cent (amounts under $0.10 to four decimals). Apify's free plan includes $5 of credit a month, enough for about 24,000 posts.

Skipped channels, posts outside your dates, posts already returned (only-new mode) and repeated channels are never charged.

#### Billing events

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| `post-result` | $0.20 per 1,000 posts | $0.15 per 1,000 posts | $0.13 per 1,000 posts | $0.12 per 1,000 posts |
| `apify-actor-start` | $0.0012 per run | $0.0012 per run | $0.0012 per run | $0.0012 per run |

### What data you get

**Telegram Subscriber Count Scraper** reads Telegram's public channel preview (t.me/s/<channel>) and turns each post into one record: text, date, author signature, views, reactions, links, hashtags, mentions, emails, media, polls, link previews, forwards and replies, plus the channel's title, description and exact subscriber count.

| date | channel_username | text | views | reactions_total | media | post_url |
|---|---|---|---|---|---|---|
| 2026-10-31T13:35:27Z | bitcoin | On 31 October 2008, Satoshi published nine pages that exp... | 9990 | 128 | video | https://t.me/bitcoin/20687 |
| 2026-10-09T13:09:44Z | bitcoin | Most chat apps announce new features with a changelog.  K... | 5900 | 38 | video | https://t.me/bitcoin/20512 |
| 2026-11-02T11:32:29Z | tginfo | Больше возможностей HTML-сообщений в Telegram  В новых Be... | 10200 | 417 | photo | https://t.me/tginfo/4447 |
| 2026-10-28T12:56:33Z | tginfo | Исследователь обошёл серверную проверку стикеров в Telegr... | 18800 | 577 |  | https://t.me/tginfo/4446 |
| 2026-10-19T09:32:00Z | cointelegraph | Bitcoin faces a second straight red October.  Can it stil... | 9660 | 67 | photo | https://t.me/cointelegraph/72739 |

One full post record, exactly as a real run returned it (long text and lists shortened here). From a real run:

```json
{
  "post_id": 20646,
  "post_url": "https://t.me/bitcoin/20646",
  "channel_username": "bitcoin",
  "date": "2026-10-26T17:05:00Z",
  "edited": false,
  "author_signature": null,
  "text": "JUST IN: 🟠 $13 Trillion Vanguard's Small Cap ETF ($VSS) just disclosed it bought 4.5 million shares ($7.5 million) of #B... [218 more characters]",
  "views": 5480,
  "reactions": [
    {
      "emoji": "👍",
      "count": 19
    },
    {
      "emoji": "⚡",
      "count": 11
    },
    {
      "emoji": "❤",
      "count": 10
    },
    "... [4 more]"
  ],
  "reactions_total": 52,
  "links": [
    "https://x.com/search?q=%24VSS&src=cashtag_click",
    "https://x.com/hashtag/Bitcoin?src=hashtag_click",
    "https://x.com/BTCtreasuries/status/2114666613769461868"
  ],
  "hashtags": [
    "Bitcoin"
  ],
  "mentions": [],
  "emails": [],
  "media": [
    {
      "type": "photo",
      "url": "https://cdn1.telesco.pe/file/c0pdvsx-LFDWydInPULmXrwIj6JJBlyIevmZFqXNJ6VhjUthxi2Z3NCt6Z0UTDskmKgQIgTPte6rk2oev64IYMe96Uy... [255 more characters]",
      "thumbnail_url": null,
      "duration": null,
      "title": null
    }
  ],
  "poll": null,
  "link_preview": null,
  "is_forwarded": false,
  "forwarded_from_channel": null,
  "forwarded_from_title": null,
  "forwarded_from_post_url": null,
  "forwarded_from_author": null,
  "reply_to_post_id": null,
  "channel_title": "Bitcoin",
  "channel_description": "This is the top Telegram channel for #Bitcoin news and information. Inject the orange coin directly into your mind! 🍊",
  "channel_subscribers": 181651,
  "channel_verified": false,
  "channel_photo_url": "https://cdn5.telesco.pe/file/veRtZiHlGW1DdJtDsoo6C6TIhjDBdeLXaulvEM-2xkGqAo-4NthojfdqhhjguaJejD_pl4l4-dHd1y93xG3875QlHLF... [255 more characters]",
  "channel_url": "https://t.me/bitcoin",
  "source_url": "https://t.me/s/bitcoin?before=20649",
  "scraped_at": "2026-11-05T06:48:40Z"
}
```

### Use cases

- Media monitoring: new posts from news and company channels in a sheet or Slack
- Crypto research: exchange announcements, listings and alerts
- Research: a dated archive of a channel's public posts

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `channels` (Channels) | array | Public Telegram channels to read, as a username, @username or link, e.g. \['telegram', '@durov', 'https://t.me/s/bitcoin']. | \["telegram"] |
| `maxPostsPerChannel` (Max posts per channel) | integer | Upper limit of posts returned per channel, newest first, e.g. 200. | 100 |
| `incremental` (Only new posts since last run) | boolean | Return only posts newer than the newest post an earlier run returned for the same channel, so a scheduled run... | false |

All 8 fields, with examples: see the **Input** tab.

### Use with AI agents (MCP)

MCP (Model Context Protocol) is the open standard that lets AI assistants such as Claude, ChatGPT and Cursor call outside tools. Apify's hosted MCP server at `https://mcp.apify.com/?tools=aurelix/telegram-channel-scraper` gives your assistant this Actor only: it fills in the input from your request, runs it and reads the posts back, at the same per-result price as a run started by hand.

#### Example prompts

- "Get the last 50 posts from the Telegram channels @telegram and @durov and rank them by views"
- "Which posts in t.me/s/bitcoin from the past 7 days got the most reactions?"
- "With the Telegram Subscriber Count Scraper tool, help with this: Media monitoring: new posts from news and company channels in a sheet or Slack. Show the results as a table."

#### Claude Desktop and claude.ai

**Settings > Connectors > Add custom connector**, name it Apify, paste `https://mcp.apify.com/?tools=aurelix/telegram-channel-scraper`, keep the detected OAuth settings, select **Add** and sign in to Apify.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/telegram-channel-scraper"
```

#### Cursor and VS Code

Add this to `~/.cursor/mcp.json` (Cursor); in VS Code's `.vscode/mcp.json` put the same entry under `"servers"` with `"type": "http"`. Sign in to Apify when asked.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/telegram-channel-scraper"
    }
  }
}
```

#### ChatGPT

Turn on **Developer mode**, open **Settings > Apps & Connectors > Create**, paste the URL above as the MCP server URL, choose **OAuth** and authorize Apify.

Clients without sign-in send `Authorization: Bearer <YOUR_APIFY_TOKEN>` instead. No Apify account? This Actor supports Apify's agentic payments: an agent can pay per run with a prepaid, spend-capped token, bought with x402 stablecoin payments.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/telegram-channel-scraper` and a Bearer credential holding your Apify token.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/telegram-channel-scraper (Telegram Subscriber Count Scraper) through Apify's MCP server or API. Main input: channels (Channels). Example input: {"channels": ["telegram", "@durov", "https://t.me/s/bitcoin"], "maxPostsPerChannel": 200, "postedAfter": "30 days", "incremental": true}. Each result is one post with fields such as post_id, post_url, channel_username, date, edited, author_signature, text, views. It costs $0.20 per 1,000 posts on Apify's free plan plus a $0.0012 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/telegram-channel-scraper` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/telegram-channel-scraper").call(run_input={'channels': ['telegram', '@durov', 'https://t.me/s/bitcoin'], 'maxPostsPerChannel': 200, 'postedAfter': '30 days', 'incremental': True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Turn on **Only new posts since last run** so each run returns only what is new, and paste a Slack or webhook URL into **Slack webhook URL** / **Webhook URL** to get a digest of the new items (count plus the top 10) after every run.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I scrape Telegram channels without login?

Yes. It reads the public web preview at t.me/s/<channel>, which opens in any browser; no account, phone number, api_id or bot token is needed.

#### Is there a Telegram channel API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

#### How much does it cost to scrape Telegram channels?

About $0.20 for 1,000 posts on Apify's free plan and from $0.12 on paid plans, start fee included. The free $5 monthly credit covers about 24,000 posts.

#### Can I export Telegram channel posts to Excel or Google Sheets?

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to scrape Telegram channels?

It reads only public data any logged-out visitor can see: Telegram's web preview of open channels. It never logs in and never reads groups, comments, member lists or user accounts. Post text, author signatures, mentions and forward sources are returned as shown publicly, except payment card numbers in post text, which are removed. Telegram's terms restrict scraping and prohibit using its data to train or develop AI models, so do not use the output for that. People can ask for removal of their data by opening an issue on this Actor's Issues tab. You are responsible for using the data lawfully, incl. copyright, privacy and Telegram's terms; this is not legal advice.

#### Why was a channel skipped?

The run status names each one and why: only public channels with the web preview on can be read logged-out, so groups, users, bots, private links and unknown names are skipped, free.

### Lawful use

- Data is returned as shown publicly on the source (post text, author signatures, mentions, forward sources), except payment card numbers in post text, which are replaced with \[card number removed]; people can ask for removal by opening an issue on this Actor's Issues tab.
- Do not use the output to train or evaluate AI models: Telegram's terms prohibit it.

### Integrations: n8n, Make, Zapier and code

n8n and Make: the Apify node or app, **Run an Actor**. Zapier: **Finished Actor Run**. HTTP:

```bash
curl -X POST "https://api.apify.com/v2/acts/aurelix~telegram-channel-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"channels": ["telegram"], "maxPostsPerChannel": 20}'
```

### Related Aurelix tools

- **[Website to Markdown Crawler](https://apify.com/aurelix/website-to-markdown)**: linked articles as Markdown.
- **[Google Trends Scraper](https://apify.com/aurelix/google-trends-scraper)**: is a topic rising in search too?

### Limits (stated honestly)

- Public channels only; a channel whose owner turned off the web preview is skipped and named.
- Views, reactions and poll voters are Telegram's rounded figures (74.4K becomes 74400).
- Video and voice links expire; large videos have a thumbnail only.

### Works great with

- **Then: [Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: put the `links` column into its start URLs to get the linked articles as Markdown
- **Then: [YouTube Transcript Scraper](https://apify.com/aurelix/youtube-transcript-scraper)**: put the YouTube links from the `links` column into its videos input for the transcripts

### Recent changes

- **0.1**: Payment card numbers in post text are replaced with \[card number removed]; the run's status names what was charged.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 4 posts come back with `post_id`, `post_url`, `channel_username`, `date`, `source_url`, `scraped_at` filled in; a failed check alerts the maintainer straight away.

### Your feedback

Missing a field, found a bug or need another filter? Open an issue on the **Issues** tab; we aim to answer within a day. If this Actor saved you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/aurelix/telegram-channel-scraper/changelog.md

# Actor input Schema

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

Public Telegram channels to read, as a username, @username or link, e.g. \['telegram', '@durov', 'https://t.me/s/bitcoin']. Groups, user accounts, bots, private invite links and channels whose owner turned off the web preview are skipped and not charged.

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

Upper limit of posts returned per channel, newest first, e.g. 200. Older posts are read page by page (about 20 posts a page). 0 = the whole history the preview shows.

## `postedAfter` (type: `string`):

Keep only posts published at or after this point: a date (e.g. 2026-01-31, read as UTC midnight), an ISO date-time (e.g. 2026-01-31T12:00:00+02:00), or a relative age such as '7 days' or '12 hours'. Leave empty for no lower limit.

## `postedBefore` (type: `string`):

Keep only posts published before this point, in the same formats, e.g. 2025-12-31. The Actor jumps straight to that part of the history instead of reading every newer page. Leave empty for no upper limit.

## `incremental` (type: `boolean`):

Return only posts newer than the newest post an earlier run returned for the same channel, so a scheduled run never repeats a post. Memory is kept per channel (and per state name, below) for 60 days.

## `stateKey` (type: `string`):

Name for the 'new since last run' memory, e.g. 'crypto-news-daily'. Use different names for separate feeds of the same channel. Leave empty to share one memory per channel.

## `slackWebhookUrl` (type: `string`):

After each run, post a short digest to Slack: how many posts were saved (new ones only when 'Only new posts since last run' is on) and the top 10 with links, e.g. https://hooks.slack.com/services/T000/B000/XXXX. Nothing is posted when the run saved nothing. Leave empty to skip.

## `webhookUrl` (type: `string`):

After each run, POST the same digest as JSON (actor, newOnly, count, items = top 10 posts, runUrl, text) to any URL, e.g. a Zapier, Make or n8n webhook. Nothing is sent when the run saved nothing. Leave empty to skip.

## Actor input object example

```json
{
  "channels": [
    "telegram"
  ],
  "maxPostsPerChannel": 20,
  "incremental": false
}
```

# Actor output Schema

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

All channel posts returned by this run, one item per post, newest first per channel.

# 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": [
        "telegram"
    ],
    "maxPostsPerChannel": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/telegram-channel-scraper").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": ["telegram"],
    "maxPostsPerChannel": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("aurelix/telegram-channel-scraper").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": [
    "telegram"
  ],
  "maxPostsPerChannel": 20
}' |
apify call aurelix/telegram-channel-scraper --silent --output-dataset

```

## MCP server setup

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

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/c1i22Qvq9FWnN1ekE/builds/zuYJic2zyEirahP6x/openapi.json
