# Telegram Channel Scraper (No Login) (`seonlabs/telegram-channel-scraper`) Actor

Scrape public Telegram channels without an account: posts, views, dates, photos, videos, forwards, links. Keyword search, date filter, only-new mode.

- **URL**: https://apify.com/seonlabs/telegram-channel-scraper.md
- **Developed by:** [선도 황](https://apify.com/seonlabs) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $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 (no login)

Extract posts from **public Telegram channels** — text, views, dates, photos, videos, documents, forwards, replies and links — **without a Telegram account, API key or phone number**. Search keywords across many channels at once, filter by date, or run it on a schedule and get **only new posts**.

Works on any channel that has a public web preview (`https://t.me/s/<channel>`). Fast, HTTP-only (no browser), so results are cheap and reliable.

### What you can do with it

- **Monitor news & alerts** — follow crypto, security, deals or regional news channels and push new posts to Slack, Google Sheets, or your own app.
- **Brand / keyword tracking** — find every mention of your product, ticker or competitor across dozens of channels.
- **Market & OSINT research** — export a channel's full history with view counts to spot what content performs.
- **Content aggregation** — build feeds, newsletters or datasets from public channels.
- **AI pipelines** — feed clean message text into LLM summarisation, sentiment or classification.

### Sample output

One dataset item per message:

```json
{
  "channel": "telegram",
  "id": 461,
  "url": "https://t.me/telegram/461",
  "date": "2026-05-11T09:01:00+00:00",
  "text": "The text editor allows anyone to use their own prompts with AI. #update",
  "views": 1760000,
  "forwardedFrom": null,
  "forwardedFromUrl": null,
  "replyToUrl": "https://t.me/telegram/458",
  "replyToText": "Bots are now able to respond",
  "linkPreview": { "url": "https://telegram.org/blog/bots", "title": "Bot updates", "description": "All about bots", "siteName": "Telegram" },
  "photos": ["https://cdn4.telesco.pe/file/abc123.jpg"],
  "videos": ["https://cdn4.telesco.pe/file/video.mp4"],
  "videoThumbnails": ["https://cdn4.telesco.pe/file/thumb.jpg"],
  "documents": [{ "title": "report.pdf", "extra": "2.1 MB" }],
  "links": ["https://telegram.org/blog/bots"],
  "isServiceMessage": false,
  "channelTitle": "Telegram News",
  "channelSubscribers": 9450000,
  "scrapedAt": "2026-09-30T08:00:00+00:00"
}
```

Set **Include text as HTML** to also get `textHtml` with bold/italic/links preserved.

### Input

| Field | Description |
|---|---|
| `channels` | Channel usernames or links (`telegram`, `@durov`, `https://t.me/telegram`). Any number of channels. |
| `maxMessagesPerChannel` | How many messages to save per channel (newest first). Default 100. |
| `keywords` / `keywordMatch` | Keep only messages containing the keywords — whole-word, case-insensitive (`AI` won't match `details`); phrases, `#hashtags` and `$TICKERS` work. `any` or `all`. |
| `dateFrom` / `dateTo` | Date range (`YYYY-MM-DD`). Scraping stops as soon as older posts are reached. |
| `onlyNewMessages` | Remember the last seen message per channel and return only newer posts on the next run — perfect for schedules. |
| `includeMediaUrls` | Photo / video / document info (default on). |
| `includeTextHtml` | Add the HTML-formatted text (default off). |
| `includeServiceMessages` | Include system posts such as "Channel created" (default off). |
| `requestDelayMs` | Pause between page requests (default 800 ms). |
| `proxyConfiguration` | Optional. Only needed if you hit repeated 429/403 errors. |
| `saveDebugHtml` | Store raw HTML in the key-value store when a page can't be parsed. |

#### Example: keyword alert across channels, scheduled hourly

```json
{
  "channels": ["cryptonews", "bitcoin", "whale_alert_io"],
  "keywords": ["ETF", "SEC"],
  "keywordMatch": "any",
  "onlyNewMessages": true,
  "maxMessagesPerChannel": 200
}
```

Schedule the actor and connect a webhook or the Slack / Google Sheets integration — you will receive only the new matching posts each hour.

### Pricing

Pay per event, no subscription:

- a small fee per **run**
- a fee per **message saved** to the dataset (about $1 per 1,000 messages)

You are charged only for messages that actually match your filters and are saved. Platform usage is included in the price.

### Limits & notes

- Public channels with web preview only. Private channels, groups, and channels that disabled the preview return a `no_preview` status in the run summary (see `SUMMARY` in the key-value store).
- Comments/replies under posts and reactions are not available on the public preview page.
- Telegram may rate-limit very aggressive scraping; keep the default delay or enable a proxy.
- Please respect the channels' content rights and applicable law. This actor only reads pages that Telegram publicly serves to any web visitor.

### Need something else?

Open an issue in the **Issues** tab (I answer quickly) — e.g. more fields, other Telegram pages, or a custom integration.

# Actor input Schema

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

Public channel usernames or links, e.g. `telegram`, `@durov`, `https://t.me/telegram`. Private channels and channels with web preview disabled cannot be scraped.

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

Stop after this many messages have been saved for each channel. Newest messages come first.

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

Only keep messages containing these words or phrases (whole-word, case-insensitive — `AI` will not match `details`). Hashtags and tickers work too (`#update`, `$BTC`). Leave empty to keep everything. The actor keeps scanning older posts until it reaches *Max messages* matches or the date limits.

## `keywordMatch` (type: `string`):

`any` keeps a message if at least one keyword matches; `all` requires every keyword.

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

Only messages posted on/after this date. Format `YYYY-MM-DD` or ISO 8601. Scraping stops once older posts are reached, so this also saves you money.

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

Only messages posted on/before this date. Format `YYYY-MM-DD` or ISO 8601.

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

Remember the newest message ID per channel in this actor's key-value store and on the next run return only newer posts. Ideal for scheduled monitoring.

## `includeMediaUrls` (type: `boolean`):

Include photo, video, thumbnail and document info for each message.

## `includeTextHtml` (type: `boolean`):

Also output the message text with original HTML formatting (bold, links, etc.).

## `includeServiceMessages` (type: `boolean`):

Include system posts such as 'Channel created' or pinned notices.

## `requestDelayMs` (type: `integer`):

Pause between page requests to stay polite. Each page holds about 20 messages.

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

Usually not needed. Enable Apify Proxy only if you see repeated HTTP 429/403 errors.

## `saveDebugHtml` (type: `boolean`):

If a page cannot be parsed, store its raw HTML in the key-value store so the problem can be diagnosed.

## Actor input object example

```json
{
  "channels": [
    "telegram"
  ],
  "maxMessagesPerChannel": 50,
  "keywords": [],
  "keywordMatch": "any",
  "onlyNewMessages": false,
  "includeMediaUrls": true,
  "includeTextHtml": false,
  "includeServiceMessages": false,
  "requestDelayMs": 800,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "saveDebugHtml": false
}
```

# Actor output Schema

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

All scraped messages as JSON (default dataset).

## `messagesCsv` (type: `string`):

Same messages as a CSV file.

## `summary` (type: `string`):

Pages scanned, messages saved and status for each channel.

# 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"
    ],
    "maxMessagesPerChannel": 50,
    "keywords": []
};

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

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

```

## MCP server setup

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