# Telegram Channel Scraper - Posts, Views, Reactions & Media (`zaver.api/telegram-channel-scraper`) Actor

Scrape public Telegram channels without the Telegram API: posts with text, views, reactions, photos, videos, links and dates, plus channel subscribers. Search inside channels and filter by date. No account, no phone number, no start fee. CSV, Excel or JSON.

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

## Pricing

from $1.99 / 1,000 scraped results

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 Scraper — Posts, Views, Reactions, Media and Subscribers

**Scrape public Telegram channels without the Telegram API.** Enter channel names or links and export every post with its text, view count, reactions, photos, videos, links and date, plus each channel's subscriber count. No Telegram account, no phone number, no `api_id`. Pay per post, no start fee.

> ⭐ Whole channel history · views and reactions · photos, videos, polls and files · search inside channels · date filters · subscriber counts · free channel row · API and MCP ready

### What does Telegram Channel Scraper do?

Telegram publishes a web preview of every public channel. This Actor reads that preview and turns it into clean rows, one per post.

| You enter | You get |
|---|---|
| A channel name or link, such as `durov` or `https://t.me/durov` | The channel's posts, newest first, as far back as you ask |
| A link to one post, such as `https://t.me/durov/528` | That post |
| Channels plus keywords | Only the posts that match, using Telegram's own in-channel search |
| Channels plus a date window | Only the posts from that period |

Each channel also returns one free row with its title, description, subscriber count and verified status.

### What data does it extract?

#### Post fields

| Field | Description |
|---|---|
| `text` | Full post text, with line breaks |
| `date` | Publication time, ISO 8601 with time zone |
| `views` | View count |
| `reactions`, `reactionsTotal` | Each reaction with its count, and the total |
| `url`, `id` | Link to the post and its number in the channel |
| `channel`, `channelTitle` | Channel username and display name |
| `author` | Post signature, when the channel signs posts |
| `links`, `hashtags`, `mentions` | Links, hashtags and @mentions found in the text |
| `isEdited`, `isForwarded`, `forwardedFrom` | Edit flag, and the original source of forwarded posts |
| `replyToUrl` | The post this one replies to |

#### Media fields

| Field | Description |
|---|---|
| `mediaType` | `photo`, `video`, `album`, `document`, `voice`, `poll` or `sticker` |
| `photos` | Image URLs |
| `videos` | Video URL, thumbnail and duration |
| `document` | File name and size |
| `poll` | Question, options with percentages, and voter count |
| `linkPreview` | URL, site name, title, description and image of the link card |

#### Channel fields

| Field | Description |
|---|---|
| `title`, `description` | Channel name and bio |
| `subscribers` | Subscriber count |
| `photos`, `videos`, `files`, `links` | How many of each the channel has posted |
| `isVerified`, `isScam` | Telegram's verified and scam labels |
| `avatar`, `url` | Channel picture and link |

### A Telegram API alternative

Telegram's API is built for apps that act as a user. To read a channel with it you register an application for an `api_id` and `api_hash`, sign in with a real phone number, keep a session file safe, and handle flood-wait limits. Libraries such as Telethon and Pyrogram wrap the same steps, and a number used too aggressively can be limited or banned.

This Actor is a **Telegram API alternative** for public channels. It works **without the Telegram API**: no `api_id`, no phone number, no session, no account at risk.

| | Telegram API, Telethon, Pyrogram | This Actor |
|---|---|---|
| Setup | Register an app, sign in with a phone number | Paste channel names |
| Account risk | Flood waits and bans hit your number | No account is used |
| Private channels and groups | Yes, if your account is a member | No, public channels only |
| Output | API objects | Flat rows: CSV, Excel, JSON |

### Why use this Telegram scraper

#### Views and reactions on every post

Engagement numbers come with each post, so you can rank a channel's content or compare channels without a second tool.

#### Whole history or just what is new

Set a high limit to archive a channel from its first post. Or set **Only posts newer than** to `24 hours` and schedule the Actor: collection stops at the first older post, so monitoring runs finish in seconds.

#### Search inside channels

Give keywords or hashtags and only matching posts are returned. A post that matches several keywords is delivered and billed once.

#### No start fee, and the channel row is free

Starting a run costs nothing. You pay per post delivered. Channel details, filtered-out posts and channels that cannot be read are free.

#### Nothing to configure

No proxies to buy, no cookies, no login. Paste channels and press Start.

### How to scrape a Telegram channel

