# Telegram Channel Scraper - Posts, Views & Media, No Login (`despottt/telegram-channel-scraper`) Actor

Scrape posts from any public Telegram channel without login or API key: text, date, views, reactions, photos, videos, links, forwards, hashtags and channel info with subscriber count. Search inside channels, date filters and 'only new posts' monitoring.

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

## Pricing

from $0.50 / 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.

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: Export Posts, Views, Reactions & Media (No Login)

**Export the posts of any public Telegram channel to JSON, CSV or Excel. No login, no API key, no phone number.**

For every post you get the text, date, views, reactions, photos, videos, link previews, forwards, hashtags and mentions, plus the channel's title, description and subscriber count. It reads Telegram's own **public web preview** (`t.me/s/<channel>`), the same page anyone can open in a browser. That makes it fast and cheap, and it never asks for your Telegram account.

### What can this Telegram scraper do?

- ✅ **Full history, newest first.** It pages back automatically until your limit, a date, or the first post.
- ✅ **Rich fields:** `text` (line breaks kept), `date` (UTC ISO), `views` (as numbers: "6.01M" becomes 6010000), `reactions` (emoji or custom emoji id + count, with paid stars kept separate), `photos`, `videos` (thumbnail, duration, URL when available), `documents`, `pollQuestion`, `linkPreview`, `links`, `hashtags`, `mentions`, `forwardedFrom`, `replyToUrl`, `edited`.
- ✅ **Channel info on every row:** title, description, verified badge, photo and subscribers.
- ✅ **Search inside a channel** with Telegram's own search (`searchQuery`), plus whole-word `keywords`, `postedWithinDays` and `fromDate` filters.
- ✅ **Monitoring mode** (`onlyNew`): it remembers the last post per channel, so a scheduled run returns and charges **only new posts**.
- ✅ **REST API (Standby):** `GET /?channels=durov,telegram&maxMessagesPerChannel=20`.

### Use cases

- **Crypto and trading signal channels:** collect posts for backtesting or alerts.
- **News and brand monitoring:** track mentions of your brand, products or competitors.
- **Media analytics:** views and reactions over time.
- **Community and competitor research**, and **OSINT** on public sources.
- **Datasets for NLP and LLMs.**

### How to use it

The input is a simple form, no code needed:

1. Add channels to **📢 Public channels**, one per line: a username (`durov`), `@durov` or a link (`https://t.me/telegram`).
2. Set **Max posts per channel** (and optionally **Max posts in total**).
3. Optional, in **🔍 Filters**: **Posted in the last … days**, a **Posted on or after** date picker, **Search inside the channel** or **Keywords**.
4. Click **Start** and download the posts from the *Output* tab, or read them through the API.

#### Monitoring recipe

1. Add your channels, open **🔔 Monitoring** and turn on **Only new posts since the last run**.
2. Save it as a Task and add a **Schedule** (for example every 15 minutes).
3. Connect Slack, email, Google Sheets, Make, Zapier or a webhook on *Run succeeded*.

### Input example

```json
{ "channels": ["durov", "https://t.me/telegram"], "maxMessagesPerChannel": 100, "postedWithinDays": 30, "onlyNew": false }
```

### Output example (one item per post)

