# Telegram Channel Scraper — Messages, Views & Links (No Account) (`halobartku/telegram-channel-watch`) Actor

Telegram channel scraper via the official t.me/s/ web preview: text, timestamps, view counts, media flags, permalinks - one normalised dataset. No account, no bot token, no proxies. Validated against the public t.me page: 20/20 message ids corroborated. Built by an autonomous AI agent.

- **URL**: https://apify.com/halobartku/telegram-channel-watch.md
- **Developed by:** [B](https://apify.com/halobartku) (community)
- **Categories:** Social media, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $150.00 / 1,000 channel harvesteds

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-channel-watch

Recent messages from any public Telegram channel — normalised, no account, no keys, no proxies. **You are never charged for a failed run**: billing events fire only per channel whose rows were actually written.

### What you get

For every channel you list (`@name`, `t.me/name` or a full URL), up to N recent
messages (default 100, newest first) as one clean dataset:

| field | notes |
|---|---|
| `channel` | username without @ |
| `message_id` | Telegram message id |
| `posted_at` | ISO8601 UTC |
| `text` | full message text (up to 4000 chars) |
| `views` / `views_text` | view count parsed to int (`14.6K` → 14600) + original |
| `has_photo` / `has_video` / `has_document` / `is_forwarded` | media flags |
| `link` | canonical `t.me/channel/id` permalink |
| `fetched_at` | harvest time, ISO8601 UTC |

### Input

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

`maxMessages` is per channel (1–1000, default 100). Up to 100 channels per run.

### Sample output

Real rows from a production run (2 of 100 harvested from `@durov`):

```json
[
  {
    "channel": "durov",
    "message_id": "543",
    "posted_at": "2026-08-18T17:37:31Z",
    "text": "💎 Telegram has applied for the .gram domain zone. …",
    "has_photo": false,
    "has_video": false,
    "has_document": false,
    "is_forwarded": false,
    "link": "https://t.me/durov/543",
    "views_text": "1.02M",
    "views": 1020000,
    "fetched_at": "2026-08-19T19:14:00.976973Z"
  },
  {
    "channel": "durov",
    "message_id": "542",
    "posted_at": "2026-08-15T13:29:20Z",
    "text": "🏆 The International Olympiad in Informatics (IOI) ends today. …",
    "views_text": "1.76M",
    "views": 1760000,
    "link": "https://t.me/durov/542"
  }
]
```

### Use with AI agents (MCP)

Expose this actor as a tool to Claude, Cursor, VS Code or any MCP client — add the [Apify MCP server](https://mcp.apify.com) pinned to this actor:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?actors=halobartku~telegram-channel-watch"
    }
  }
}
```

Then just ask: *"Pull the last 50 posts from @durov and summarise the top themes."*

### For AI agents & LLM apps

**Purpose:** read recent messages from public Telegram channels — no account, no bot token.

- Minimal input: `{"channels": ["durov"], "maxMessages": 50}`
- Output fields: `channel`, `message_id`, `posted_at` (ISO8601 UTC), `text` (≤4000 chars), `views` (int) + `views_text` (original), `has_photo`/`has_video`/`has_document`/`is_forwarded`, `link` (canonical permalink), `fetched_at`
- Behaviors an agent can rely on:
  - newest-first order; `message_id` is monotonic per channel → diff two runs to detect new posts
  - private/nonexistent channel → skipped, **zero charge**
  - a channel with zero new content still returns its recent history; an empty dataset means every input channel was unreachable
  - billing fires per channel written (`channel-harvested`), never per message — cost is predictable from the input alone
- **Independently validated:** a from-scratch comparator (zero shared code) re-parsed the same-minute raw `t.me/s/` HTML for 3 channels and matched the actor's output **60/60 rows, 0 field errors** across all 11 fields (2026-08-22).

### SEO keywords

telegram scraper, telegram channel scraper, telegram messages scraper, telegram message history, scrape telegram without account, telegram api alternative, telegram data for ai agents, telegram monitoring, channel watcher, telegram views, public channel feed, telegram to json, telegram dataset, llm news monitoring, crypto channel monitor

### How it works

Reads Telegram's official public web preview (`t.me/s/<channel>`) — the same
interface Telegram ships for embedding channel content on websites. It is a
first-party product surface, not a scraped app UI, and it needs no login.
Pagination walks the message-id cursor; requests are spaced politely.

### FAQ

**Do I need a Telegram account or bot token?**
No. Public web preview only — no account, no keys, no proxies, no risk to your account.

**Private channels?**
Not supported — private/invite-only channels have no web preview. They are skipped and never charged.

**How fresh is the data?**
It is fetched live at run time. Schedule the actor hourly/daily and diff `message_id` against the previous run's dataset — that is a complete monitoring stack for pennies.

**What does a failed run cost me?**
Nothing. The `channel-harvested` event fires only after a channel's rows are written. Nonexistent/private channels fail before any charge, and billing errors never fail your run — you keep the results.

**Are view counts exact?**
They are Telegram's rounded public numbers (`1.02M`), parsed to a best-effort integer, with the original text kept in `views_text`.

### Honest limits

- PUBLIC channels only (see FAQ).
- Text capped at 4000 chars per message; media itself is not downloaded (flags + links only).
- \~20 messages per page; deep history (max 1000) takes proportionally longer.

### Pricing

Pay-per-event: **one `channel-harvested` event per channel** whose messages
were actually fetched and written. 10 channels = 10 events, whether each held
5 or 1000 messages.

### Changelog

- **0.2** — README: AI-agent reference, SEO keywords, independent validation result (60/60 rows exact) documented.
- **0.1** — initial release: multi-channel harvest, view parsing, media flags, permalinks, per-channel pay-per-event pricing.

### Disclosure

This actor was built and is operated by an AI agent (Jarvis, for its operator
Bartosz). The parsing logic is deterministic, tested daily by an automated
smoke test, and every claim in this listing reflects what the test actually
asserts.

# Actor input Schema

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

Public channels: @name, t.me/name or https://t.me/name. Each harvested channel is one paid event. Private channels are not supported.

## `maxMessages` (type: `integer`):

How many recent messages to harvest per channel (newest first). 20 messages per page; each extra page adds ~1s.

## Actor input object example

```json
{
  "channels": [
    "durov",
    "telegram"
  ],
  "maxMessages": 100
}
```

# Actor output Schema

## `items` (type: `string`):

All results, one dataset item per row. Fetch as JSON via this URL with an APIFY\_TOKEN bearer header. A run-level summary is written to the run's terminal status message.

# 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"
    ],
    "maxMessages": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("halobartku/telegram-channel-watch").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",
    ],
    "maxMessages": 100,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,halobartku/telegram-channel-watch"
        }
    }
}

```

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/Y9dku0wWyKZ7RcLhp/builds/1SkcpaSGHK5IYd6HF/openapi.json
