# Telegram Channel Scraper - Posts, Views, Reactions (`om_kh/telegram-channel-scraper`) Actor

Scrape public Telegram channels: post text, date, views, reactions, media, polls, replies, links and forwards. Channel profile and subscribers, keyword search, date and last-N-days filters. No login, no phone. $0.50 per 1,000 posts.

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

## Pricing

from $0.28 / 1,000 posts

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 — Posts, Views, Reactions

> Scrape **public Telegram channels**: post text, date, **views**, **reactions**, photos,
> video flag, links and forwards — with the channel's title and **subscriber count** on every
> row. Search a keyword inside a channel or keep only recent posts. No login, no phone
> number, no Telegram API key. **$0.50 per 1,000 posts, no start fee.**

### Free tier — 20 results free on every run

**The first 20 results of every run are free**, on every run you ever make — not a one-off trial. One guard: the free allowance never covers more than half of a run, so the offer stays sustainable.

### Measured, not promised

Test of 18 October 2026 on Apify: the last 100 posts of t.me/durov and @telegram.

| | Telegram Channel Scraper (om_kh) | Most-reviewed Telegram Actor on the Store |
|---|---|---|
| Posts returned | **200 of 200 in 22 seconds** | not tested |
| Views, reactions, date, channel subscribers | 200 of 200 | not tested |
| Rating (Store) | new | 2.8 stars (17 reviews) |
| Price per 1,000 posts, free plan | **$0.50** | $5 |

A channel without a public web preview comes back as a clear error row and is never charged.

### What does this Telegram channel scraper do?

Give it channels (`https://t.me/durov`, `@telegram` or just `durov`). For each one it reads
Telegram's own public web preview of the channel and returns one row per post, newest
first, going back as far as you ask (up to 5,000 posts per channel).

Each row contains the post and the channel card, so you can sort and compare channels
directly in a spreadsheet.

### Compared with automation-lab/telegram-scraper

Read on the Store on 2026-10-23 (Telegram Channel & Profile Scraper). Where it does better, this section says so.

- **Built on the site's own data**, not a resold scraper: no second Actor between you and the source.
- **Free results on every run** and a hard cost cap (`maxTotalChargeUsd`).
- **Price:** $0.5 per 1,000 here, $1 there.

### Why use it

1. **No account, no phone, no API key.** Nothing to configure, nothing to get banned.
2. **Engagement you can rank.** Exact `views` and the total of all `reactionsTotal` per post.
3. **Channel card on every row.** Title, subscribers, verified badge and description.
4. **Keyword search inside a channel** and a **"posted after" date** filter.
5. **Cheap and simple.** $0.0005 per post, no start fee, first 20 posts per run free
   (at most half of the run).
6. **Built for automation and AI agents.** JSON, CSV, Excel, API, schedules, n8n, Make,
   Zapier and MCP.

### How to use it in 3 steps

1. Click **Try for free** — `t.me/durov` and `@telegram` are prefilled.
2. Add your channels, how many posts, and optionally a keyword or a start date.
3. Click **Start** and download JSON, CSV or Excel.

### Input

