Telegram Channel Scraper: Posts, Views, Media & Reactions avatar

Telegram Channel Scraper: Posts, Views, Media & Reactions

Pricing

$1.00 / 1,000 posts

Go to Apify Store
Telegram Channel Scraper: Posts, Views, Media & Reactions

Telegram Channel Scraper: Posts, Views, Media & Reactions

Telegram channel scraper: posts from any public Telegram channel with text, date, views, photos, videos, polls, forwards, link previews and reactions, plus keyword and date filters and new-post monitoring. $1 per 1,000 posts, no start fee, no login. No members or user profiles.

Pricing

$1.00 / 1,000 posts

Rating

0.0

(0)

Developer

Local Wire

Local Wire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Features

Limited permissions

Share

Telegram Channel Scraper: posts, views, media and reactions from public channels

Telegram channel scraper: the posts of any public Telegram channel, read from the public preview pages Telegram publishes (t.me/s/<channel>), with text, date, view count, photos, videos, polls, forwards, link previews and reactions. $1 per 1,000 posts ($0.001 each), no start fee, no login, no Telegram account or API keys.

Give channel usernames or t.me links, optionally keywords and a date window. In monitor mode each run returns only the posts that are new since the last one. Because the Actor reads what a channel broadcasts, it never collects members, subscribers, commenters or user profiles.

What you get

One record per post, newest first. The dataset has Posts and Links and forwards views.

{
"id": "telegram:telegram:460",
"type": "post",
"channel": "telegram",
"channelTitle": "Telegram News",
"channelUrl": "https://t.me/telegram",
"channelSubscribers": 9170000,
"channelVerified": true,
"postId": 460,
"url": "https://t.me/telegram/460",
"text": "For all the info from today's update and a look back at 13 years of Telegram features — check out our blog: https://telegram.org/blog/welcome-messages-buttons-TG-13",
"textHtml": null,
"postedAt": "2026-08-26T19:12:34.000Z",
"edited": false,
"views": 2380000,
"authorSignature": null,
"forwardedFromTitle": null,
"forwardedFromUrl": null,
"replyToUrl": null,
"hasMedia": false,
"mediaTypes": [],
"media": [],
"linkPreview": {
"url": "https://telegram.org/blog/welcome-messages-buttons-TG-13",
"siteName": "Telegram",
"title": "Welcome Messages, Buttons and More",
"description": "…"
},
"links": ["https://telegram.org/blog/welcome-messages-buttons-TG-13"],
"poll": null,
"reactions": { "👍": 703, "❤": 120 },
"reactionsTotal": 823,
"scrapedAt": "2026-11-07T21:30:00.000Z"
}
FieldMeaning
idStable (telegram:<channel>:<postId>), so you can de-duplicate or upsert.
channel, channelTitle, channelUrl, channelSubscribers, channelVerifiedChannel facts on every post, so you do not need a second call.
postId, urlThe post's number in the channel and its t.me link.
text, textHtmlThe post text, plain, and as HTML when includeHtml is on. E-mail addresses and phone numbers are removed.
postedAt, editedPosting time in UTC, and whether the post was edited afterwards.
viewsView count as Telegram shows it, so rounded above 1,000 ("2.38M" becomes 2380000).
forwardedFromTitle, forwardedFromUrlFilled only when a post was forwarded from another channel. Forwards from people are not attributed.
replyToUrlThe post this one replies to, when it is a reply.
media[], mediaTypes, hasMediaEach photo, video, round video, document, audio or voice note, sticker, poll or location: type, url (the file, where the page exposes it), thumbUrl, title, duration.
linkPreview, linksThe link preview card (url, siteName, title, description) and every link in the post.
pollThe question, the options with their percentages, and the vote count text.
reactions, reactionsTotalCounts per emoji. Custom emoji appear as custom:<id> and paid Star reactions as stars.
authorSignatureThe admin signature some channels add to posts. null unless includeAuthorSignature is on.

The run's key-value store also gets an OUTPUT record with, per channel, the title, subscriber count, pages read and posts read and returned, plus the channels that had no public preview.

