# Telegram Scraper - No Login, History, Media & Comments (`k1ra/telegram-scraper`) Actor

Scrape any public Telegram channel with NO login — zero account risk. Complete message history to post #1, full text with formatting, real media URLs, views, reactions, discussion comments, keyword search, date filters, channel stats. Pay per message, $0 on empty.

- **URL**: https://apify.com/k1ra/telegram-scraper.md
- **Developed by:** [Kevin Savani](https://apify.com/k1ra) (community)
- **Categories:** Social media, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Telegram Scraper — No Login, Complete History, Media & Comments

Scrape any **public Telegram channel** with **no login, no API key, and zero account risk**. Unlike account-based Telegram scrapers, this actor never asks for your Telegram credentials or session — so it can never log you out, trigger two-step verification, or get your account banned.

20+ fields per message: full text, real media URLs, views, reactions, forwards, link previews, discussion comments, and channel stats.

***

### Use Cases

#### Telegram Channel Scraper (No Login)

Use this as a **Telegram channel scraper** for any public channel — no account, no API key, no session cookie. Because your Telegram account is never involved, there's nothing to log out and nothing to ban. A true **no-login Telegram scraper**, unlike tools that ask for your `authToken`.

#### Telegram Message Scraper — Complete Channel History

Set `maxMessagesPerChannel: 0` and this **Telegram message scraper** walks a channel all the way back to its very first post — not just the recent page. Long posts arrive complete, with line breaks and formatting preserved. Ideal for archiving a **telegram channel's full message history** for research or compliance.

#### Telegram Media Scraper

Photos, videos, documents and voice notes come back as real, direct CDN file URLs — never a link back to the post. A reliable **Telegram media scraper** for building an image/video archive from a channel.

#### Telegram Comments Scraper

Turn on `includeComments` and this doubles as a **Telegram comments scraper** — author, text, and timestamp for every reply in a post's linked discussion group, capped per post with `maxCommentsPerPost`.

#### Telegram Keyword Search Across Channel History

Use `searchKeyword` to run a **Telegram keyword search** across a channel's entire history, not just the latest posts — useful for tracking a brand mention, a ticker symbol, or a topic over months or years.

#### OSINT, Crypto Signals & Content Research

Archive channel histories with full timestamps and engagement data for **OSINT research**, pull **crypto/trading signal channels** into a structured pipeline, or find a niche's top-performing posts by views and reactions for **content research**.

***

### Who Uses This

| Use Case | Who It's For |
|---|---|
| Channel history archiving & OSINT | Researchers, journalists, analysts |
| Brand & keyword monitoring across channels | Growth teams, PR/comms |
| Crypto & trading signal aggregation | Trading bots, signal-copy pipelines |
| Content research & top-post discovery | Content creators, media buyers |
| Discussion & sentiment analysis | Community managers, social listening |

***

### What You Get Per Message

```json
{
  "channel": "durov",
  "messageId": 530,
  "url": "https://t.me/durov/530",
  "datetime": "2026-06-16T17:36:14+00:00",
  "text": "⚠️ Indian telecom Reliance is sabotaging access to Telegram...",
  "textHtml": "<b>⚠️ Indian telecom Reliance…</b>",
  "views": 3720000,
  "author": "Pavel Durov",
  "isEdited": false,
  "reactions": [{ "emoji": "🫡", "count": 8790, "customEmojiId": null }],
  "media": [{ "type": "photo", "url": "https://cdn4.telesco.pe/file/..." }],
  "isForwarded": false,
  "forwardedFrom": null,
  "replyToId": null,
  "linkPreview": { "url": "...", "title": "...", "description": "..." },
  "channelInfo": {
    "title": "Pavel Durov",
    "username": "durov",
    "subscribers": 11700000,
    "isVerified": true,
    "description": "Founder of Telegram."
  },
  "comments": [{ "author": "...", "text": "...", "datetime": "..." }]
}
```

Fields are properly typed, ISO-8601 dates everywhere, and `null` for anything that couldn't be extracted — the run never crashes on one bad message.

***

### How to Use

**1.** In the **Input** tab, list the channels you want under `channels` — `@handle`, `handle`, or a full `t.me` link all work.

**2.** Set `maxMessagesPerChannel` (0 for complete history) and any filters you need.

**3.** Click **Start** — results appear in the **Dataset** tab as each channel completes. No proxy setup needed.

```json
{ "channels": ["@durov"], "maxMessagesPerChannel": 0 }
```

**Keyword search + comments example:**

```json
{
  "channels": ["t.me/tginfo"],
  "searchKeyword": "premium",
  "includeComments": true,
  "maxCommentsPerPost": 20
}
```

### Input

| Field | What it does |
|---|---|
| `channels` | Public channels in any form: `@handle`, `handle`, or a `t.me` link |
| `maxMessagesPerChannel` | Newest N messages; `0` = complete history to message #1 |
| `fromDate` / `toDate` | Date range filter (`YYYY-MM-DD`) |
| `searchKeyword` | Only messages containing this keyword, across the full history |
| `includeMedia` | Photo/video/document/voice file URLs (default on) |
| `includeComments` + `maxCommentsPerPost` | Discussion comments per post (opt-in) |
| `includeChannelMetadata` | Channel title, description, subscribers, verified badge (default on) |
| `maxCostUsd` | Hard cost cap — the run stops before exceeding it |

***

### Proxy

No proxy setup needed on your end — this actor supplies its own out of the box.

***

### Pricing

Pay per message delivered to your dataset. Failed or empty runs cost $0 — you are never billed for nothing.

| Messages scraped | Estimated cost |
|---|---|
| 100 | ~$0.30 |
| 1,000 | ~$3.00 |
| 10,000 | ~$30.00 |

***

### Schedule Recurring Checks

Combine Apify's built-in **Scheduler** with `fromDate` to re-run this actor daily or weekly against the same channels and only pull posts since the last run — a simple way to track new messages in a channel over time without re-fetching its whole history.

***

### Integrations & Automation

This actor plugs into the entire Apify integrations ecosystem and any tool that speaks HTTP:

- **Make** ([docs](https://docs.apify.com/platform/integrations/make)) — trigger scrapes from any Make scenario.
- **Zapier** ([docs](https://docs.apify.com/platform/integrations/zapier)) — pipe results into Zaps for alerting or CRM enrichment.
- **Google Sheets** — auto-export every run's dataset to a Sheet.
- **Slack** ([docs](https://docs.apify.com/platform/integrations/slack)) — get notified when a scheduled run completes.
- **Airbyte** ([docs](https://docs.apify.com/platform/integrations/airbyte)) — sync the dataset to a data warehouse.
- **Apify API** — full programmatic control via the official [`apify-client`](https://docs.apify.com/api/v2) for Node.js and Python, or raw REST.
- **Webhooks** ([docs](https://docs.apify.com/platform/integrations/webhooks)) — fire any HTTP endpoint when a run finishes.

***

### Good to Know

- Works only on **public channels** (and their public discussion comments). Private groups, private channels, and member lists require a logged-in account — this actor never touches accounts, by design.
- Video/file URLs are served by Telegram's CDN and may expire after some time; download promptly if you need permanence.
- Gaps in message IDs are normal — they are messages deleted by the channel, not scraper loss.

***

### FAQ

**Do I need to log in to Telegram or provide an API key?**
No. This actor never asks for a Telegram account, session, or `authToken` — it only reads what's publicly visible on a channel's public page. Nothing to log out, nothing to get banned.

**Can I get a channel's complete message history, not just recent posts?**
Yes. Set `maxMessagesPerChannel: 0` and the actor walks the channel all the way back to its first message.

**Does it scrape private channels or groups?**
No. Only public channels are supported — private groups and member lists require a logged-in account, which this actor deliberately avoids.

**What happens if I give it a channel that doesn't exist or is private?**
The run fails loudly with a clear status message telling you which handle couldn't be accessed — it never silently returns an empty dataset.

**Are the media URLs real, downloadable files?**
Yes — actual CDN file URLs for photos, videos, documents and voice notes, not links back to the Telegram post.

**Can I search a channel's history for a keyword?**
Yes, via `searchKeyword` — it searches across the channel's entire history, not just recent messages.

**Does it get comments/replies under a post?**
Yes, opt-in via `includeComments` — author, text, and timestamp for each reply in the post's linked discussion, capped by `maxCommentsPerPost`.

**Will I be charged for a channel that returns no messages?**
No. You're only billed for messages actually delivered to your dataset.

**Is it legal to scrape public Telegram channels?**
The actor only extracts **publicly available data** from public channels — it does not bypass any login wall or access private content. You're responsible for complying with Telegram's Terms of Service and applicable law for your use of the extracted data.

***

### ⭐ Bookmark this Actor & Leave a Review

If this **Telegram scraper** saves you time:

- **⭐ Click the star** at the top of the actor page to bookmark it — it makes the actor easier for you to find later and helps other Apify users discover it.
- **📝 Leave a review** — even one sentence on what you use it for helps prioritize the next feature.

***

### Related Apify Actors

- [Telegram Scrapers](https://apify.com/store?search=telegram%20scraper) — the full Apify Telegram-scraping catalog
- [Social Media Scrapers](https://apify.com/store?category=SOCIAL_MEDIA) — scrapers for other social platforms

***

### Support & Feedback

Found a bug or want a new feature?

- **Open an issue** on the actor's Issues tab in the Apify Console.
- **Feature requests** are welcome.

# Actor input Schema

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

Public channels to scrape: @handle, handle, or t.me link — any form works.

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

Newest messages to return per channel. 0 = the COMPLETE history back to the very first message.

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

Only messages on or after this date (YYYY-MM-DD). Leave empty for no lower bound.

## `toDate` (type: `string`):

Only messages on or before this date (YYYY-MM-DD). Leave empty for no upper bound.

## `searchKeyword` (type: `string`):

Only return messages containing this keyword (searched across the channel's full history).

## `includeMedia` (type: `boolean`):

Extract real photo/video/document/voice file URLs for each message.

## `includeComments` (type: `boolean`):

Fetch discussion comments for each message (adds one request per message — slower and costlier on big runs).

## `maxCommentsPerPost` (type: `integer`):

Cap on comments fetched per message when Include comments is on.

## `includeChannelMetadata` (type: `boolean`):

Attach channel info (title, description, subscribers, verified badge, counters) to every message.

## `maxCostUsd` (type: `integer`):

Hard cap on total run cost; the run stops before exceeding it. 0 = no cap.

## Actor input object example

```json
{
  "channels": [
    "@durov"
  ],
  "maxMessagesPerChannel": 100,
  "includeMedia": true,
  "includeComments": false,
  "maxCommentsPerPost": 20,
  "includeChannelMetadata": true,
  "maxCostUsd": 0
}
```

# 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"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("k1ra/telegram-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ]
}' |
apify call k1ra/telegram-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=k1ra/telegram-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Bify1vjsaE1VqeStt/builds/pXwRdi9c5WVP5V7v5/openapi.json
