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

Scrape public Telegram channels without login or API key. Get posts, views, reactions, media, links, polls and subscriber counts. Search inside channels by keyword.

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

## Pricing

$1.00 / 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.

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

Extract posts and channel facts from public [Telegram](https://telegram.org) channels. Telegram has more than 1 billion monthly users, and its channels are a main source for news, crypto, politics and brand communities. Use this Actor for media monitoring, competitor tracking, research, trend analysis and training data.

- **Three kinds of data in one Actor.** Channel posts, keyword search inside channels, and channel info with subscriber counts.
- **No login, no phone number, no API key.** The Actor reads the public web preview that Telegram shows to every visitor.
- **Rich posts.** Text, views, reactions, photos and videos, link previews, hashtags, mentions, polls, forwards and replies.
- **Clean output.** English field names like `views`, `postedAt` and `subscribers`, numbers as numbers ("12.3K" becomes 12300), dates in ISO format. Text stays in the original language.
- **Low price.** $1 per 1,000 results.

### What data can you get?

| Mode | One result is | Main fields |
|---|---|---|
| Posts of channels | One post | Text, date, views, reactions, media files, link preview, links, hashtags, mentions, poll, forward and reply info |
| Search inside channels | One post | The same fields, only for posts that contain your keyword |
| Channel info | One channel | Name, description, exact subscriber count, photo, video, file and link counts, avatar, verified badge, date of the latest post |

You can also paste links to single posts and get exactly those posts.

### How to use it

1. Click **Try for free**.
2. Choose a mode in **What to scrape**.
3. Add channels. Names (`durov`), @names (`@durov`) and links (`https://t.me/durov`) all work.
4. Click **Start**, then download the results as JSON, CSV or Excel.

### Input examples

Get the newest 200 posts of each channel:

```json
{
    "mode": "posts",
    "channels": ["telegram", "durov"],
    "maxItemsPerChannel": 200,
    "maxItems": 400
}
```

Get all posts of the last 7 days:

```json
{
    "mode": "posts",
    "channels": ["https://t.me/binance_announcements"],
    "postedAfter": "7 days",
    "maxItems": 1000
}
```

Find posts that mention a keyword:

```json
{
    "mode": "search",
    "channels": ["durov", "telegram"],
    "searchQuery": "TON"
}
```

Get subscriber counts and descriptions:

```json
{
    "mode": "channelInfo",
    "channels": ["durov", "telegram", "nytimes"]
}
```

Get single posts:

```json
{
    "mode": "posts",
    "channels": [],
    "postUrls": ["https://t.me/telegram/105"]
}
```

### Output examples

A post (some empty fields are left out here to keep the example short):

```json
{
    "type": "post",
    "channel": "telegram",
    "channelTitle": "Telegram News",
    "messageId": 445,
    "url": "https://t.me/telegram/445",
    "text": "For all the features from this update, like statistics and custom limits for polls, streaming text for bots, silent scheduled messages and more – check out the full blog:\nhttps://telegram.org/blog/ai-bot-revolution-11-new-features\n\nMay Features\n1 • 2 • 3 • 4 • 5 • More",
    "textHtml": "For all the features from this update, like <b>statistics</b> and <b>custom limits</b> for polls, ...",
    "postedAt": "2026-05-14T16:09:50Z",
    "views": 2930000,
    "isEdited": false,
    "authorSignature": null,
    "forwardedFromName": null,
    "forwardedFromUrl": null,
    "replyToMessageId": null,
    "mediaTypes": [],
    "mediaCount": 0,
    "media": [],
    "linkPreviewUrl": "https://telegram.org/blog/ai-bot-revolution-11-new-features",
    "linkPreviewTitle": "Guest AI Bots, Bot-to-Bot Chats, Chat Automation, Custom AI Styles, 100M+ Emoji & Sticker Search and Much More",
    "linkPreviewSite": "Telegram",
    "links": [
        "https://telegram.org/blog/ai-bot-revolution-11-new-features",
        "https://t.me/telegram/440"
    ],
    "hashtags": [],
    "mentions": [],
    "reactionsTotal": null,
    "reactions": [],
    "scrapedAt": "2026-09-29T11:58:10Z"
}
```

The media, reactions and poll parts of other posts look like this:

```json
{
    "mediaTypes": ["video"],
    "mediaCount": 1,
    "media": [
        {
            "type": "video",
            "url": "https://cdn4.telesco.pe/file/12ce1e3294.mp4?token=...",
            "thumbnailUrl": "https://cdn4.telesco.pe/file/Hu_Vcz19B6W2...",
            "durationSeconds": 27,
            "messageId": 78147,
            "isSpoiler": false
        }
    ],
    "reactionsTotal": 111,
    "reactions": [
        {"emoji": "❤", "count": 54, "isPaid": false, "customEmojiId": null},
        {"emoji": "👍", "count": 25, "isPaid": false, "customEmojiId": null}
    ],
    "pollQuestion": "Which feature you would like us to build next?",
    "pollType": "Anonymous Poll",
    "pollMultipleChoice": false,
    "pollVoters": 627000,
    "pollOptions": [
        {"text": "Video calls", "percent": 62.0},
        {"text": "Group voice calls", "percent": 16.0},
        {"text": "Folders for chats", "percent": 22.0}
    ]
}
```

A channel:

```json
{
    "type": "channel",
    "entityType": "channel",
    "username": "durov",
    "name": "Pavel Durov",
    "url": "https://t.me/durov",
    "previewUrl": "https://t.me/s/durov",
    "hasWebPreview": true,
    "description": "Founder of Telegram.",
    "subscribers": 10589274,
    "subscribersIsExact": true,
    "photosCount": 102,
    "videosCount": 46,
    "filesCount": null,
    "linksCount": 200,
    "avatarUrl": "https://cdn4.telesco.pe/file/oMgm3RFBlRf1...",
    "isVerified": true,
    "isScam": false,
    "isFake": false,
    "latestMessageId": 548,
    "latestPostAt": "2026-09-11T16:04:02Z",
    "scrapedAt": "2026-09-29T11:41:02Z"
}
```

### How much does it cost?

You pay per saved result: **$1.00 per 1,000 results**. There is no start fee and no monthly rental. A post with ten photos is still one result.

| Run | Results | Cost |
|---|---|---|
| Newest 100 posts of two channels | 100 | $0.10 |
| Info for 50 channels | 50 | $0.05 |
| 5,000 posts of a news channel | 5,000 | $5.00 |

Set a maximum charge per run in the run options and the Actor stops when it is reached.

### Limits you should know

- **Public channels only.** Private channels, invite links (`t.me/+...`), groups, bots and user accounts cannot be read. The Actor skips them with a warning in the log and continues with the other channels. In channel info mode, groups and bots still return their name, description and member count.
- **Some public channels are not shown on the web.** The owner can restrict this, and Telegram hides channels that it limited, for example for adult content or copyright complaints. These channels are skipped with a warning. Channel info still returns their name, description and subscriber count, with `hasWebPreview: false`.
- **Channels blocked by country.** Telegram hides some channels in some countries. The Actor runs on Apify's servers, so a channel that is blocked there looks like it does not exist, even if you can open it at home. In our tests this happened with `rt_russian`. A proxy from another country, set in **Proxy**, can help.
- **Search returns at most about 22 posts per channel and keyword.** This is a limit of Telegram's web search. It returns the newest matching posts and stops. To get more, use several keywords in separate runs, or scrape the posts of the channel and filter them yourself.
- **Search is done by Telegram, channel by channel.** There is no search across all of Telegram. Telegram also matches word forms and link text, so a few results may not contain the exact keyword in the text.
- **No comments.** Comments under posts are not part of the web preview.
- **Views and reactions are rounded by Telegram** above 1,000, for example "12.3K" is saved as 12300. Subscriber counts in channel info are exact.
- **Some posts cannot be shown on the web.** Live streams, giveaways, paid media and some other post types appear with empty text and a `mediaNote` such as "Please open Telegram to view this post". Large videos have a thumbnail and duration but no file link, with the note "Media is too big".
- **Custom emoji reactions have no emoji character.** They are saved with `customEmojiId` and the count.
- **Media links expire.** Photo and video links point to Telegram's servers and stop working after some time. Download the files soon after the run if you need them. The Actor does not download files.
- **Albums are one result.** A post with several photos or videos is one result, with all files in `media`.
- **Service messages are skipped.** Notices like "Channel photo updated" are not saved.
- **Renamed channels.** If a channel has more than one username, the `channel` field shows the name Telegram uses in its post links, which can differ from the name you typed.
- **Speed.** About 20 posts per request and 1 to 2 requests per second, so 1,000 posts take around 1 minute. The Actor reads posts from the newest to the oldest, so reaching very old posts of a large channel takes a long time.

### Tips

- **Track growth.** Run channel info on a schedule, for example daily, and compare `subscribers` over time.
- **Monitor new posts.** Schedule posts mode with **Only posts newer than** set to `1 day` to collect only fresh posts.
- **Spread the results.** Without **Max posts per channel**, the Actor takes posts from all channels in turn until **Max results** is reached.

### FAQ

**Is it legal?** The Actor collects only data that Telegram shows publicly to every visitor without login. Results can contain personal data such as author names. Make sure you have a legitimate reason to process it, as required by the GDPR and similar laws.

**Do I need a Telegram account or a proxy?** No. It works without both.

**Does it download photos and videos?** No. It saves the links to the files.

**Can it read groups or private channels?** No. Telegram shows them only inside the app.

**Something is broken or missing?** Open a ticket in the Issues tab. Issues are usually answered within a day.

# Actor input Schema

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

Choose the kind of data you need. Posts and search save one result per post. Channel info saves one result per channel.

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

Public Telegram channels. Accepts names (durov), @names (@durov) and links (https://t.me/durov or https://t.me/s/durov). Private channels, groups and bots cannot be scraped and are skipped with a warning.

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

Needed in search mode. Saves only posts that contain this word or phrase, for example "bitcoin" or "#news". Telegram searches each channel separately.

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

Maximum number of results to save in this run.

## `maxItemsPerChannel` (type: `integer`):

Optional. Limits the posts saved for each channel. Without it, the Actor reads all channels in turn, newest posts first, until Max results is reached.

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

Optional. Stops reading a channel when it reaches posts older than this. Use a date like 2026-01-31 or a period like "7 days".

## `postUrls` (type: `array`):

Optional. Links to single posts, for example https://t.me/durov/400. Each post is saved as one result, in addition to the channels above.

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

Optional. The Actor works without a proxy. Turn one on only if runs start failing with blocked requests.

## Actor input object example

```json
{
  "mode": "posts",
  "channels": [
    "telegram",
    "durov"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Posts or channels saved by the run, one item per result.

# 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",
        "durov"
    ],
    "maxItems": 100
};

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

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

```

## MCP server setup

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