Quick start

The form opens with two large public channels and 20 posts each. Press Start for about 40 posts at $0.04:

{
"channels": ["telegram", "https://t.me/durov"],
"maxPostsPerChannel": 20
}

A channel can be a username (durov, @telegram) or any t.me link to the channel or one of its posts.

The last week of three channels, posts mentioning a product:

{
"channels": ["telegram", "durov", "https://t.me/nexta_live"],
"keywords": ["Stars", "Premium"],
"postedWithinDays": 7,
"maxPostsPerChannel": 200
}

An hourly feed of new posts (save as a Task and add a Schedule):

{
"channels": ["nexta_live", "telegram"],
"maxPostsPerChannel": 40,
"onlyNew": true,
"monitorKey": "news-feed"
}

Input reference

Only channels is required.

FieldTypeDefaultWhat it does
channels (required)string[]Usernames or t.me links of public channels, up to 200 per run.
maxPostsPerChannelinteger100How many of each channel's newest posts to read (1 to 10,000). Keyword and date filters apply within these.
keywordsstring[]Keep only posts whose text or link preview contains ANY of these words or phrases (case-insensitive).
postedWithinDaysintegerStop at posts older than this many days.
postedSincestringStop at posts older than this date (2026-11-01). Overrides postedWithinDays.
includeHtmlbooleanfalseAlso return each post's text as HTML (textHtml), keeping bold, links and line breaks.
includeAuthorSignaturebooleanfalseReturn the admin's signature where a channel signs its posts.
maxResultsinteger1000Stop the run after this many posts in total (1 to 100,000).
onlyNewbooleanfalseMonitor mode: return, and charge for, only posts not returned by earlier runs.
monitorKeystringA name for the monitor's memory. By default each set of channels and keywords has its own.

Use cases

  • News and OSINT monitoring. Follow channels on a topic and send new posts to Slack, e-mail, Sheets or a webhook on a schedule.
  • Brand and keyword tracking. Filter a watchlist of channels by product names, tickers or places.
  • Crypto, trading and deal channels. Capture announcements with their timestamps and view counts.
  • Research and archiving. Pull a channel's history, with links, forwards and reactions, into a dataset.
  • Content analytics. Compare views and reactions per post across channels, with subscriber counts for context.
  • Media and fact-checking desks. Track how a story moves between channels through forwardedFromUrl.
  • AI agents. "What did these channels post about the listing this week?" answered from the posts themselves.

Monitor mode

With onlyNew on, the Actor remembers the posts it has returned for this set of channels and keywords (or under your monitorKey) in a key-value store named telegram-channels-monitor in your account. It stops reading a channel as soon as it reaches posts it has already returned, and returns only the new ones. Use one monitor per channel set; changing the keywords starts a new memory unless you give the same monitorKey.

Save the input as a Task, add a Schedule, and connect an integration (Slack, e-mail, Google Sheets, webhook). Each run then delivers only the new posts.

Pricing

Pay per result: $0.001 per post returned ($1 per 1,000). No start fee, no monthly fee. Posts filtered out by keywords or dates, posts already returned in monitor mode, and channels that cannot be read cost nothing.

RunPosts returnedCost
The quick-start run: 2 channels × 20 postsabout 40about $0.04
The newest 100 posts of 10 channels1,000$1.00
A full 10,000-post history of one channel10,000$10.00
An hourly monitor on 20 channels that finds 150 new posts a day150 a day$0.15 a day, about $4.50 a month

To cap spending, set maxResults or a maximum cost per run in the run options (maxTotalChargeUsd in the API). The Actor stops cleanly at the limit.

Use it from the API

curl -X POST "https://api.apify.com/v2/acts/localwire~telegram-channels/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "content-type: application/json" \
-d '{"channels": ["durov"], "maxPostsPerChannel": 20}'