```json
{
  "channel": "bloomberg",
  "messageId": 3225,
  "url": "https://t.me/bloomberg/3225",
  "date": "2026-09-22T03:26:17+00:00",
  "edited": false,
  "text": "Alibaba unveils new AI chip it says is China's most powerful and targets 20 gigawatts of data center capacity by 2032. https://bloom.bg/4ydroys\n\n📷: Qilai Shen/Bloomberg",
  "views": 58000,
  "author": null,
  "forwardedFrom": null,
  "forwardedFromUrl": null,
  "replyToUrl": null,
  "photos": [
    "https://cdn5.telesco.pe/file/KMau6vkd-TV4MCX5XtbndE3aPozNaSclQXJvMZ9wXv2Y5VWJqoDfKnB1ngiyKoFGEocj7lC4dg7oLqkfGaGU7qwflBuIqz5s0rN0bJOdX0JYAXF-PypkwuQDURabK4uUQiQU5XeH8uRm5HdLm82PwQOdgb0JH4qsel4u0WFWmmgS8vIRiJUD-s6vXVBPhM1Hs7sJ442kLGuhYhnBI-ADmnn44_ftlnIXaNgm_54j9fhRhyzwskDOBL3NFaoobz-8Kr3VRopH3Tqj8HX7T7TNteLWwmEtAEWFF1PXsEiQLBYJ_lfyA9WX6uEkRzF1-MpnC02xaMiM5ZBRxNlWrTYosA.jpg"
  ],
  "videos": [],
  "documents": [],
  "pollQuestion": null,
  "linkPreview": null,
  "links": [
    "https://bloom.bg/4ydroys"
  ],
  "hashtags": [],
  "mentions": [],
  "reactions": [
    {
      "emoji": "❤",
      "customEmojiId": null,
      "count": 179,
      "paidStars": false
    },
    {
      "emoji": "👍",
      "customEmojiId": null,
      "count": 144,
      "paidStars": false
    },
    "…"
  ],
  "reactionsTotal": 668,
  "hasUnsupportedMedia": false,
  "channelTitle": "Bloomberg\n               ✔",
  "channelVerified": true,
  "channelPhotoUrl": "https://cdn5.telesco.pe/file/JqKdUIRvm0gSiQaiYa2IVu-woaBJAjSBLNvhf6ssHWmCSqYY4bpBzY6rhZZNvl5FlXI3_MktYIunAS7yCI0U-WOHI1WtAHQnpC34x-5d27rOUIEdxKP2lo3JrCwUSnfFlpQMAyYrxAweb78P1njj_6VfxkIEQFo_WUwkNsKmxGxaoAumKKtbKAxyvlS9pf3x3e0GzBdhFrHcMkuDauuAbt77ncPIFch2AtMXROiGRLfAno0sR2t6Zu2sA1GqNZ7yenpqCvMY6a9rR3tlCJ0X8TdfG1my7uPMUPdQAO3AyT_hH5mSIUiDpNQk31isUtWnlVAdMxFcEpVnkzYUVoe-EA.jpg",
  "channelSubscribers": 185000,
  "error": null
}
```

*(Real output from a test run on 27 Oct 2026. The reactions list is shortened and `channelDescription` is omitted. `channelTitle` is exactly as Telegram's page returns it, including the verified-badge character.)*

### Pricing

Pay per event, with platform usage included. You pay only for:

- **$0.002 per run start** (one start event per GB of memory; the default 512 MB run counts as one).
- **$0.0005 per post returned**, which is **$0.50 per 1,000 posts**.

Channels that are not found are listed with an error row for free. Example: 2,000 posts cost about $1.00.

### FAQ

**Do I need a Telegram account or API key?** No. It uses the public web preview only.

**Can I scrape private channels or groups?** No. See the limitations below.

**Is it legal?** It reads publicly available pages. Respect Telegram's terms and the content owners' rights, and don't use the data to spam or harass people.

### Limitations

- **Public channels only.** It doesn't work for private channels, private groups, or channels whose owner turned off the web preview (they return a clear error row).
- **Some media shows "view in Telegram only"** (for example very large videos). Then `videos[].viewInTelegramOnly` is `true` and you still get the thumbnail.
- **Group chats, comments and member lists** are not supported. These need a logged-in account, which this Actor deliberately doesn't use.

Issues and feature requests: use the *Issues* tab.

# Actor input Schema

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

One per line: <code>durov</code>, <code>@telegram</code> or <code>https://t.me/nytimes</code>.

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

Newest first.

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

0 = no limit.

## `postedWithinDays` (type: `integer`):

0 = any time.

## `fromDate` (type: `string`):

Only posts from this date on.

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

Uses Telegram's own channel search (like the search box in the app). Empty = all posts.

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

Whole words in the post text, e.g. <code>update</code>, <code>launch</code>.

## `onlyNew` (type: `boolean`):

Remember the newest post per channel and return only newer posts next time.

## `stateKey` (type: `string`):

Give each monitor its own name if you run several with the same channels.

## Actor input object example

```json
{
  "channels": [
    "durov",
    "telegram"
  ],
  "maxMessagesPerChannel": 20,
  "maxItems": 0,
  "postedWithinDays": 0,
  "keywords": [],
  "onlyNew": false
}
```

# Actor output Schema

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

All dataset items produced by 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",
        "telegram"
    ],
    "maxMessagesPerChannel": 20
};

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

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

```

## MCP server setup

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