Telegram Channel Content & Media Scraper avatar

Telegram Channel Content & Media Scraper

Pricing

from $0.18 / 1,000 post scraped (public pages)s

Go to Apify Store
Telegram Channel Content & Media Scraper

Telegram Channel Content & Media Scraper

Scrape Telegram channel posts — text, reactions, hashtags, mentions, forwards, replies, and downloadable media — straight to your dataset, no webhook needed. Multi-session pool means no queue wait and no 10-channel cap: up to 25 channels, 1,000 posts each. Pay only for posts scraped.

Pricing

from $0.18 / 1,000 post scraped (public pages)s

Rating

5.0

(1)

Developer

akula.marketing

akula.marketing

Maintained by Community

Actor stats

2

Bookmarked

4

Total users

1

Monthly active users

7 days ago

Last modified

Security

Limited permissions

Share

Telegram Channel Post & Media Scraper

💬 Questions, bulk pricing, or a custom solution? Talk to us on Telegram — @KoteamSupport.

Collect posts from public Telegram channels: text, views, reactions, hashtags, mentions, links, forwards, replies, and optional media files. Results go directly to the Apify dataset. You don't need to configure a webhook or download an Excel file.

No queue, bigger runs. Runs are processed in parallel instead of waiting in a shared line, so you get up to 25 channels and 1,000 posts per channel in one job.

Two modes. By default the Actor reads public t.me pages: fast and cheap. Turn on loadAdditionalData to read channels via the Telegram API: exact numbers and every field. Monitoring mode returns only posts that are new since the previous run, so a scheduled task delivers each post once.

What it's for

  • Channel vetting before ad placement: check real views, reactions, and posting frequency before you buy a sponsored post.
  • Competitor and market research: see what channels in a niche publish and which posts get engagement.
  • Content analysis and trend tracking: hashtags, links, and topics over the last 1–90 days.
  • Archiving: keep a copy of a channel's public posts and media for research.
  • Monitoring: get every new post from a list of channels on a schedule, without duplicates.

Don't have a channel list yet? Start with Telegram Similar Channels Finder: it turns one seed channel into a list of similar channels you can pass here.

📊 Output fields (31)

Every post row has up to 31 fields. The full list is under Post fields and on the Output tab.

GroupFields
Channel (5)channel, channelLink, channelTitle, channelDescription, subscribers
Post (6)postId, postUrl, date, editDate, text, views
Engagement & entities (5)reactions, totalReactions, hashtags, mentions, links
Media (3)hasMedia, mediaUrls, mediaTypes
Forwards & replies (9)isForward, forwardFromType, forwardFromId, forwardFromName, forwardChannelPost, forwardPostAuthor, forwardDate, replyToMsgId, replyToPostUrl
Run info (3)dataSource, error, rateLimitSeconds

🛡️ Data & compliance

  • Public channels only. By default the Actor reads the channel's public web pages: t.me/<channel> and the web preview t.me/s/<channel>. With loadAdditionalData on, it reads the public post history through the official Telegram API method channels.getHistory. In both cases it's the same posts anyone sees when opening the channel. Private channels, private chats, and groups are not supported: they return an error row.
  • Posts, not people. It doesn't collect channel subscribers, member lists, or user profiles. Post data can still include names a channel published: @mentions in the text, a post author signature, or the original source of a forwarded post.
  • Channel statistics we keep. To build channel growth and reach history, we store aggregate numbers for the channels you scrape: subscriber count, and per-post views, reactions, and publish dates.
  • Nothing to set up. You don't need a Telegram account, login, admin rights, or API keys.
  • Your responsibility. Use the data in line with Telegram's terms and the privacy laws that apply to you (for example, GDPR).
  • No credentials from you. The Actor never asks for your Telegram login, phone, session, or API keys. Output contains no access hashes, file references, or session data.

To get more functionality use akula.marketing

💳 What you pay for

  • Billed: a small start fee per run, plus each post saved to the dataset. Prices are in Pricing.
  • Not billed:
    • Channels that fail. A private, missing or restricted channel returns an error row with no posts and no charge.
    • Duplicates. The same channel listed twice is scraped once.
    • Old posts in monitoring mode. Monitoring mode saves only posts that are new since the last run, so each post is billed once.
  • Spending limit: when the run reaches your maximum charge, it stops cleanly and keeps every post already saved.