1. Open the Actor and enter **Channels or post links**, one per line.
2. Set **Max posts per channel**.
3. Optionally add **Search inside the channels**, a date window, **Minimum views** or **Only posts with media**.
4. Press **Start**. Rows appear in the dataset as they are collected.
5. Export as CSV, Excel, JSON or XML, or read the dataset through the API.

> 💡 Dates accept a calendar date such as `2026-09-01` or a period such as `24 hours`, `7 days`, `2 weeks` or `3 months`.

### Input example

```json
{
  "channels": ["durov", "https://t.me/telegram"],
  "maxMessagesPerChannel": 500,
  "newerThan": "30 days",
  "minViews": 1000,
  "includeChannelInfo": true
}
```

| Field | Type | Description |
|---|---|---|
| `channels` | array | **Required.** Usernames, channel links or single-post links. |
| `maxMessagesPerChannel` | integer | Posts per channel, newest first. Default 100. |
| `searchQueries` | array | Keywords or hashtags to search inside each channel. |
| `newerThan` | string | Only posts after this date or within this period. |
| `olderThan` | string | Only posts before this date. |
| `minViews` | integer | Skip posts with fewer views. |
| `onlyWithMedia` | boolean | Keep only posts with media. |
| `includeChannelInfo` | boolean | Add a free row per channel. Default on. |
| `maxItems` | integer | Cap on posts for the whole run. 0 means no cap. |

### Output example

A post row:

```json
{
  "type": "message",
  "channel": "newsdesk",
  "channelTitle": "News Desk",
  "id": 3225,
  "url": "https://t.me/newsdesk/3225",
  "date": "2026-09-22T03:26:17+00:00",
  "text": "Markets opened higher after the central bank held rates.\nFull story below.",
  "views": 48200,
  "reactionsTotal": 344,
  "reactions": [{"count": 96, "emoji": "🔥"}, {"count": 89, "emoji": "❤"}],
  "mediaType": "photo",
  "photos": ["https://cdn4.telesco.pe/file/example.jpg"],
  "links": ["https://example.com/markets"],
  "hashtags": ["#markets"],
  "linkPreview": {"url": "https://example.com/markets", "siteName": "Example", "title": "Markets open higher"},
  "isEdited": false,
  "isForwarded": false,
  "source": "newsdesk"
}
```

A channel row:

```json
{
  "type": "channel",
  "channel": "newsdesk",
  "url": "https://t.me/newsdesk",
  "title": "News Desk",
  "description": "Business news as it happens.",
  "subscribers": 187000,
  "photos": 800,
  "videos": 49,
  "links": 3180,
  "isVerified": true
}
```

### Pricing

Pay per post. **No start fee, no monthly rental, no minimum.**

| Event | Charged for | Price |
|---|---|---|
| `message-scraped` | each post delivered | **$1.99 / 1,000** |
| - | channel rows and error rows | **free** |

| You export | You pay |
|---|---|
| 1,000 posts | **$1.99** |
| 10,000 posts | **$19.90** |
| 100,000 posts | **$199.00** |

You are charged right after each batch lands in your dataset, so a run you stop early costs only what it delivered. Posts removed by your filters are free.

### Use cases

#### News and media monitoring

Follow news channels and official sources in one feed. Schedule hourly runs with a 24-hour window and send new posts to Slack, a sheet or your own dashboard.

#### Brand and keyword tracking

Search a list of channels for your brand, product or competitor names. Each match comes with views and reactions, so you can see which mentions travelled.

#### Crypto and market intelligence

Announcement and signal channels move fast. Collect posts with timestamps and engagement to study what was said, when, and how the audience reacted.

#### Channel analytics and competitor research

Compare channels by subscribers, posting frequency, average views and reactions per post. Find a channel's best-performing content by sorting on `views`.

#### OSINT and academic research

Archive the full public history of channels for analysis, with stable post IDs, exact timestamps and forward sources for tracing how content spreads.

#### AI datasets

Feed channel posts into summarisation, classification or retrieval pipelines. Text keeps its line breaks and links are extracted for you.

### FAQ

**Do I need a Telegram account, phone number or API key?**
No. It works without the Telegram API and without logging in.

**Is scraping Telegram legal?**
This is general information, not legal advice. The Actor collects only posts that channel owners have published publicly and that Telegram shows to anyone without an account. It cannot reach private channels, groups, members or messages. Whether your use is lawful depends on where you are and what you do with the data. Posts can contain personal data and copyrighted material, and Telegram's terms apply to automated use. Collect only what you need, do not republish personal data or copyrighted media, and ask a lawyer before building a commercial product on the data.

**Can it scrape private channels, groups or chats?**
No. Only public channels have a web preview. Private channels, invite links, groups, bots and user profiles return a free error row.

