Telegram Channel Scraper: Posts, Views, Links, No Login avatar

Telegram Channel Scraper: Posts, Views, Links, No Login

Pricing

from $1.00 / 1,000 posts

Go to Apify Store
Telegram Channel Scraper: Posts, Views, Links, No Login

Telegram Channel Scraper: Posts, Views, Links, No Login

Scrape public Telegram channel posts with text, view counts, outbound links and timestamps. Walks full channel history over plain HTTP. No Bot API token, no phone number, no login. Pay per post delivered.

Pricing

from $1.00 / 1,000 posts

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

4

Monthly active users

a day ago

Last modified

Share

100 Telegram posts in 14 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Give it public Telegram channels and it returns their posts as clean rows: the post text, the view count both as Telegram shows it (1.57M) and as a number you can sort (1570000), outside links, a media flag, the publish time and a permalink to each post. It reads Telegram's own public web preview of each channel, so there is no bot token, no phone number and no Telegram account involved.

Why choose this actor?

  • History, not just the latest screen. On 1 October our scheduled check pulled 100 posts from the official @telegram channel in 14 seconds, reaching back 20 months, from August 2026 to January 2025. The actor follows Telegram's own cursor back through the archive 20 posts at a time, up to 2,000 posts per channel.
  • Views you can sort and filter. Every post comes with views_label exactly as Telegram prints it and views as an integer, so views > 1000000 works without a parser. In that run, views ranged from 813K to 5.13M per post.
  • $1 per 1,000 posts, nothing for channels that return nothing. One flat price on every Apify plan, charged only for posts written to your dataset. A private, deleted or misspelled channel costs nothing beyond the $0.005 run start fee, and the summary rows are free.

Run it on Apify

Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.

Try it in one minute

Paste this into the JSON tab of the input page and press Start:

{
"channels": ["telegram"],
"maxPostsPerChannel": 10
}

You get the 10 newest posts of the official Telegram News channel in a few seconds.

