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

Scrape public Telegram channels without login: posts with text, date, views, reactions, photos, videos, files, polls, links, hashtags and forwards, filtered by date range and keywords, plus channel details like subscribers, description and verified badge.

- **URL**: https://apify.com/automly/telegram-channel-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** Social media, News
- **Stats:** 3 total users, 0 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.45 / 1,000 posts

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 & Media

### What is Telegram Channel Scraper?

**Telegram Channel Scraper** is a tool that lets you **scrape posts from public Telegram channels**: text, date, views, reactions, photos, videos, files, polls, link previews, links, hashtags, mentions, forwards and replies, plus **channel details** like subscribers, description, verified badge and photo. Paste channel names or t.me links, click **Start**, and download the posts as Excel, CSV or JSON.

- ⚡ **Fast:** 6,800 posts from six channels in about 2 minutes (our tests)
- 📜 **Full history:** read a channel back to its very first post, or jump straight to any date range
- 🔎 **Keyword filter:** keep only the posts that mention your words, from the whole history
- 🔓 **No login:** no Telegram account, phone number or bot needed
- 💸 **Free to try:** the $5 of free usage every Apify account gets each month covers about 5,000 posts

### What can Telegram Channel Scraper do?

- **Scrape Telegram channel posts** from any public channel, like `durov`, `telegram` or `bbcrussian`
- **Export a channel's entire post history** to Excel or CSV, from the newest post back to the first one
- **Scrape posts between two dates**, for example everything a channel posted in September 2026, or in 2017
- **Monitor Telegram channels for keywords**: brand names, tickers, topics, in any language
- **Download Telegram photos, videos, voice notes and files**: every post gives the media links and thumbnails
- **Track Telegram post views and reactions** to measure engagement over time
- **Get Telegram channel subscriber counts**, descriptions, verified badges and photos, also for public groups (members and online count)
- **Scrape a single Telegram post** from its link
- Export to Excel, CSV, JSON, HTML or XML, or send the data to Google Sheets, Make, Zapier and more

### What data can you extract from Telegram?

| | | |
|---|---|---|
| 📝 Post text with line breaks | 📅 Date and time (UTC) | 👁️ Views |
| ❤️ Reactions by emoji, paid stars | 🖼️ Photos and albums | 🎬 Videos with thumbnail and length |
| 🎙️ Voice notes and audio | 📎 Files with name and size | 📊 Polls with options and percentages |
| 🔗 Links and link previews | #️⃣ Hashtags | @ Mentions |
| ↪️ Forwarded from | 💬 Reply to post | ✏️ Edited flag and author signature |
| 👥 Channel subscribers | ✅ Verified, scam and fake labels | 🧾 Channel description, photo and links |

### How to scrape Telegram channels

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **Telegram Channel Scraper**.
3. Enter channel usernames or links, one per line (`durov`, `@durov` or `https://t.me/durov`).
4. Choose **Posts** or **Channel details**, set **Max posts per channel**, and add dates or keywords if you need them.
5. Click **Start**, then download the data as Excel, CSV, JSON or HTML.

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

You pay only for the rows you get: one price per post, and another per channel row when **What to scrape** is **Channel details**. With **Keywords**, only matching posts are saved and paid for.

| Apify plan | Posts per 1,000 | Channels per 1,000 |
|---|---|---|
| Free | **$1.00** | **$2.00** |
| Starter (Bronze) | **$0.80** | **$1.60** |
| Scale (Silver) | **$0.60** | **$1.20** |
| Business (Gold) and higher | **$0.45** | **$0.90** |

Platform usage is included in these prices, so there is nothing else to pay.

Example: the latest 1,000 posts of a news channel cost $1.00 on the Free plan and $0.45 on Business. Subscriber counts and details for 100 channels cost $0.20 on the Free plan.

Every Apify account gets **$5 of free usage each month**, enough for about 5,000 posts at Free-plan prices. See the **Pricing** tab for details.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Channels** | Channel usernames or links: `durov`, `@durov`, `https://t.me/durov`. A post link like `https://t.me/durov/528` gets that one post. Public groups work with **Channel details** |
| **What to scrape** | **Posts** (one row per post) or **Channel details** (one row per channel or group) |
| **Max posts per channel** | How many posts to save from each channel, newest first (default 100). Set 0 for every post |
| **Posted after** | Only posts from this date on: a date like `2026-09-01`, or a span like `7 days` or `3 months` |
| **Posted before** | Only posts up to this date (the whole day counts). Old dates are reached quickly, even on channels with 100,000 posts |
| **Keywords** | Only posts containing any of these words or phrases. Case does not matter |

The latest 100 posts of two channels:

```json
{
  "channels": ["durov", "https://t.me/telegram"],
  "maxPostsPerChannel": 100
}
```

Everything a channel posted in September 2026:

