# Telegram Channel Monitor: New Messages, Keywords, Webhooks (`antndev/telegram-channel-monitor`) Actor

Scrape and monitor public Telegram channels without any API key, bot token or phone number. Monitor mode returns only messages that are new since the previous run, with keyword and regex filters and webhook alerts.

- **URL**: https://apify.com/antndev/telegram-channel-monitor.md
- **Developed by:** [Anton König](https://apify.com/antndev) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Monitor: New Messages, Keywords, Webhooks

Read and **monitor public Telegram channels** with **no API key, no bot token and no phone number**. Run it once to pull history, or schedule it in monitor mode to get only the messages posted since your previous run, filtered by keyword or regex, and pushed to your webhook.

### Why this one

Most Telegram actors are one-shot scrapers: every run hands you the same messages again, and you deduplicate them yourself. This one is built for **scheduled monitoring**:

- **Monitor mode remembers where it stopped.** It stores the last message ID per channel and returns only what is genuinely new. A scheduled run on a quiet channel costs almost nothing because there is nothing to return.
- **Filters before you pay attention.** Keywords (any or all) plus an optional regex, matched against the message text, the link-preview title and description, and any links in the message.
- **Webhook delivery.** Matched messages are POSTed as JSON, so a signal channel can drive your own bot, Discord relay or dashboard.
- **No credentials, for you or your customers.** It reads the same public preview page any visitor sees, so there is nothing to register and nothing to leak.

### What you get per message

```json
{
  "channel": "whale_alert",
  "channel_title": "Whale Alert",
  "subscribers": 13600,
  "message_id": 11527,
  "url": "https://t.me/whale_alert/11527",
  "datetime": "2026-07-29T08:19:07+00:00",
  "text": "6,500,000 #USDT (6,529,776 USD) transferred from unknown wallet to #Binance",
  "views": 139000,
  "forwarded_from": null,
  "is_forward": false,
  "is_reply": false,
  "edited": false,
  "has_photo": false,
  "has_video": false,
  "photo_urls": [],
  "poll": null,
  "link_preview": { "url": "https://...", "site": "...", "title": "...", "description": "..." },
  "urls": ["https://..."],
  "is_new": true
}
```

Channel metadata (title, description, subscriber count, media counters, avatar) is stored in the key-value store under `channels`.

### Typical setups

**Signal or news alerting**
`channels: ["mychannel1","mychannel2"]`, `monitorMode: true`, `keywords: ["BTC","ETH"]`, plus your `webhookUrl`. Schedule every 5 or 10 minutes.

**Keyword watch across many channels**
`channels: [ ... 20 channels ... ]`, `monitorMode: true`, `regex: "(listing|airdrop|partnership)"`.

**One-off history pull for analysis**
`channels: ["durov"]`, `maxMessagesPerChannel: 1000`, `minDate: "2026-01-01"`, `monitorMode: false`.

### Input

| Field | Default | Meaning |
|---|---|---|
| `channels` | `["durov"]` | usernames, @usernames or t.me links |
| `maxMessagesPerChannel` | 50 | how far back to page per channel |
| `monitorMode` | false | return only messages new since the last run |
| `keywords` | none | case-insensitive terms to match |
| `requireAllKeywords` | false | on: all keywords must appear |
| `regex` | none | advanced pattern filter |
| `minDate` | none | stop paging past this date (`YYYY-MM-DD`) |
| `includeHtml` | false | also return original message HTML |
| `webhookUrl` | none | POST matched messages as JSON |
| `concurrency` | 3 | channels read in parallel |

### Honest limitations

- Only **public channels with the web preview enabled** are readable. Private channels, groups and channels that disabled the preview cannot be read by anyone without credentials, including this actor. Unreadable channels are reported in the log rather than failing the run.
- View counts and subscriber numbers are the rounded values Telegram itself displays (for example 3.49M), not exact integers.
- Photo URLs are the preview images from the public page; large media files and documents are reported as flags rather than downloaded.
- Deleted or edited messages reflect the current state of the page, not a history of edits.

### Keywords

telegram scraper, telegram channel scraper, telegram monitor, telegram messages api, telegram channel messages, telegram keyword alerts, telegram webhook, monitor telegram channel, telegram signals, telegram news monitoring, no api key telegram

# Actor input Schema

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

Public Telegram channels to read. Accepts a username, @username or a full t.me link, for example durov, @durov or https://t.me/durov.

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

How far back to read per channel. The actor pages backwards through the channel history until this limit, the date limit or the last-seen message is reached.

## `monitorMode` (type: `boolean`):

For scheduled runs: remembers the last message ID per channel and returns only messages posted since the previous run. This is the cheapest way to run it on a schedule.

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

Only return messages containing these terms. Matched case-insensitively against the message text, link preview title and description, and any links.

## `requireAllKeywords` (type: `boolean`):

On: a message must contain every keyword. Off: any keyword is enough.

## `regex` (type: `string`):

Advanced filter, for example (buy|sell)\s+signal or $\[A-Z]{2,6}. Applied case-insensitively in addition to the keywords.

## `minDate` (type: `string`):

Stop paging backwards once messages are older than this date.

## `includeHtml` (type: `boolean`):

Also return the original message HTML, which preserves bold, links and mention markup.

## `webhookUrl` (type: `string`):

POSTs the matched messages as JSON to this URL, so you can alert into your own system, bot or dashboard.

## `concurrency` (type: `integer`):

How many channels to read at the same time. Keep it low to stay polite to Telegram.

## Actor input object example

```json
{
  "channels": [
    "durov"
  ],
  "maxMessagesPerChannel": 50,
  "monitorMode": false,
  "requireAllKeywords": false,
  "includeHtml": false,
  "concurrency": 3
}
```

# 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("antndev/telegram-channel-monitor").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("antndev/telegram-channel-monitor").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 antndev/telegram-channel-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/TtR2PVjNWjVQt4rpN/builds/xpL7zBJsgfNFeIINO/openapi.json