**Can it get channel members or subscribers' names?**
No. Telegram does not publish who subscribes to a channel. You get the subscriber count.

**Does it return comments on posts?**
No. Comments live in a linked discussion group, which the web preview does not show.

**How far back can it go?**
To the first post of the channel. Set **Max posts per channel** high enough and the Actor pages back until the start.

**Why is a view count rounded, such as 1.5M?**
Telegram's preview abbreviates large numbers, so `18.9M` is returned as 18,900,000. Counts below 1,000 are exact.

**Can it download the photos and videos?**
It returns the media URLs. They are hosted by Telegram and can be downloaded with any HTTP client. Links to large videos can expire, so fetch them soon after the run.

**A post says it must be opened in Telegram. Why?**
Some posts, such as very large files or restricted content, are not shown in the preview. They are returned with `needsApp: true` and whatever text is available.

**How fast is it?**
About 1,000 posts per minute per run. A channel with 10,000 posts takes about ten minutes.

**Can I run it on a schedule?**
Yes. Use a short **Only posts newer than** window and de-duplicate on `url`.

### Integrations

- **Apify API** - start runs and fetch datasets from Python, Node.js, cURL or any HTTP client.
- **MCP server** - call this Actor as a tool from Claude, Cursor, ChatGPT agents and any MCP client.
- **No-code** - Make, Zapier, n8n, Google Sheets, Airtable, Slack, webhooks.
- **Schedules** - run hourly or daily for monitoring, appending to the same dataset.
- **Exports** - JSON, JSONL, CSV, Excel (XLSX), XML, HTML table, RSS.

### Related actors

**Social**

- [Reddit Scraper](https://apify.com/zaver.api/reddit-scraper) - posts, comments, search, users and communities
- [Reddit Lead Finder](https://apify.com/zaver.api/reddit-lead-finder) - people asking for what you sell
- [Instagram Scraper](https://apify.com/zaver.api/instagram-scraper) - posts, reels, comments and profiles
- [TikTok Hashtag Scraper](https://apify.com/zaver.api/tiktok-hashtag-scraper) - videos by hashtag

**Search and commerce**

- [Google Search Results Scraper](https://apify.com/zaver.api/google-search-scraper) - organic results, news and People Also Ask
- [Amazon Product Scraper](https://apify.com/zaver.api/amazon-product-scraper) - search results, prices and ASIN lookup
- [Indeed & LinkedIn Jobs Scraper](https://apify.com/zaver.api/indeed-linkedin-jobs-scraper) - job listings with salary and description

***

*Not affiliated with, endorsed by or sponsored by Telegram. This Actor reads only the public web preview of public channels and does not log in. You are responsible for using the data in line with applicable laws and Telegram's terms.*

# Actor input Schema

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

Public Telegram channels, one per line: a username (<code>durov</code>, <code>@durov</code>), a channel link (<code>https://t.me/durov</code>) or a link to a single post (<code>https://t.me/durov/528</code>). Private channels and invite links cannot be read.

## `maxMessagesPerChannel` (type: `integer`):

Maximum posts per channel, newest first. The whole history of a channel can be collected by setting this high.

## `searchQueries` (type: `array`):

Optional. Keywords or hashtags, one per line. Only posts matching a keyword are returned, using Telegram's own in-channel search. A post that matches several keywords is delivered once.

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

Optional. A date (<code>2026-09-01</code>) or a period (<code>24 hours</code>, <code>7 days</code>, <code>2 weeks</code>, <code>3 months</code>). Collection stops at the first older post, so monitoring runs stay small.

## `olderThan` (type: `string`):

Optional. A date (<code>2026-09-30</code>) or a period. Combine with the field above for a date range.

## `minViews` (type: `integer`):

Skip posts with fewer views than this. Skipped posts are not billed.

## `onlyWithMedia` (type: `boolean`):

Keep only posts that contain a photo, video, album, file, voice message or poll.

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

Add one row per channel with title, description, subscriber count, verified flag and media counts. This row is free.

## `maxItems` (type: `integer`):

Hard cap on posts for the whole run. 0 means no cap.

## Actor input object example

```json
{
  "channels": [
    "durov"
  ],
  "maxMessagesPerChannel": 100,
  "minViews": 0,
  "onlyWithMedia": false,
  "includeChannelInfo": true,
  "maxItems": 0
}
```

# Actor output Schema

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

All dataset items.

## `resultsCsv` (type: `string`):

CSV download.

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

Counts for the run.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zaver.api/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": ["durov"] }

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

```

## MCP server setup

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