🚫 What this Actor doesn't do

  • Doesn't read private channels, private chats or groups.
  • Doesn't collect subscribers, member lists or user profiles. For comments under posts use Telegram Channel Message & Comment Scraper.
  • Doesn't go past 1,000 posts per channel or 90 days back in one run.

📥 Input

The Actor accepts the following input fields:

📋 Input Schema

FieldTypeDescriptionRequiredDefault
channelsArrayTelegram channel usernames or t.me links to scrape (max 25 per run).Yes—
loadAdditionalDataBooleanRead via the Telegram API instead of public t.me pages: exact numbers, all fields. See Modes.Nofalse
maxPostsPerChannelIntegerMaximum posts to fetch per channel across the whole run (1–1000).No100
daysRangeIntegerOnly fetch posts published within the last N days (1–90).No30
includeTextBooleanInclude the post text in the results.Notrue
mediaOnlyBooleanOnly return posts that contain media.Nofalse
downloadMediaBooleanDownload and re-host media, returning permanent download links. Turns on loadAdditionalData.Nofalse
monitoringModeBooleanReturn only posts newer than the previous run. See Monitoring.Nofalse
monitoringIdStringName of the checkpoint set, so several tasks can watch the same channel independently.Nodefault

Channels can be provided as @channelname, channelname, or a Telegram URL like https://t.me/channelname.

Modes

Public pages (default)Telegram API (loadAdditionalData: true)
Sourcet.me/<channel> + t.me/s/<channel>Telegram API
Speed and costFast, lightSlower
SubscribersExactExact
Views, reactionsRounded, e.g. 12300 from "12.3K"Exact
Forward source ID and date, edit datenull✅
Media download (downloadMedia)— (switches to API)✅
Channels with the web preview turned offError row web_preview_unavailable✅
AlbumsOne row per albumOne row per photo/video

Each row has dataSource: web or api, so you always know which mode produced it.

📤 Output

Results are pushed directly to the Actor's default dataset — one row per scraped post. If a channel can't be scraped (private, not found, or rate-limited), a single row with an error field is added for that channel instead of failing the whole run.

Post fields

FieldDescription
dataSourceweb (public t.me pages) or api (Telegram API)
channel, channelLink, channelTitle, channelDescription, subscribersChannel metadata, repeated on every post row
postId, postUrl, date, views, textCore post data
reactions, totalReactionsList of {emoji, count} and their sum
hashtags, mentions, linksExtracted from post text and entities
hasMedia, mediaUrls, mediaTypesMedia presence, permanent download links on media.akula.marketing, and file types
isForward, forwardFromType, forwardFromId, forwardFromName, forwardChannelPost, forwardPostAuthor, forwardDateForward chain details, when the post is forwarded
replyToMsgId, replyToPostUrlSet when the post is a reply within the channel
editDateSet when the post was edited after publishing
error, rateLimitSecondsSet on channel-level failures instead of post data

Example Output

{
"dataSource": "api",
"channel": "@telegram",
"postId": 454,
"postUrl": "https://t.me/telegram/454",
"date": "2026-07-19T17:58:20+00:00",
"views": 1057413,
"text": "For all the details on these new features, check out our blog...",
"reactions": [{"emoji": "👍", "count": 120}],
"totalReactions": 120,
"hashtags": [],
"mentions": [],
"links": ["https://telegram.org/blog/..."],
"hasMedia": true,
"mediaUrls": ["https://.../channel-content/telegram/454_0.jpg?..."],
"mediaTypes": ["jpg"],
"isForward": false,
"error": null
}