With the official clients:

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("localwire/telegram-channels").call({ channels: ["telegram"], postedWithinDays: 30 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("localwire/telegram-channels").call(run_input={"channels": ["telegram", "durov"], "keywords": ["update"], "maxPostsPerChannel": 200})
items = client.dataset(run["defaultDatasetId"]).list_items().items

Use it from an AI agent (MCP)

Apify hosts an MCP server at https://mcp.apify.com. Add it to an MCP client (Claude, ChatGPT, Cursor, VS Code and others) and sign in with your Apify account, or send your API token as an Authorization: Bearer header. To expose just this Actor as a tool:

https://mcp.apify.com?tools=localwire/telegram-channels

Then ask "what did these channels post about the listing this week?". Notes for agents: channels is required. maxPostsPerChannel defaults to 100 per channel, so pass a smaller number (10 to 20) for a quick look, and postedWithinDays to bound the time window.

Integrations

Apify connects runs to Make, n8n, Zapier, LangChain, webhooks and other tools, and datasets export as JSON, CSV, Excel, XML or RSS. Typical setups: new posts from a watchlist to a Slack channel; keyword matches to e-mail; a channel archive appended to Google Sheets or loaded into a database.

FAQ

Is there a free Telegram channel API?

Telegram has two official APIs, both free. The Bot API only sees channels where your bot is an administrator. The full Telegram API (MTProto) can read public channels but needs a Telegram account, a phone number and an application id. For public channels there is also the preview page at t.me/s/<channel>, which anyone can open without an account; this Actor reads that page and returns structured records.

How do I scrape a Telegram channel without an account or a phone number?

Put the channel's username or t.me link in channels and run. No Telegram login, API key or phone number is involved at any point.

Can I scrape private channels or groups?

No. Only public channels with a public preview can be read. Private channels, invite links (t.me/+…), t.me/c/… links, groups and bots have no preview; they are reported in OUTPUT and cost nothing.

Does it return channel members, subscribers or commenters?

No. The preview page shows only what the channel broadcast, and this Actor does not look for anything else. You get the subscriber count, never a list of people.

How do I export Telegram channel posts to CSV, Excel or JSON?

Open the run's dataset and choose a format, or request https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&view=overview.

How do I monitor a Telegram channel for keywords?

Set channels and keywords, turn on onlyNew, schedule the task and add an integration. Each matching post is delivered once.

Can I download the photos and videos?

Each media item has the link Telegram's page exposes: the file for photos, small videos and stickers, and a thumbnail for large videos. The Actor returns the links; it does not download the files. Links point at Telegram's CDN and can expire, so fetch what you need soon after the run.

How far back can I go?

Up to 10,000 posts per channel in one run, read 20 at a time. At one request every 1.5 seconds that takes about 15 minutes.

Are view counts exact?

Above 1,000 they are rounded, as Telegram displays them ("2.38M"). The same applies to subscriber counts.

How do I check whether a channel can be read?

Open https://t.me/s/<channel> in a browser. If you see the channel's posts, the Actor can read them.

Limitations

  • Public channels only. A channel needs a public username and previews turned on (most news, project and brand channels have both).
  • No comments, members or profiles, and no search across Telegram: you name the channels.
  • Order and paging. Posts come newest first, 20 per page, at most 10,000 per channel per run and 200 channels per run.
  • Counts are rounded above 1,000.
  • Media links can expire, and large videos have a thumbnail but no file link.
  • Keyword filters match the post text and link preview within the posts read; they are not a Telegram-wide search.
  • Rate limits. One ordinary request every 1.5 seconds, no proxies. If Telegram answers with a rate limit or a block, the Actor waits once, then stops and keeps what it has. Run less often rather than more aggressively.

Data and privacy

Channel posts are broadcasts a publisher makes to the public; this Actor reads the same preview pages anyone can open without an account. It never logs in, never collects subscriber, member or commenter data, does not attribute forwards from people, removes e-mail addresses and phone numbers from text, and leaves out author signatures unless you turn them on. You are responsible for how you use the data, including Telegram's terms and the rights of the channels' authors.

This Actor is not affiliated with or endorsed by Telegram.

Feedback

Found a channel that does not work, or need a field that is missing? Open an issue on the Actor's Issues tab.

More from this developer