# Telegram Channel Scraper (`getdataforu/telegram-channel-scraper`) Actor

Posts of any public Telegram channel - text, date, views, reactions, photos, videos, links, forwards and replies - with channel subscribers and an engagement report. Keyword and date filters. No login, no API key.

- **URL**: https://apify.com/getdataforu/telegram-channel-scraper.md
- **Developed by:** [EMT Crawler](https://apify.com/getdataforu) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 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

## Telegram Channel Scraper

Paste public Telegram channels. Get back their **posts** — text, date, **views**, reactions, photos, videos, links, hashtags, forwards and replies — plus each channel's **subscriber count** and a report comparing the channels on reach and engagement.

No Telegram account, no phone number, no API key.

### What it's for

- **Crypto and finance monitoring** — follow exchange, project and news channels; filter for "listing", "airdrop" or a ticker.
- **Media monitoring and research** — archive what news channels and public figures post, with dates and reach.
- **Advertising on Telegram** — before buying a post in a channel, check its real views per post against its subscriber count.
- **Competitor tracking** — how often rival brands post, and which posts get the most views and reactions.
- **AI and data pipelines** — clean text and metadata, ready for sentiment analysis, summaries or search.

### What you get for each post

| | |
|---|---|
| **Content** | Text (line breaks and emoji kept), hashtags, @mentions, links, author signature, edited flag |
| **Reach** | Views, every reaction with its count, total reactions, paid Telegram Stars |
| **Media** | Photo URLs, video URLs with thumbnail and duration, voice and round-video flags, documents, polls |
| **Context** | Link preview (site, title, description, image), forwarded from (name and link), reply to (link, author, quoted text) |
| **Post** | Post ID, link, date and time, channel, channel title, channel subscribers |

### The channel report

Every run writes a **`CHANNEL_REPORT`** to the key-value store, one entry per channel: title, verified badge, subscribers, photo / video / link counts, description, posts collected, **median and average views per post**, **view rate** (median views ÷ subscribers), reaction rate, **posts per day**, newest and oldest post, and the top 5 posts by views. From a test run:

| Channel | Subscribers | Median views per post | View rate | Posts per day |
|---|---|---|---|---|
| Pavel Durov | 10.4M | 5,540,000 | 53% | 0.2 |
| Telegram | 9.34M | 2,350,000 | 25% | 0.2 |
| Notcoin Community | 8.28M | 586,000 | 7% | 0.2 |
| Binance Announcements | 3.33M | 39,200 | 1.2% | 3.5 |
| The New York Times | 188K | 30,900 | 16% | 0.7 |
| Cointelegraph | 331K | 8,120 | 2.5% | 13.2 |

View rate is the number advertisers care about: a big channel with a 1% view rate reaches fewer people per post than a small one with 50%.

### Input

```json
{
  "channels": ["https://t.me/durov", "@binance_announcements", "cointelegraph"],
  "maxPostsPerChannel": 200,
  "newerThanDays": 30,
  "keywords": ["bitcoin", "btc"]
}
```

| Field | Default | Notes |
|---|---|---|
| `channels` | — | **Required.** t.me links, @usernames or usernames. |
| `maxPostsPerChannel` | `100` | Newest first; the whole history is reachable. |
| `newerThanDays` | — | Stop at posts older than this. |
| `keywords` | — | Keep only posts containing any of these words. Skipped posts are not charged. |
| `includeChannelInfo` | `true` | Add subscribers to every post. |

### Speed and cost

Measured: **800 posts from 8 channels**, every one with its date and channel details, no failed requests. The actor reads Telegram's public web preview directly, without a proxy, so runs stay cheap.

### You only pay for posts you get

Channels that don't exist, private channels, wrong links and posts filtered out by date or keyword are never written to the dataset, so they are never charged. Failed channels are listed with the reason in `CHANNEL_REPORT.failed`.

### Limitations

- **Public channels only.** Private channels, groups and channels whose owner turned off the web preview cannot be read without an account.
- **Views, reactions and subscribers are rounded** by Telegram ("798K", "10.4M") — that is all it shows to visitors.
- Custom (premium) emoji reactions are returned as an emoji ID, not a picture.
- Comments under posts are not included.

### Legal

Reads only what Telegram shows any visitor of a public channel. You are responsible for how you use the data.

# Actor input Schema

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

Public channel links (t.me/name), @usernames or bare usernames, one per line. Private channels and groups are not visible without joining.

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

Newest first. Telegram serves 20 posts per page.

## `newerThanDays` (type: `integer`):

Stop at older posts. Leave empty for the whole history up to the limit above.

## `keywords` (type: `array`):

Keep only posts whose text or link preview contains any of these words (case-insensitive). Skipped posts are not charged.

## `includeChannelInfo` (type: `boolean`):

Add the channel's subscriber count to each post, handy for views-per-subscriber in a spreadsheet.

## `proxyConfiguration` (type: `object`):

Requests go out directly. This proxy is only used when Telegram refuses one.

## Actor input object example

```json
{
  "channels": [
    "https://t.me/durov",
    "@binance_announcements",
    "tginfo"
  ],
  "maxPostsPerChannel": 100,
  "keywords": [
    "airdrop",
    "listing"
  ],
  "includeChannelInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every post: text, date, views, reactions, paid stars, photos, videos, links, hashtags, link preview, forward and reply details.

## `channelReport` (type: `string`):

Per channel: subscribers, median and average views per post, view rate, reaction rate, posts per day, top posts, and channels that failed.

# 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": [
        "https://t.me/durov",
        "@binance_announcements"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("getdataforu/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": [
        "https://t.me/durov",
        "@binance_announcements",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("getdataforu/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": [
    "https://t.me/durov",
    "@binance_announcements"
  ]
}' |
apify call getdataforu/telegram-channel-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getdataforu/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/e8nNxhpgtMM7Wnhsa/builds/f6WxvjoadVa4tsDKf/openapi.json