Usage

  1. Input channels: Provide one or more channel usernames (e.g. telegram, @telegram, or https://t.me/telegram).
  2. Run the Actor: Execute to fetch posts.
  3. Read the dataset: Results appear directly in the run's dataset — no webhook or polling required.

FAQ

Can I scrape private channels or groups?

No. Only public channels are supported. A private channel, a group, or a channel that doesn't exist gets one row with an error field, and the rest of the run continues.

How many posts can I get?

Up to 1,000 posts per channel and 25 channels per run, from the last 1–90 days (daysRange). For more, split your list across several runs.

They don't expire. Media links look like https://media.akula.marketing/channel-content/… and keep working, so you can store them in your own database or sheet. Links from runs before October 2026 were temporary S3 links and may have expired; run again to get permanent ones.

Why do I get web_preview_unavailable or channel_not_found_or_restricted?

In the default mode the Actor reads public t.me pages. Some channels turn off the web preview, and some are restricted on the web in certain regions. Run those channels with loadAdditionalData: true. channel_not_found_or_restricted can also mean a typo in the username.

Do I need a Telegram account or API keys?

No. You don't need a Telegram account, login, admin rights, or API keys.

Am I charged for channels that fail?

You pay per post scraped. A channel that returns an error row adds no posts, so there's no charge for it.

How is this different from the Telegram API?

With the Telegram API you need your own account, API keys, session handling, and flood-limit handling, and you have to parse reactions, forwards, and media yourself. This Actor returns ready rows with all of that already extracted.

🔔 Monitoring new posts

Turn on monitoringMode and run the Actor on a schedule: each run returns only posts published since the previous run.

  1. Save a task with your channel list and monitoringMode: true.
  2. Console → Schedules → Create new → add the task → set how often it runs (hourly, daily, weekly).
  3. Connect a webhook, Zapier, or Make to the task to forward new posts to Slack, Sheets, or your CRM.

How it works:

  • The Actor remembers the newest post ID per channel in your Apify account (key-value store telegram-channel-content-monitoring).
  • The first run returns posts within daysRange and saves the checkpoint. Later runs return only newer posts.
  • If a channel is cut short by an error or your spending limit, its checkpoint isn't moved, so the next run picks those posts up again.
  • Keep maxPostsPerChannel above the number of posts a channel publishes between runs, or older new posts may be skipped. The run log warns when this happens.
  • Two tasks watching the same channel need different monitoringId values. Change monitoringId to start over from scratch.

For a one-time check before an ad placement, a single run without monitoring is enough.

Pricing

This Actor uses pay-per-event pricing — you're charged per post scraped, plus a small fee per run:

  • apify-actor-start: a small fee once per run, covering startup costs.
  • post-scraped-web: a post read from public t.me pages (default mode). The cheaper option.
  • post-scraped: a post with full, exact data (loadAdditionalData or downloadMedia on).

Media downloads, hashtag/mention/reaction extraction, and forward/reply metadata are included at no extra cost. Current prices are on the Pricing tab.

🔌 Automate with Zapier & Make

No code needed — trigger this Actor from your existing tools.

  • Zapier: search for the "Apify" app → action Run Actor → select akula.marketing/telegram-get-channel-content-media → since this Actor returns results directly in the dataset, use the Get Dataset Items action after the run completes to pull the scraped posts into your Zap. Docs
  • Make: add the Apify → Run an Actor module, then the Apify → Get Dataset Items module to fetch the results once the run finishes. Docs

🤖 Use with AI agents (MCP)

This Actor works as a tool in Claude, ChatGPT, Cursor, and other MCP clients through the Apify MCP server. Add this server URL to your client:

https://mcp.apify.com?tools=akula.marketing/telegram-get-channel-content-media

The first time you connect, the client asks you to sign in to Apify. Runs are billed to your Apify account, the same as runs from the Console.

Then ask in plain language, for example: "Get the last 30 days of posts from @telegram and tell me which ones got the most reactions". The agent reads the input schema, fills in the fields, and gets the results back as structured data.

Next stepActor
Find similar channels to add to your listTelegram Similar Channels Finder
Export the comments under these channels' posts, with author profilesTelegram Channel Message & Comment Scraper
Check subscriber counts and descriptions for a whole channel listTelegram Username Checker

Support

Support 24/7 - @KoteamSupport. We also offer specialized solutions for Telegram-related tasks — contact us to learn more

⭐ Found this useful? Leave a review — it helps others find this Actor and tells us what to build next.

🏷️ Find This Tool When You Search For "telegram channel scraper" - Export posts from any public channel "telegram channel content scraper" - Extract post text, media, and metadata "telegram channel analytics" - Views, reactions, and posting frequency per channel "telegram ad placement research" - Vet channels before buying sponsored posts "telegram media downloader" - Bulk download photos, videos, and documents from channel posts "telegram post reactions scraper" - Track engagement and view counts over time "telegram hashtag and mention extractor" - Mine posts for hashtags, mentions, and links "telegram forward tracking tool" - Trace forward chains and original post sources "telegram content archiving" - Preserve public channel posts and media for research "telegram channel monitoring" - Get new posts from a list of channels on a schedule 🎯 Turn a channel's post history into structured, exportable data with media included 📊 Check real engagement before you pay for a placement