Architecture note · 2026

How to read a public Telegram channel — without owning it, and without a phone number

The Bot API can't help you. MTProto wants an account. The web preview gives you the history for free. Here's how the three compare, and how to monitor channels for keywords at scale.

Open the Telegram Actor →

Telegram is where a lot of fast-moving information lives first — crypto calls, deal channels, OSINT feeds, niche communities. The problem newcomers hit immediately: they reach for the Bot API, wire it up, and discover it cannot read the channel they care about. That is not a bug. It is the whole design. Let's start there.

Three ways in, and why two of them fail you

There are exactly three ways to get a channel's messages programmatically, and they are not interchangeable:

PathReads any public channel's history?Needs an account / phone?Best for
Bot API (HTTP)No — only chats where the bot is an adminBot token, no phoneYour own channels and groups
MTProto (user client, e.g. Telethon)YesYes — a real account + phone number, risk of bansDeep, authenticated pulls
Public web preview (t.me/s/<channel>)Yes, for channels marked publicNoNo-account scraping & monitoring

The Bot API is the trap. A bot only ever sees updates from chats it has been added to as an administrator, so it is useless for reading a channel you do not control. MTProto can read everything, but you pay for it with a phone-bound account that Telegram can flag and ban for automated behaviour — fine for a one-off, painful as infrastructure.

The pragmatic answer for most jobs: the public web preview. Any channel with a public username exposes its full post history at https://t.me/s/<channel>, rendered as plain HTML with no login, no phone, no token. A scraper reads that. This is the path a maintained actor takes for you.

What a message looks like once you have it

Whichever path you use, a parsed message normalizes to roughly the same record. Knowing the shape up front saves you guessing:

Note what is not there for channels: there is no per-message author identity, because broadcast channel posts are attributed to the channel, not an individual. If you need named senders, you are looking at groups, not channels, and that is a different (and more privacy-sensitive) extraction.

Keyword and date-range monitoring

The most common real use is not a one-time dump — it is standing surveillance: "tell me whenever any of these 40 channels mentions a token, a competitor, or a city." The shape of that job:

1

List your channels and your terms

Provide the public channel usernames plus a keyword list. The actor walks each channel's public history and filters server-side, so you only pay for matches you care about.

2

Bound it with a date window

Pass an after date so a backfill run does not re-read years of posts. For live monitoring you instead pass the last messageId you saw per channel.

3

Schedule and de-duplicate

Run it on a cron (say every 15 minutes), keep a high-water-mark of messageId per channel, and discard anything you have already processed. Exactly-once, no double alerts.

The dedup detail that trips people up

Do not dedup on message text or timestamp — channels repost, edit, and forward, so those collide. Dedup on the (channel, messageId) pair. Store the max messageId you have processed per channel; next run, request only what is above it. That one rule turns a re-scraping mess into a clean incremental feed.

Driving it over HTTP

A monitoring run against a set of public channels, filtered by keywords and a start date, looks like this:

curl -X POST "https://api.apify.com/v2/acts/renzomacar~telegram-channel-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "channels": ["durov", "telegram", "somedealchannel"],
    "keywords": ["airdrop", "presale", "discount"],
    "postedAfter": "2026-06-01",
    "maxPostsPerChannel": 500,
    "includeMedia": false
  }'

You get back one JSON object per matching message. Drop the keyword filter and you get the full history; add &format=csv to the dataset URL and it arrives as a spreadsheet. For a live feed, swap postedAfter for a stored per-channel cursor and run it on a schedule.

Things to plan for

Monitor channels without babysitting an account

Our maintained Telegram Channel Scraper reads public channel history and filters by keyword and date — no phone number, no MTProto bans, no proxies. Clean JSON or CSV out, free Apify credits to start.

Get the Telegram Scraper → Or get done-for-you leads

Disclosure: the links to Apify on this page are affiliate links. If you create a paid account through them we may earn a commission, at no extra cost to you. We recommend Apify because we build and ship the Telegram Channel Scraper on it ourselves.