```json
{
  "channels": ["bbcrussian"],
  "since": "2026-09-01",
  "until": "2026-09-30",
  "maxPostsPerChannel": 0
}
```

Posts from the last 7 days that mention Bitcoin or ETF:

```json
{
  "channels": ["cointelegraph", "binance_announcements"],
  "since": "7 days",
  "keywords": ["bitcoin", "etf"],
  "maxPostsPerChannel": 0
}
```

Subscriber counts and details of channels and groups:

```json
{
  "channels": ["durov", "telegram", "tondev_eng"],
  "dataType": "channels"
}
```

### ⬆️ Output

Every post is one row, newest first. A post from `durov`:

```json
{
  "type": "post",
  "postId": 540,
  "url": "https://t.me/durov/540",
  "channelUsername": "durov",
  "channelTitle": "Pavel Durov",
  "channelId": "1006503122",
  "date": "2026-08-10T09:29:58Z",
  "isEdited": false,
  "text": "🇺🇿 The 2026 International Olympiad in Informatics starts today in Tashkent.\n\n🏆 The IOI is the ultimate coding competition for high-school students...",
  "views": 4510000,
  "viewsText": "4.51M",
  "reactionsCount": 77110,
  "reactions": [
    {"emoji": "⭐", "customEmojiId": null, "isPaid": true, "count": 9110},
    {"emoji": null, "customEmojiId": "5373223594484587136", "isPaid": false, "count": 42400}
  ],
  "mediaType": "photo",
  "media": [
    {"type": "photo", "url": "https://cdn4.telesco.pe/file/rXuYXRpOtzkW...jpg", "thumbnailUrl": null, "duration": null, "title": null, "size": null, "postId": 540}
  ],
  "linkPreview": null,
  "poll": null,
  "links": [],
  "hashtags": [],
  "mentions": [],
  "forwardedFrom": null,
  "forwardedFromUrl": null,
  "replyToPostId": null,
  "replyToUrl": null,
  "signature": "Pavel Durov",
  "summary": "🇺🇿 The 2026 International Olympiad in Informatics starts today in Tashkent. 🏆 The IOI is the ultimate coding competition...",
  "source": "durov",
  "scrapedAt": "2026-10-02T13:29:34Z"
}
```

A channel details row:

```json
{
  "type": "channel",
  "channelUsername": "telegram",
  "channelTitle": "Telegram News",
  "url": "https://t.me/telegram",
  "channelType": "channel",
  "channelId": "1005640892",
  "description": "The official Telegram on Telegram. Much recursion. Very Telegram. Wow.",
  "isVerified": true,
  "isScam": false,
  "isFake": false,
  "photoUrl": "https://cdn1.telesco.pe/file/AjofbfcZEFDA...jpg",
  "subscribers": 9419595,
  "onlineMembers": null,
  "photosCount": 16,
  "videosCount": 228,
  "linksCount": 378,
  "hasPublicPosts": true,
  "latestPostId": 460,
  "latestPostDate": "2026-08-26T19:12:34Z"
}
```

`mediaType` is `text`, `photo`, `video`, `round_video`, `voice`, `audio`, `document`, `sticker`, `location`, `album` (several photos or videos in one post), `poll`, or `other` for posts Telegram shows only in its app. An album is one row: `media` lists every photo and video with its own `postId`.

The **Overview** tab lists every row with a short summary, and the **Posts**, **Media** and **Channel details** tabs show the details as tables. The run report lists, for every channel, how many posts were saved, the newest and oldest post date and whether the channel's first post was reached.

### How can I use Telegram data?

- **News and media monitoring:** follow what news channels publish, with views and reactions
- **Crypto and finance research:** collect announcements and signals from crypto channels, filter by ticker
- **Brand monitoring:** find every post that mentions your brand or product across many channels
- **Competitor analysis:** compare posting frequency, views and engagement of competing channels
- **Influencer and channel discovery:** rank channels by subscribers, verified status and activity
- **Research and AI datasets:** build text and media datasets from public channels, with dates and links
- **Archiving:** keep a copy of a channel's full public history

### Scrape more social media and news data