Give channels in channels in any of these forms: a bare username (durov), an @username (@telegram), or any t.me link (https://t.me/telegram, t.me/s/telegram, or a post link such as https://t.me/durov/540, which is read as the whole channel). List each channel only once: the list is not deduplicated, so durov and https://t.me/durov in the same run would scrape and charge the channel twice (with monitorMode on, no post is charged twice). maxPostsPerChannel caps how many posts each channel returns.

Apify's free plan includes $5 of credit every month, which covers about 4,900 posts at this actor's price ($0.001 a post plus the $0.005 start fee, in runs of 2,000 posts).

Copy to your AI assistant

themineworks/telegram-channel-scraper on Apify. Reads posts from public Telegram channels through Telegram's public web preview (no login, no bot token) and returns one row per post with text, views as label and integer, outside links, media flag, publish time and permalink. Call ApifyClient("TOKEN").actor("themineworks/telegram-channel-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: channels (string[]: "durov", "@durov" or "https://t.me/durov"; list each channel once, duplicates are scraped and charged twice; with monitorMode true no post is charged twice). Optional: maxPostsPerChannel (1 to 2000, default 100). Posts come newest first. Rows with _type "summary" or "info" are run reports and are never billed. Private channels, groups and DMs are not supported. Full spec: GET https://api.apify.com/v2/acts/themineworks~telegram-channel-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • 11 to 12 fields per post. channel, channel_title, subscribers, post_id, post_url, text, views_label, views, has_media, links (when the post has outside links), posted_at and scraped_at.
  • Up to 2,000 posts per channel, many channels per run. Each page of Telegram's preview holds 20 posts; the actor walks back page by page with a short pause until it reaches your cap or the start of the public history.
  • Outside links pulled out for you. Up to 10 distinct links per post, with Telegram's own links (t.me and telegram.org) left out, so links holds only where the post sends readers.
  • A media flag on every post. has_media is true when the post carries a photo, video, document, voice message or sticker. In the @telegram run, 79 of 100 posts did.
  • Plain HTTP, no login, no proxy needed. Telegram serves every public channel as a server rendered page at t.me/s/<channel>. The actor reads that page directly and retries a slow or rate limited request twice before moving on. There is no account that could be restricted.

How to use it

Basic: the latest posts of one channel

{
"channels": ["durov"],
"maxPostsPerChannel": 50
}

A watch list of channels in one run

{
"channels": ["telegram", "durov", "@tginfo", "https://t.me/s/bbcrussian"],
"maxPostsPerChannel": 40
}

Channels run one after another, and each gets its own cap of 40 posts. A channel that is private, renamed or does not exist simply returns no posts and costs nothing.

Daily brand or market monitoring

{
"channels": ["channel_one", "channel_two", "channel_three"],
"maxPostsPerChannel": 30
}

Save it as a task and schedule it daily (for example 0 8 * * *). Set maxPostsPerChannel a little above the number of posts the busiest channel publishes in a day, so each run covers the gap since the last one without paying for much overlap. Without monitorMode the actor has no memory between runs, so drop rows you already have by post_url when you load them; a post's views keep rising for days, so the overlap also gives you fresher view counts. With monitorMode on, each run delivers and charges only posts you have not received before (see "Run it on a schedule").

Archive a channel for research or an AI knowledge base

{
"channels": ["telegram"],
"maxPostsPerChannel": 2000
}

Up to 2,000 posts, newest first, each with its permalink and publish time. Feed text and post_url into a search index or an assistant that answers "what did this channel say about X?" and cites the post.

Find the posts that travelled furthest

Sort a run by views to rank posts by reach, or divide views by the subscriber figure in subscribers (text such as 9.43M subscribers, so parse the number first) to compare reach across channels of different sizes.

Input parameters

ParameterTypeDefaultWhat it does
channelsarray of stringsrequired (form prefill: durov, telegram)Public channels as a username, @username or t.me link. Each entry is scraped once per time it appears, so list each channel once. Private channels, groups and direct messages are not supported.
maxPostsPerChannelinteger (1 to 2,000)100 (form prefill: 40)Most posts to return for each channel. History is read 20 posts per page, so this is your main cost and runtime control.

"Form prefill" values fill the Console form for you but are not defaults: an API call that leaves maxPostsPerChannel out gets 100 posts per channel.

Run options. The default memory is 512 MB and the default timeout is 3,600 seconds, which is plenty: 100 posts took 11 to 20 seconds in our runs.

What data do you get?

One row per post, newest first within each channel. Empty values are left out of the row rather than sent as empty strings or null.

The channel: channel (the username as you gave it), channel_title (display name), subscribers (as Telegram shows it, for example 9.43M subscribers).

The post: post_id (the post's number inside the channel, as text), post_url (public permalink), text (the post text with formatting removed and line breaks kept; left out for posts with no text, such as a photo without a caption), has_media, links (outside links, only on posts that have any), posted_at (publish time with time zone), scraped_at.

Reach: views_label (exactly as shown, such as 891K or 1.57M) and views (the same figure as an integer, such as 891000). Telegram rounds large counts, so views is as precise as the label, no more.

Each run ends with a _type: "summary" row (channels_processed, posts_delivered, charged_for, charge_failures) and, when posts were delivered, a _type: "info" row. Neither is a post and neither is ever charged. Skip rows that have a _type field when you load the data.

Stable fields for automations

These 11 fields were present in all 100 post rows of our latest scheduled run. text is left out only for posts with no text at all.

FieldWhat it holds
channelChannel username as given in the input
channel_titleChannel display name
subscribersSubscriber count as Telegram shows it, text
post_idPost number inside the channel, text; unique only within one channel
post_urlPublic permalink; unique across channels, the key to deduplicate on
textPost text without formatting
views_labelViews as shown, such as 1.57M
viewsViews as an integer
has_mediatrue if the post has a photo, video, document, voice message or sticker
posted_atPublish time, ISO format with time zone
scraped_atISO timestamp when the row was captured

We will not rename these fields. New fields may be added over time; existing ones keep their names.

Output examples

Real rows from our scheduled run of the live build on 1 October 2026 (channels: ["telegram"], 100 posts).

A post with media and no outside link:

{
"channel": "telegram",
"channel_title": "Telegram News",
"subscribers": "9.43M subscribers",
"post_id": "459",
"post_url": "https://t.me/telegram/459",
"text": "Signed Gifts. You can now add your signature and a comment to gifts you buy via the gift marketplace.\n\nAugust Features\n1 • 2 • 3 • 4 • 5 • More",
"views_label": "1.39M",
"views": 1390000,
"has_media": true,
"posted_at": "2026-08-26T19:12:24+00:00",
"scraped_at": "2026-10-01T09:01:57.351Z"
}

An older post with an outside link in links:

{
"channel": "telegram",
"channel_title": "Telegram News",
"subscribers": "9.43M subscribers",
"post_id": "394",
"post_url": "https://t.me/telegram/394",
"text": "Funding Suggested Posts. When suggesting a post, you may offer Telegram Stars or Toncoin in exchange for posting the message.\n\nToncoin can quickly be added to your Telegram account via Fragment.\n\nJuly Features\n1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • More",
"views_label": "2.37M",
"views": 2370000,
"has_media": true,
"links": ["https://fragment.com/ads/topup"],
"posted_at": "2025-07-03T12:51:54+00:00",
"scraped_at": "2026-10-01T09:02:03.860Z"
}

The summary row of the same run (never charged):

{
"_type": "summary",
"channels_processed": 1,
"posts_delivered": 100,
"charged_for": 100,
"charge_failures": 0,
"scraped_at": "2026-10-01T09:02:08.158Z"
}

Pricing

Pay per event: you pay for each post delivered to your dataset, plus a small start fee per run. The price is the same on every Apify plan.

EventFreeBronzeSilverGold and above
post-scraped, per post$0.001$0.001$0.001$0.001
post-scraped, per 1,000 posts$1.00$1.00$1.00$1.00
apify-actor-start, per run$0.005 per GB of run memory, minimum one eventsamesamesame

The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, at $0.005 for each GB of memory the run uses, with a minimum of one event. This actor runs on 512 MB by default, so a default run pays one event: $0.005. The actor gains nothing from more memory.

Worked examples. 100 posts from one channel cost $0.10 plus $0.005. A daily watch of 10 channels at 30 posts each costs $0.30 plus $0.005 a day. A 2,000 post archive of one channel costs $2.00 plus $0.005.

Never charged: channels that are private, missing or empty, posts that appear twice on overlapping pages of the same channel (delivered once), failed requests, and the summary and info rows. Note that a channel listed twice in channels is scraped twice and its posts are charged twice, unless monitorMode is on. A run that delivers no posts pays only the start fee.

There is no scheduled price change for this actor. The Pricing tab on this page always shows the rate for your plan; if it and this table ever differ, the Pricing tab is right.

Run it on a schedule

Turn on monitorMode and each run delivers only the posts you have not received before, so a daily run costs you only for what is new.

  1. Enter your input, switch on Monitor mode and click Save as a task.
  2. In Apify Console open Schedules, click Add schedule and pick Daily (or any time and timezone you like).
  3. Under Actors or tasks to run, add the task you saved and save the schedule.
{
"channels": [
"channel_one",
"channel_two",
"channel_three"
],
"maxPostsPerChannel": 30,
"monitorMode": true
}

The first run delivers everything it finds. After that, each run delivers only posts that were not in an earlier run with the same input, and posts it skips are never charged. The summary row at the end shows new_this_run and skipped_duplicates. Changing the input starts a fresh history; changing only the result limit does not. Each channel is read from its newest post back, and the walk for a channel stops at the first page of 20 posts with nothing new, so a quiet day costs one page per channel and no post is charged. Each post is sent once, so its views are the count from the run that first delivered it.

FAQ

Where does the data come from? From t.me/s/<channel>, the public web preview Telegram publishes for every public channel. It is the page anyone can open in a browser without the app or an account, and it carries each post's text, views, time and media.

Do I need a Telegram account, a bot token or a phone number? No, none of them. The actor never signs in to Telegram, so there is no account that could be limited or banned. You need only an Apify account.

Can it read private channels, groups or direct messages? No. Those need a signed in session, and this actor deliberately reads public channels only. A private or invite only channel returns no posts and is not charged. Groups, public or private, are not supported.

How far back can it go? Up to 2,000 posts per channel per run, walking back 20 posts at a time. The walk also ends at the first post of the channel, or when a page comes back with fewer than 20 posts, which normally means the start of the public history; on a channel with many deleted posts it can end a little sooner. For very old posts of a long running channel, check that they are visible on its t.me/s/ page.

Why did a channel return fewer posts than I asked for? The channel has fewer public posts than your cap, its history is broken up by deleted posts, or the username is wrong or private (then it returns none). The run log has one line per channel with the number of posts it returned.

How fresh is the data? Live. Every run reads the channel pages at that moment, and scraped_at records when. View counts keep climbing for days after a post goes out, so a later run gives higher views for the same post.

Are view counts exact? They are exactly what Telegram publishes, and Telegram rounds large numbers (1.57M). views converts that label to an integer, so it carries the same rounding.

Which proxy does it use? None is needed. Telegram serves these preview pages openly, and the actor fetches them directly with short retries for slow or rate limited answers.

Can I monitor channels on a schedule? Yes. Save your input as a task, then in Apify Console go to Schedules, Create new, and pick a time or a cron expression. By default the actor does not remember earlier runs, so each run returns the newest posts up to your cap; deduplicate on post_url when you store them, and keep the cap close to a day's posts so you do not pay for much overlap. With monitorMode on, each run delivers and charges only posts that no earlier run with the same input delivered (see "Run it on a schedule").

How do I export the data? From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. Drop rows that have a _type field if you want posts only.

How do I find channels to scrape? Use Telegram Channel Finder: give it a keyword and it returns matching public channels with their usernames, ready to paste into channels here.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/telegram-channel-scraper.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http telegram-channel-scraper "https://mcp.apify.com/?tools=themineworks/telegram-channel-scraper".

Is it legal to scrape Telegram channels? The actor reads only posts that channel owners have published openly on the web, the same pages anyone can open without signing in, and it does not get past any login. Posts can still mention or quote people, so you are responsible for how you use the data, including Telegram's terms and data protection laws such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: export a run to a sheet, or use Apify's Google Sheets integration to append each scheduled run's posts.
  • Make, Zapier and n8n: use the Apify app or node to start a run on a schedule and send posts above a view threshold, or posts that mention a keyword, to Slack, email or a CRM.
  • Webhooks: have Apify call your URL when a run succeeds, then read the dataset.
  • API and client libraries: start runs and read datasets from Python, JavaScript or any HTTP client. The "Copy to your AI assistant" block above has the exact call.
  • MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code can call the actor as a tool through https://mcp.apify.com.

More from The Mine Works

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a channel that returns the wrong posts, or need a field we do not return yet? Open an issue on the Issues tab of this page with the channel and the run ID, and we will reply there. To ask for a new data source, email dmineworks@gmail.com. A guide for this actor also lives at themineworks.com.

Telegram Channel Scraper turns public Telegram channels into clean post rows with sortable view counts and links, at $1 per 1,000 posts and no login.