# Telegram Channel Scraper — No Login, Fast & Cheap (`steadyscrape/telegram-channel-scraper`) Actor

Scrape messages from any public Telegram channel without login, phone number or bot token. Get text, date, views, reactions, media, polls, forwards, replies and link previews. Filter by date or keyword, or monitor channels for new posts only.

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

## Pricing

$1.00 / 1,000 messages

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

### What does Telegram Channel Scraper do?

**Telegram Channel Scraper** extracts messages from any **public Telegram channel** — no Telegram account, no phone number, no bot token and no API keys. Paste channel names or `t.me` links and get a clean dataset with each post's **text, date, views, reactions, photos, videos, documents, polls, forwards, replies, hashtags, links and link previews**.

It reads the channel's official public web preview (`t.me/s/<channel>`), the same page anyone can open in a browser. That makes it **fast, cheap and reliable**: no headless browser, no login that can get banned.

### Why use it?

- 📰 **News & OSINT monitoring** — follow war, politics and breaking-news channels and archive what was posted and when.
- 💹 **Crypto & trading research** — collect announcements and signals from exchange and project channels with exact timestamps.
- 📈 **Marketing & competitor analysis** — compare views and reactions across channels and posts.
- 🤖 **AI & data pipelines** — feed channel content into LLMs, RAG systems, sentiment analysis or dashboards.
- 🗄️ **Archiving** — back up the full history of a channel before posts get deleted.

### Features

- ✅ **No login required** — works with public channels only, nothing to configure.
- ✅ **Full history** — pages back through the whole channel, newest messages first.
- ✅ **Date range filter** — only messages between two dates, and paging stops as soon as older messages start.
- ✅ **Keyword & hashtag search** — uses Telegram's in-channel search.
- ✅ **Monitoring mode** — "Only new messages since the last run" remembers where you left off, so scheduled runs never charge twice for the same message.
- ✅ **Rich, structured output** — reactions (including premium custom emoji), media URLs, polls with percentages, forwarded-from, reply-to, author signatures, link previews.
- ✅ **Many channels per run** — a channel that is private or doesn't exist is reported and skipped; the rest keep going.
- ✅ **Respects your budget** — stops exactly when your maximum cost per run is reached.

### How to scrape a Telegram channel

1. Click **Try for free**.
2. Add one or more channels: `durov`, `@durov`, `t.me/durov` or `https://t.me/s/durov` all work.
3. Optionally set the maximum number of messages, a date range or a keyword.
4. Click **Start** and download your data as JSON, CSV, Excel or HTML, or get it through the Apify API.

To **monitor** channels, turn on **Only new messages since the last run** and add a [schedule](https://docs.apify.com/platform/schedules) (for example every hour).

### Input example

```json
{
    "channels": ["telegram", "https://t.me/durov"],
    "maxMessagesPerChannel": 500,
    "dateFrom": "2026-01-01",
    "dateTo": "2026-06-30",
    "searchQuery": "#update",
    "onlyNewMessages": false
}
```

### Output example

Each message is one item in the dataset:

```json
{
    "channel": "durov_russia",
    "channelTitle": "Павел Дуров",
    "channelSubscribers": 986000,
    "messageId": 63,
    "url": "https://t.me/durov_russia/63",
    "date": "2025-11-22T17:22:48.000Z",
    "isEdited": false,
    "text": "…",
    "textHtml": "…",
    "author": null,
    "views": 3250000,
    "forwardedFrom": { "name": "Khabib Nurmagomedov", "url": "https://t.me/khabib_nurmagomedov/127" },
    "replyTo": null,
    "hashtags": [],
    "mentions": [],
    "links": [],
    "media": [
        { "type": "video", "url": "https://cdn4.telesco.pe/file/….mp4", "thumbnailUrl": "https://cdn4.telesco.pe/file/…", "duration": "0:56" }
    ],
    "linkPreview": null,
    "reactions": [
        { "emoji": null, "customEmojiId": "5305565863728918192", "count": 32800 },
        { "emoji": "🫡", "customEmojiId": null, "count": 9740 }
    ],
    "scrapedAt": "2026-09-16T13:38:43.478Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `channel`, `channelTitle`, `channelSubscribers` | Channel username, display name and subscriber count |
| `messageId`, `url` | Message number and its public link |
| `date` | Publication time, ISO 8601 in UTC |
| `isEdited` | Whether the post was edited |
| `text`, `textHtml` | Message text (line breaks preserved) and the original formatted HTML |
| `author` | Author signature, for channels that sign posts |
| `views` | View count as shown by Telegram (e.g. "46.8K" becomes 46800) |
| `reactions` | Emoji and counts; premium custom emoji come with their `customEmojiId` |
| `media` | Photos, videos (file URL, thumbnail, duration), documents and polls |
| `forwardedFrom`, `replyTo` | Original source of forwarded posts and the message a post replies to |
| `hashtags`, `mentions`, `links`, `linkPreview` | Everything linked from the post |

### How much does it cost?

You pay only for the messages you get — see the pricing tab for the current price per message. Channels that are unavailable cost nothing, and the Actor stops as soon as it reaches the maximum cost you set for the run.

### Limitations

- Only **public channels** that have a web preview at `t.me/s/<channel>`. Private channels, groups, bots and user accounts are not accessible without logging in, and this Actor never logs in.
- **Comments** under posts are not included (they are not part of the public preview).
- View and reaction counts are as precise as Telegram shows them publicly ("46.8K").
- Some large videos only have a thumbnail on the public page, so `url` is `null` for them.

### Is it legal to scrape Telegram?

This Actor only reads information that channel owners publish openly on the web, without logging in. Still, scraped data can include personal data protected by GDPR and similar laws. Make sure you have a legitimate reason to collect it, and consult a lawyer if unsure. Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Feedback

Found a channel that doesn't work or need another field? Open an issue in the **Issues** tab — they are answered quickly.

# Actor input Schema

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

Public Telegram channels to scrape. Any format works: <code>durov</code>, <code>@durov</code>, <code>t.me/durov</code> or <code>https://t.me/s/durov</code>.

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

Newest messages first. The run stops for a channel when this many messages are saved or the channel has no older messages.

## `dateFrom` (type: `string`):

Only messages published on or after this date (UTC). Format YYYY-MM-DD or a full ISO timestamp. Leave empty for no lower bound.

## `dateTo` (type: `string`):

Only messages published on or before this date (UTC). A plain date includes the whole day.

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

Only messages matching this word or #hashtag, using Telegram's own in-channel search.

## `onlyNewMessages` (type: `boolean`):

For scheduled monitoring: each run returns only messages newer than the newest one saved by your previous run of this Actor, so you never pay twice for the same message.

## Actor input object example

```json
{
  "channels": [
    "telegram",
    "durov"
  ],
  "maxMessagesPerChannel": 20,
  "onlyNewMessages": false
}
```

# Actor output Schema

## `messages` (type: `string`):

No description

## `summary` (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": [
        "telegram",
        "durov"
    ],
    "maxMessagesPerChannel": 20
};

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

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

```

## MCP server setup

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