Telegram Channel Scraper: Posts + Media + Metadata avatar

Telegram Channel Scraper: Posts + Media + Metadata

Pricing

from $10.00 / 1,000 posts

Go to Apify Store
Telegram Channel Scraper: Posts + Media + Metadata

Telegram Channel Scraper: Posts + Media + Metadata

See how any public Telegram channel really performs. Get every post with views, ER, reactions, forwards, comments and its photos and videos (links or downloads), plus a free report per channel: average reach, engagement rate, posts per day, top post. Up to 25 channels, no API key or phone needed.

Pricing

from $10.00 / 1,000 posts

Rating

5.0

(1)

Developer

Olga

Olga

Maintained by Community

Actor stats

6

Bookmarked

222

Total users

9

Monthly active users

4 days ago

Last modified

Share

πŸ“¦ Telegram Channel Scraper: Posts + Media + Metadata

πŸ“Š Find out how well any Telegram channel really performs β€” and what its audience reacts to.

Paste up to 25 public channels β€” yours or your competitors' β€” and in a few minutes you get:

  • Every post with its numbers: views, ER, reactions, forwards, comments, text and links
  • Photos, videos and files from every post β€” as links, or downloaded to storage with direct URLs (merge albums into one record if you like)
  • A ready-made report for each channel: average reach, average ER, engagement rate, posts per day and the top post
  • A table you can export to Excel, CSV or JSON, or send to Google Sheets, Make or Zapier

No Telegram account, API key or phone number needed β€” just enter channel names and click Start.

Who it's for: marketers and SMM specialists checking competitors, advertisers choosing channels before buying ads, analysts and researchers tracking topics and trends.

πŸ†• Updated on October 16, 2026: engagement analytics β€” er, forwards, comments and pinned on every post, and a free per-channel summary (CHANNEL_STATS). Nothing changed in existing fields.

πŸ’° No monthly fee. $0.01 per run, $10 per 1,000 posts, $5 per 1,000 downloaded media files. Channel stats, errors, queue time and service records are free. Details below in Pricing.


πŸ†• What's new (2026-10-16)

  • βœ… Engagement on every post: forwards (how many times the post was shared), comments (number of comments), er (views Γ· subscribers, %), pinned
  • βœ… Channel stats (CHANNEL_STATS) β€” one summary per channel: average views, average ER, engagement rate, posts per day, average reactions, forwards and comments, top post and last post date. Free, no extra charge
  • βœ… Output tab: new ER, Forwards and Comments columns, and a Channel stats link
  • βœ… Existing fields, record count and input are unchanged β€” your automations keep working

πŸ’° Pricing β€” pay only for what you use

WhatPrice
Run start (charged only after a successful connection to Telegram)$0.01
Post$10.00 / 1,000 posts
Downloaded media file (only when downloadMedia is on)$5.00 / 1,000 files
Channel stats (CHANNEL_STATS)Free
Platform usageIncluded

There is no monthly fee. Since October 12, 2026, the former $9/month rental has been replaced by this pay-per-event pricing.

You are never charged for:

  • time in the queue, queue timeouts, or failed connections to Telegram;
  • service records β€” "no posts found", channel errors, rate-limit notices, skipped channels;
  • media left as a link (files over maxMediaSizeMB, or when downloadMedia is off);
  • the channel stats summary.

Control your spending: set Max cost per run in the run options β€” the Actor stops cleanly when the limit is reached.

Examples

  • 10 channels Γ— 20 posts, text only β†’ $0.01 + 200 Γ— $0.01 = $2.01
  • 5 channels Γ— 50 posts, 120 media files downloaded β†’ $0.01 + $2.50 + $0.60 = $3.11