| Actor | What it gets |
|---|---|
| [X (Twitter) Scraper - Profile Tweets & Posts](https://apify.com/automly/x-twitter-profile-tweets-scraper) | Tweets from any public X profile: text, views, likes, reposts, replies, media and dates |
| [Reddit Scraper - Posts, Comments, Users, Subreddits & Search](https://apify.com/automly/reddit-ultimate-scraper) | Reddit posts, comments, subreddits, user profiles and keyword search results |
| [Facebook Groups Scraper - Public Group Posts](https://apify.com/automly/facebook-public-group-posts-scraper) | Posts from public Facebook groups: text, author, date, reactions, comments and media |
| [Threads Scraper: 200 Posts per Profile, Search & Replies](https://apify.com/automly/threads-public-posts-scraper) | Public Threads posts, profiles, keyword search and replies |
| [Google News Scraper API - Full Text, Monitoring & RSS](https://apify.com/automly/google-news-scraper-api) | Google News articles by keyword, with full text and only new articles on every run |

### ❓FAQ

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

$1.00 per 1,000 posts on the Free plan and less on paid plans, with platform usage included; channel detail rows have their own price. See the cost section above for every plan and price. **Max posts per channel** keeps the cost of a run under control, and you can also set a maximum cost per run.

#### How many posts can I get?

Everything a channel shows publicly, back to its first post. Big channels with tens of thousands of posts are read to the end when you set **Max posts per channel** to 0, and **Posted before** jumps straight to old posts without reading everything newer. A run with many channels takes about as long as a run with a few.

#### Do I need a Telegram account or phone number?

No. You don't need a Telegram account, phone number, bot or API key: the scraper collects the public posts anyone can see without signing in. Nothing is posted, joined or liked.

#### Can I scrape private channels or groups?

No. Private channels and invite links (`t.me/+...`) need an account and are reported as not found. Public groups give their details (title, description, members and online count) with **Channel details**; Telegram does not show group messages publicly, and member lists and phone numbers are never collected.

#### Can I download Telegram videos and photos?

Yes. `media` has a link to every photo, video, voice note and sticker and a thumbnail for videos. Telegram does not show very large videos on the web: those come with their thumbnail and length but no video link. Media links can stop working after a while, so download what you need soon after the run.

#### Are views and reactions exact?

They are the numbers Telegram shows publicly, which are rounded for big numbers (`4.51M`). `views` turns them into a number (4510000) and `viewsText` keeps them as shown. Subscriber counts on **Channel details** are exact. Comment and forward counts are not shown publicly.

#### What happens with a wrong name or a deleted post?

The run goes on with the other channels and ends successfully; the run report lists the names that do not exist, are private, belong to a person or a bot, or have no public posts. A post link to a deleted post is reported the same way.

#### Can I search all of Telegram by keyword?

Telegram has no public search across channels. Add the channels you care about and use **Keywords**: the scraper checks every post of each channel, from newest to oldest or within your dates.

#### Can I connect Telegram Channel Scraper to other tools or AI agents?

Yes. Start runs and download results with the Apify API or the Python and JavaScript clients, send results to Make, Zapier, n8n, Google Sheets or Slack with Apify integrations and webhooks, or let AI assistants and agents run it through the Apify MCP server at [mcp.apify.com](https://mcp.apify.com). For instant answers inside your app, its real-time API returns rows directly for `/posts?channel=durov&limit=20` and `/channels?channel=durov,telegram`, without starting a run.

#### Is it legal to scrape Telegram?

This scraper only collects what public channels chose to post for everyone to see. It never collects member lists, phone numbers or private chats. Posts can still contain personal data, which may be protected by laws such as GDPR, so only scrape for a legitimate reason, respect copyright when you reuse posts and media, and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Telegram Channel Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Telegram.

#### Something isn't working?

Open the **Issues** tab and tell us your input and what you expected, or which field you need. We read every one and usually reply within a day.

### ⭐ Your feedback

Have an idea or found a problem? Tell us in the **Issues** tab. If Telegram Channel Scraper saved you time, a short review on the **Reviews** tab helps other people find it.

# Actor input Schema

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

Add public channel usernames or links, one per line: durov, @durov or https://t.me/durov. A post link (https://t.me/durov/528) gets that one post. Public groups work with Channel details.

## `dataType` (type: `string`):

Choose one kind of data per run: the channels' posts, or the channels' details (title, subscribers, description, verified badge, photo).

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

Set how many posts to save from each channel, newest first. 0 saves every post the channel has.

## `since` (type: `string`):

Keep only posts from this date on: a date like 2026-09-01, or a span back from now like 7 days or 3 months.

## `until` (type: `string`):

Keep only posts up to this date (the whole day counts): a date like 2026-09-30, or a span back from now like 1 month. Older history is reached quickly, even on very large channels.

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

Keep only posts that contain any of these words or phrases (in the text, poll, file names or link preview). Case does not matter. Only matching posts are saved and counted toward the limit.

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

The default works for most runs. If results come back empty, try a different proxy option.

## Actor input object example

```json
{
  "channels": [
    "durov",
    "telegram"
  ],
  "dataType": "posts",
  "maxPostsPerChannel": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

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

No description

## `media` (type: `string`):

No description

## `channels` (type: `string`):

No description

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

No description

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

No description

# 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",
        "telegram"
    ],
    "dataType": "posts",
    "maxPostsPerChannel": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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",
        "telegram",
    ],
    "dataType": "posts",
    "maxPostsPerChannel": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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