Telegram Channel Content & Media Scraper
Pricing
from $0.18 / 1,000 post scraped (public pages)s
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
Maintained by CommunityActor stats
2
Bookmarked
4
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Security
Limited permissionsShare
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.
| Group | Fields |
|---|---|
| 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 previewt.me/s/<channel>. WithloadAdditionalDataon, 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:
@mentionsin 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
| Field | Type | Description | Required | Default |
|---|---|---|---|---|
channels | Array | Telegram channel usernames or t.me links to scrape (max 25 per run). | Yes | — |
loadAdditionalData | Boolean | Read via the Telegram API instead of public t.me pages: exact numbers, all fields. See Modes. | No | false |
maxPostsPerChannel | Integer | Maximum posts to fetch per channel across the whole run (1–1000). | No | 100 |
daysRange | Integer | Only fetch posts published within the last N days (1–90). | No | 30 |
includeText | Boolean | Include the post text in the results. | No | true |
mediaOnly | Boolean | Only return posts that contain media. | No | false |
downloadMedia | Boolean | Download and re-host media, returning permanent download links. Turns on loadAdditionalData. | No | false |
monitoringMode | Boolean | Return only posts newer than the previous run. See Monitoring. | No | false |
monitoringId | String | Name of the checkpoint set, so several tasks can watch the same channel independently. | No | default |
Channels can be provided as @channelname, channelname, or a Telegram URL like https://t.me/channelname.
Modes
| Public pages (default) | Telegram API (loadAdditionalData: true) | |
|---|---|---|
| Source | t.me/<channel> + t.me/s/<channel> | Telegram API |
| Speed and cost | Fast, light | Slower |
| Subscribers | Exact | Exact |
| Views, reactions | Rounded, e.g. 12300 from "12.3K" | Exact |
| Forward source ID and date, edit date | null | ✅ |
Media download (downloadMedia) | — (switches to API) | ✅ |
| Channels with the web preview turned off | Error row web_preview_unavailable | ✅ |
| Albums | One row per album | One 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
| Field | Description |
|---|---|
dataSource | web (public t.me pages) or api (Telegram API) |
channel, channelLink, channelTitle, channelDescription, subscribers | Channel metadata, repeated on every post row |
postId, postUrl, date, views, text | Core post data |
reactions, totalReactions | List of {emoji, count} and their sum |
hashtags, mentions, links | Extracted from post text and entities |
hasMedia, mediaUrls, mediaTypes | Media presence, permanent download links on media.akula.marketing, and file types |
isForward, forwardFromType, forwardFromId, forwardFromName, forwardChannelPost, forwardPostAuthor, forwardDate | Forward chain details, when the post is forwarded |
replyToMsgId, replyToPostUrl | Set when the post is a reply within the channel |
editDate | Set when the post was edited after publishing |
error, rateLimitSeconds | Set 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
- Input channels: Provide one or more channel usernames (e.g.
telegram,@telegram, orhttps://t.me/telegram). - Run the Actor: Execute to fetch posts.
- 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.
How long do media links work?
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.
- Save a task with your channel list and
monitoringMode: true. - Console → Schedules → Create new → add the task → set how often it runs (hourly, daily, weekly).
- 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
daysRangeand 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
maxPostsPerChannelabove 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
monitoringIdvalues. ChangemonitoringIdto 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 (loadAdditionalDataordownloadMediaon).
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.
🧩 Related Actors
| Next step | Actor |
|---|---|
| Find similar channels to add to your list | Telegram Similar Channels Finder |
| Export the comments under these channels' posts, with author profiles | Telegram Channel Message & Comment Scraper |
| Check subscriber counts and descriptions for a whole channel list | Telegram 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