Guides · 24 October 2026
Monitoring Telegram channels for keywords: a practical guide
Many crypto projects, news outlets and communities post on Telegram first. If you want to know when your brand, a token or a topic comes up, you need a monitor that reads the channels for you and speaks up only when something matches. Here is how to build one that does not miss posts and does not cry wolf.
Where the posts come from
Telegram offers three ways in. The official client API (MTProto) sees everything your account sees, but it needs a phone number, an app ID and a logged-in session, and accounts that read hundreds of channels around the clock tend to get limited. The Bot API is simpler, but a bot only receives posts from channels where it is an administrator, so it is useless for channels you do not run.
The third way is the public web preview. Every public channel has one at t.me/s/<channel>, switched on by default, showing the same posts anyone can read without logging in: text, media, views and reactions. It needs no account at all, which makes it the natural source for monitoring public channels. Groups, private channels and invite links (t.me/+…) are not on the web, so they are out of reach this way.
Keywords that actually match
Plain substring search gets you most of the way, and it has a nice side effect: “bitcoin” also finds “Bitcoins” and “#bitcoin”. Ignore case, and search more than the text: links, the title and description of link previews, file names and poll options often carry the word when the post itself does not.
Short keywords are the exception. “AI” as a substring matches “said”, “paid” and “Dubai”, and your alerts fill with noise. Match those as whole words only. Exclude words help with the rest: a monitor for a token name gets much quieter once “giveaway” and “airdrop” are excluded.
Never miss a post, never report one twice
The tempting approach is “give me everything from the last hour” on an hourly schedule. It breaks as soon as a run starts late or fails: posts fall into the gap, or arrive twice when runs overlap. Post IDs solve this. Inside a channel they only go up, so remember the last ID you delivered for each channel and start the next run right after it. A failed run then simply means the next run delivers a bit more.
The first run is special. It should mark the starting point and stay quiet, or your first alert brings a channel’s entire history. And keep one memory per monitor, so changing the keywords later does not reset what has already been seen.
Alerts people read
One message per run, listing the new matching posts with a short excerpt and a link, works better than one message per post. Slack and Discord accept incoming webhooks, so no bot setup is needed, and a generic webhook hands the posts to Make, Zapier or n8n for anything else. If an alert cannot be delivered, keep it and send it with the next run rather than dropping it.
Two details matter when you store posts. View counts above 1,000 are rounded on Telegram, so treat them as approximate. And photo and video links point to Telegram’s CDN and change over time: download what you want to keep soon after the run, and store the post URL, which always leads back to the original.
The short way: a scheduled task
The Telegram Channel Scraper & Keyword Alerts does all of the above on Apify: it reads the public web preview, matches keywords with whole-word quotes and exclude words, remembers the last post per channel and sends alerts to Slack, Discord, a webhook or e-mail. Save this input as a task and give it an hourly schedule:
{
"channels": ["cointelegraph", "https://t.me/durov"],
"keywords": ["bitcoin", "\"ETF\""],
"excludeKeywords": ["giveaway"],
"onlyNewPosts": true,
"slackWebhookUrl": "https://hooks.slack.com/services/…"
}
Each post comes back with its text, date, views, reactions, media and the keywords it matched. To pull the last 30 days of a channel into your own code instead, use the Apify Python client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("layerwiselabs/telegram-channel-scraper").call(run_input={
"channels": ["durov"],
"dateFrom": "30 days",
"maxPostsPerChannel": 500,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["date"], post["views"], post["url"])
AI agents can call it directly as a tool through the Apify MCP server: https://mcp.apify.com?tools=layerwiselabs/telegram-channel-scraper
What it costs
$0.50 per 1,000 posts returned, with no start fee. Posts that your date range or keywords filter out cost nothing, so an hourly monitor of 20 channels with about 50 matches a day comes to roughly $0.75 a month. Slack, Discord and webhook alerts are free, and a free Apify account includes $5 of credit every month.