βœ… What This Actor Does

  • Connects to Telegram automatically (no credentials needed from your side)
  • Parses public channels (by username or t.me link), up to 25 channels per run
  • For each post:
    • text, date, post URL
    • views, ER (views Γ· subscribers), reactions (with emoji breakdown + total), forwards, comments, pinned
    • forward source: isForward, forwardFromType, forwardFromId, forwardFromName, forwardChannelPost, forwardPostAuthor, forwardDate
    • hashtags & mentions (Unicode-aware β€” supports Cyrillic, e.g. #вакансия)
    • links from the post text, edit date, reply chain (replyToMsgId, replyToPostUrl)
    • media: photos, videos, documents β€” as t.me links, or downloaded with direct URLs (.jpg, .mp4, .pdf, etc.)
  • For each channel: title, description, subscribers, and the channel stats summary
  • Handles:
    • Albums β€” one record per message by default, or one record per album with groupAlbums
    • Telegram FloodWait limits gracefully (with an explanatory record in the dataset)
    • Cross-run conflicts via a per-session queue (see "Queue Behavior" below)
  • Channels you've scraped before are remembered, so repeat monitoring is faster and avoids Telegram lookup limits
  • Starts from the most recent post and works backwards

🧾 Input

You don't need to enter any credentials β€” they're already preconfigured.

FieldTypeRequiredDefaultDescription
channelsstringβœ…β€”Channel usernames or links, separated by commas or new lines (e.g. @channel1, https://t.me/channel2)
maxPostsnumber❌10Max number of Telegram messages per channel (1–200)
daysRangenumber❌3Number of days to look back from today (1–30)
includeTextboolean❌trueWhether to include post text in the output
mediaOnlyboolean❌falseIf true, skip posts that have no photos, videos or files
downloadMediaboolean❌falseIf true, download media files into the run's Key-Value Store
maxMediaSizeMBnumber❌50Files larger than this stay as t.me links (not downloaded). 0 = no limit
groupAlbumsboolean❌falseIf true, merge an album into one record: all files in mediaUrls, all message ids in groupedPostIds. With merging on you may get fewer records than maxPosts, because maxPosts counts Telegram messages

πŸ“Œ Example input β€” weekly competitor check

{
"channels": "@competitor1, https://t.me/competitor2, competitor3",
"maxPosts": 50,
"daysRange": 7,
"includeText": true,
"mediaOnly": false,
"downloadMedia": false,
"groupAlbums": false
}

⚠️ Channel limits per run. Up to 25 channels per run, of which up to 10 new channels (not scraped by this Actor before). Previously scraped channels are remembered and don't need a Telegram lookup, so they don't count toward the 10. Channels over the limit are listed in the run status and saved as type: "skipped" records β€” just run them again.


▢️ How to Run

  1. Open the Actor in Apify Console
  2. Fill in the input fields
  3. Click Save, then Start
  4. Watch the run status β€” it shows queue waiting time, progress, and a final summary
  5. Open the Output tab:
    • Posts β€” all posts with engagement metrics
    • Channel stats β€” one summary per channel
    • Downloaded media files β€” when downloadMedia is on
    • Run summary

To monitor channels regularly, save your input as a Task and add a Schedule (for example, every Monday).


πŸ“€ Output

Posts (dataset)

Each Telegram message (or each album, with groupAlbums: true) is a separate record. Every record has a type field:

typeMeaningCharged
postA post with contentβœ…
no_postsChannel has no posts in the selected period❌
skippedChannel postponed (per-run limit or temporary Telegram limit) β€” run it again❌
telegram_rate_limitTelegram asked to slow down; includes waitSeconds❌
channel_errorChannel not found, private, or another error❌

To get only content, filter by type = "post".

{
"type": "post",
"channel": "@channel_name",
"channelLink": "https://t.me/channel_name",
"channelTitle": "Channel Display Name",
"channelDescription": "Channel about / bio text",
"postId": 101,
"postUrl": "https://t.me/channel_name/101",
"date": "2026-10-15T17:31:01.000Z",
"views": 8263,
"subscribers": 330421,
"er": 2.5,
"text": "Example post content with #hashtag and @mention",
"reactions": [
{ "emoji": "❀", "count": 31 },
{ "emoji": "πŸ”₯", "count": 12 }
],
"totalReactions": 43,
"forwards": 41,
"comments": 3,
"pinned": false,
"links": ["https://example.com"],
"hasMedia": true,
"mediaUrls": ["https://t.me/channel_name/101"],
"mediaTypes": ["jpg"],
"groupedPostIds": [101],
"isForward": false,
"forwardFromType": "",
"forwardFromId": "",
"forwardFromName": "",
"forwardChannelPost": 0,
"forwardPostAuthor": "",
"forwardDate": "",
"hashtags": ["#hashtag"],
"mentions": ["@mention"],
"editDate": "",
"replyToMsgId": 0,
"replyToPostUrl": ""
}

Channel stats (CHANNEL_STATS, free)

Saved in the run's Key-Value Store and linked on the Output tab. One object per channel that returned posts:

{
"channel": "@channel_name",
"channelLink": "https://t.me/channel_name",
"channelTitle": "Channel Display Name",
"subscribers": 330421,
"postsAnalyzed": 12,
"basedOn": "all posts",
"periodDays": 1.04,
"postsPerDay": 11.57,
"avgViews": 5541,
"avgEr": 2.5,
"engagementRate": 1.74,
"avgReactions": 51.58,
"avgForwards": 40.75,
"avgComments": 3.83,
"topPostUrl": "https://t.me/channel_name/72686",
"topPostViews": 8263,
"lastPostDate": "2026-10-16T18:00:01.000Z"
}

What the metrics mean

FieldMeaning
erViews Γ· subscribers, in %. Fresh posts are still gaining views, so their ER is lower
forwardsHow many times the post was forwarded (shared)
commentsNumber of comments. 0 if the channel has comments turned off
avgErAverage ER of the channel's posts. Posts younger than 24 hours are left out when older posts exist, so the number isn't pulled down by fresh posts
engagementRate(reactions + forwards + comments) Γ· views, in % β€” how actively readers interact
postsPerDayPosts per day over periodDays
periodDaysThe period the stats cover: your daysRange, or β€” if maxPosts was reached first β€” the time from the oldest returned post to now
postsAnalyzedPosts in the summary. An album always counts as one post here, even with groupAlbums off
basedOnall posts, or media posts only when mediaOnly is on
topPostUrl, topPostViewsThe most-viewed post in the period

The summary is built from the posts returned in this run. For a fuller picture, raise maxPosts and daysRange. If Telegram doesn't return a subscriber count, er and avgEr are 0.

Run summary (RUN_SUMMARY)

{
"posts": 42,
"channelsProcessed": 3,
"mediaDownloaded": 0,
"mediaSkippedLarge": 0,
"postponedChannels": [],
"failedChannels": [],
"costLimitReached": false,
"channelStats": 3
}

⏳ Queue Behavior (Important for parallel users)

The Actor uses a shared Telegram session preconfigured by the author. Telegram allows only one active connection per session at any time β€” if multiple users run the Actor simultaneously, the second connection would get AUTH_KEY_DUPLICATED.

To prevent this, the Actor uses a cross-run lock: parallel runs are automatically queued and processed one at a time.

What this means in practice:

  • If no one else is running the Actor β†’ starts immediately
  • If another user is currently scraping β†’ your run waits in queue, and the run status shows how long you've been waiting
  • A typical wait is a few minutes (depends on what the previous run is doing)
  • Maximum queue wait is 15 minutes, after which the run fails with a clear message. You are not charged for waiting

πŸ›‘οΈ Telegram Rate Limit Handling

If Telegram returns a FloodWait on contacts.ResolveUsername (too many lookups of new channel usernames in a short period), the Actor:

  1. Stops looking up new channels for the rest of this run, to protect the session
  2. Keeps processing channels you've scraped before β€” they don't need a lookup
  3. Adds a telegram_rate_limit record with the wait duration (waitSeconds) and a clear explanation
  4. Retry the skipped channels after the indicated time (often 10–11 hours)

For any other very long FloodWait (1 hour or more), the run stops early to protect the session and reports it in the dataset and run status.


πŸ›  Use Cases

  • Competitor monitoring β€” compare reach, ER and posting frequency across channels every week
  • Choosing channels for ads β€” check real reach (avgEr) and audience activity (engagementRate) before you buy
  • Content analytics β€” find the posts that get the most views, forwards and comments
  • Market and trend research β€” track topics through hashtags, mentions and links
  • Forward chain analysis β€” see which posts get republished and where they came from
  • Dataset building for AI/ML models (with hashtags and mentions as labels)

πŸ“œ Changelog

2026-10-16

  • βœ… New post fields: forwards, comments, er, pinned
  • βœ… New free CHANNEL_STATS summary per channel (average views, average ER, engagement rate, posts per day, average reactions, forwards and comments, top post)
  • βœ… RUN_SUMMARY.channelStats β€” number of channels with a summary
  • βœ… Output tab: ER, Forwards and Comments columns; Channel stats link
  • βœ… Existing fields, record count, input and pricing unchanged

2026-10-12

  • βœ… Pay-per-event pricing is live: no monthly fee β€” $0.01 per run start, $10 per 1,000 posts, $5 per 1,000 downloaded media files
  • βœ… Queue waits, failed connections and service records are free

2026-09-28

  • βœ… Pay-per-event pricing announced, effective 2026-10-12 (no monthly fee; service records, queue waits and failed connections will be free)
  • βœ… Channel cache: previously scraped channels skip contacts.ResolveUsername (the main cause of FloodWait); each channel is now resolved once per run instead of twice
  • βœ… Up to 25 channels per run, max 10 new ones; channels over the limit are reported as type: "skipped" instead of being silently dropped
  • βœ… FloodWait on new-channel lookups no longer stops already-known channels
  • βœ… Run status messages: queue waiting time, progress per channel, final summary
  • βœ… RUN_SUMMARY record in the Key-Value Store
  • βœ… type field on every record (post, no_posts, skipped, telegram_rate_limit, channel_error)
  • βœ… channels accepts t.me links (incl. /s/ and post links) and new-line separation; duplicates removed
  • βœ… New groupAlbums option (off by default) and groupedPostIds field
  • βœ… New maxMediaSizeMB option (default 50 MB)
  • βœ… Link previews no longer counted as media (hasMedia, mediaUrls)
  • βœ… Respects the Max cost per run limit
  • βœ… Clearer error messages for invalid, private and non-channel usernames

2026-05-03

  • βœ… Added channel metadata (channelTitle, channelDescription)
  • βœ… Added forwards detection (7 new forward* fields)
  • βœ… Added hashtags + mentions extraction
  • βœ… Added editDate and reply chain fields (replyToMsgId, replyToPostUrl)
  • βœ… Cross-run lock now uses author-scoped Apify token, so the queue works for all users (not only the Actor owner)
  • βœ… Replaced silent exit handling with explicit Actor.fail() so errors are visible in run status
  • βœ… Added 15-second timeout on Telegram getMe() to prevent multi-minute hangs on dead sessions
  • βœ… Disabled autoReconnect to fail fast and surface real errors

2025-12-05

  • βœ… Added explicit handling and logging for Telegram contacts.ResolveUsername FloodWait errors
  • βœ… When Telegram returns a FloodWait, the Actor now stops processing further channels in that run and adds a telegram_rate_limit record to the dataset with a human-readable explanation
  • βœ… Limited the number of channels processed per run to 10 to reduce the risk of hitting global FloodWait on the shared Telegram session
  • βœ… Updated input description to recommend no more than 10 channels per run and documented this behavior in the README

2025-10-10

  • βœ… Fixed AUTH_KEY_DUPLICATED by adding a per-session lock (prevents concurrent reuse of the same Telegram auth key)
  • βœ… Improved error messages for session conflicts
  • βœ… Internal stability tweaks for Telegram requests and media downloads

❓ Troubleshooting

Empty results / type: "no_posts"

  • Increase daysRange to 7..14 β€” the channel may not have posts in the default 3-day window
  • Increase maxPosts to 20..50
  • Make sure the channel is public and the username is correct

comments is always 0

  • The channel has comments turned off (no discussion group). This is normal

ER looks low for the newest posts

  • Fresh posts are still gaining views. Use avgEr in Channel stats β€” it leaves out posts younger than 24 hours

type: "skipped" records / channels "not processed" in the run status

  • The run hit the per-run channel limits β€” run again with just those channels

type: "channel_error"

  • The channel may be private, deleted, a user or bot rather than a channel, or an invite link (t.me/+...), which isn't supported

Run waits 5+ minutes in queue

  • Another user is currently using the Actor; this is normal under load
  • Retry in a few minutes when the queue clears

telegram_rate_limit record in dataset

  • Telegram applied a FloodWait β€” wait the indicated number of hours before retrying the skipped channels
  • Channels you've scraped before are not affected

Run failed with AUTH_KEY_DUPLICATED

  • Should not happen with the built-in queue, but if it does β€” wait 10 minutes and retry

⚠️ Telegram Albums

Telegram delivers an album (several photos/videos with one caption) as several separate messages, one file each, with the caption on one of them.

By default (groupAlbums: false) the Actor returns them as Telegram delivers them β€” one record per message. They share the same date and have consecutive postId values.

With groupAlbums: true the Actor merges them into one record:

  • text β€” the album's caption
  • mediaUrls / mediaTypes β€” all files of the album
  • groupedPostIds β€” ids of all messages in the album
  • postId / postUrl β€” the first message of the album

In Channel stats, an album always counts as one post, whichever setting you use.


πŸ” License & Usage

This Actor is a proprietary paid product.

  • ❗ It is not open source
  • πŸ“¦ It is licensed for private and commercial use by users of this Actor
  • πŸ›‘ Any unauthorized copying, reselling, or redistribution is strictly prohibited
  • πŸ§‘β€πŸ’» All activity is logged for abuse prevention and fair use enforcement

To report a bug, please open an issue β€” I respond quickly.


Made with πŸ’™ for Telegram research & automation.