| Field | What it does |
|---|---|
| `channels` | Public channels: t.me links, @usernames or usernames (up to 100). |
| `maxPostsPerChannel` | Newest posts first, 1 to 5,000. Default 100. |
| `searchQuery` | Optional keyword, searched with the channel's own search. |
| `postedAfter` | Optional date `YYYY-MM-DD`: only posts on or after it. |
| `lastNDays` | Only the last N days (1 = today). Handy for daily schedules. |
| `profileOnly` | One row per channel with its profile, no posts. |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "channels": ["https://t.me/durov", "@telegram"],
  "maxPostsPerChannel": 500,
  "postedAfter": "2026-01-01"
}
```

### Output

Real example (text trimmed):

A real row from this Actor's latest run on Apify (2026-10-23; long texts are cut and people's names hidden here, your dataset has them in full):

```json
{
  "status": "ok",
  "postId": 548,
  "url": "https://t.me/durov/548",
  "channel": "durov",
  "date": "2026-09-11T16:04:02+00:00",
  "text": "🤝 Telegram has become the sponsor of Codeforces — the largest competitive programming platform in the world. \n\n ⚡CodeForces organizes ove...",
  "views": 3640000,
  "reactionsTotal": 78890,
  "author": "(hidden here)",
  "hasVideo": false,
  "linkPreviewUrl": "https://codeforces.com/blog/entry/156620",
  "links": [
    "https://codeforces.com/blog/entry/156620"
  ],
  "channelTitle": "Pavel Durov",
  "channelSubscribers": 10300000,
  "channelVerified": true,
  "channelDescription": "Founder of Telegram.",
  "channelAvatarUrl": "(hidden here)"
}
```

### How much does it cost?

| Event | Price |
|---|---|
| Post | **$0.0005** ($0.50 per 1,000) |
| Start fee | none |

Example: the last 1,000 posts of 10 channels = 10,000 posts = **$5**. Paid Apify plans
get lower tier prices.

### Use cases

- **Crypto and trading research** — track signal and news channels, views and reactions.
- **Media monitoring** — follow news channels and brand mentions by keyword.
- **Competitor and community analysis** — compare channels by subscribers and engagement.
- **AI and NLP datasets** — clean text with dates for sentiment and topic models.

### Use it from code (API)

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/telegram-channel-scraper").call(run_input={
    "channels": ["@durov", "@telegram"],
    "maxPostsPerChannel": 200,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["channel"], post["date"], post["views"], post["text"][:80])
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~telegram-channel-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"channels": ["https://t.me/durov"], "maxPostsPerChannel": 50}'
```

### Integrations: n8n, Make, Zapier, Google Sheets

Schedule the Actor with `postedAfter` set to yesterday and send new posts to Slack, a
Google Sheet or your database with the Apify app in n8n, Make or Zapier.

### Use it from an AI agent (MCP)

Connect Claude, Cursor or any MCP client to `https://mcp.apify.com` and add
`om_kh/telegram-channel-scraper` as a tool: "summarize the last 50 posts of @durov".

### Tips and limits

- Only **public channels** with a web preview (t.me/s/…) work. Private channels, groups and
  member lists are not supported and never will be.
- Some channels disable the web preview; they are reported as an error and not charged.
- Views and subscribers are rounded the way Telegram shows them (e.g. 1.82M).

### FAQ

**Do I need a Telegram account or phone number?**
No.

**Can I get members or phone numbers of a channel?**
No. Only public posts and the public channel card.

**Is it legal?**
It reads content that the channel publishes publicly on the web. Use it in line with the
laws and terms that apply to you.

### Related Actors

- [X (Twitter) Search Scraper - Posts, Likes, Replies](https://apify.com/om_kh/twitter-x-search-scraper) — the same topic on X.
- [Reddit Posts & Comments Scraper - Upvotes, Text, Date](https://apify.com/om_kh/reddit-posts-comments-scraper) — community discussion.
- [Kalshi & Polymarket Scraper - Odds, Probability, Volume](https://apify.com/om_kh/kalshi-polymarket-scraper) — what markets think about the news.

### Your feedback

Did this Actor save you time? A short review on the **Reviews** tab helps other people find it, and every review is read. Something missing or broken? Open an issue on the **Issues** tab: it is answered and fixed fast.

# Actor input Schema

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

Public Telegram channels: t.me links, @usernames or usernames, one per line (up to 100).

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

Newest posts first, 1 to 5,000. Default 100.

## `searchQuery` (type: `string`):

Only posts matching this keyword, using the channel's own search.

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

Only posts on or after this date (YYYY-MM-DD).

## `lastNDays` (type: `integer`):

1: today's posts only. 2: today and yesterday. Empty or 0: no limit. Handy for daily schedules.

## `profileOnly` (type: `boolean`):

Return one row per channel (title, description, subscribers, photo and video counts, verified badge, avatar) and no posts.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cost cap for this run.

## Actor input object example

```json
{
  "channels": [
    "https://t.me/durov",
    "@telegram"
  ],
  "maxPostsPerChannel": 30,
  "profileOnly": false
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

## `results` (type: `string`):

Posts in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

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

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/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",
        "@telegram",
    ],
    "maxPostsPerChannel": 30,
}

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

```

## MCP server setup

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