Telegram Channel Content & Media Scraper
Pricing
$10.00 / 1,000 posts
Telegram Channel Content & Media Scraper
Download photos, videos and posts from any public Telegram channel. Pick only photos, videos, audio or files, get size, resolution and duration for each file, plus post text, views and reactions. Up to 25 channels, no API key or phone needed. Free media downloads, pay only per post.
Pricing
$10.00 / 1,000 posts
Rating
5.0
(8)
Developer
Olga
Maintained by CommunityActor stats
27
Bookmarked
1.2K
Total users
82
Monthly active users
4 days ago
Last modified
Categories
Share
π¦ Telegram Channel Content & Media Scraper
π¬ Download photos, videos and posts from any public Telegram channel β in one click.
Paste up to 25 public channels and in a few minutes you get:
- All photos, videos, audio and files from the posts β as links, or downloaded to storage with direct download URLs
- Only the media you need: choose Photos only, Videos only, Audio only or Files only
- File details for every file: type, file name, size in MB, width Γ height, video and audio duration
- The post itself: text, date, views, reactions, forwards, hashtags, mentions and links
- 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: content managers and media teams archiving channels, researchers and AI teams building image, video and text datasets, news and content aggregators.
π Updated on October 16, 2026: new Media type filter (photos / videos / audio / files) and a
mediaFilesfield with details of every file. Nothing changed in existing fields or defaults.π° $10 per 1,000 posts β that's it. No monthly fee, no run fee, no extra charge for downloading media. Service records, skipped posts, errors and queue time are free. Details below in Pricing.
π What's new (2026-10-16)
- β
Media type filter (
mediaFilter): All media (default, as before), Photos only, Videos only, Audio and voice only, Files only (PDF, ZIP, etc.). Posts without such files are skipped and not charged - β
mediaFileson every post β one entry per file:type,fileName,mimeType,sizeMB,width,height,durationSec,url,downloaded - β
RUN_SUMMARYnow showsmediaFilterandskippedByMediaFilter - β Output tab: Type, File types and Media links columns
- β Existing fields, defaults and pricing unchanged β your automations keep working
π° Pricing
| What | Price |
|---|---|
| Post | $10.00 / 1,000 posts |
| Downloading media | Free |
| Platform usage | Included |
No monthly fee and no run fee.
You are never charged for:
- service records: "no posts found", channel errors, rate-limit notices, skipped channels;
- posts skipped by the Media type filter or by Media only;
- time in the queue, queue timeouts and failed connections to Telegram.
With groupAlbums: true, an album is one post β you pay once per album, not once per photo.
Since October 13, 2026, you pay only for real posts: service records, which used to be charged, are now free.
Set Max cost per run in the run options to cap your spending β the Actor stops cleanly when the limit is reached.
β What This Actor Does
- Connects to Telegram automatically (no credentials needed from your side)
- Parses public channels (by username or
t.melink), up to 25 channels per run - For each post:
- Media: photos, videos, GIFs, audio and voice messages, documents β as
t.melinks, or downloaded with direct URLs (.jpg,.mp4,.pdf, etc.), with file details inmediaFiles - Content: text, date, post URL, views, reactions (with emoji breakdown + total)
- Forwards: detects native Telegram forwards and exposes the source (
isForward,forwardFromType,forwardFromId,forwardFromName,forwardChannelPost,forwardPostAuthor,forwardDate) - Hashtags & mentions (Unicode-aware β supports Cyrillic, e.g.
#Π²Π°ΠΊΠ°Π½ΡΠΈΡ) - Links, edit date, reply chain (
replyToMsgId,replyToPostUrl)
- Media: photos, videos, GIFs, audio and voice messages, documents β as
- For each channel: title, description, subscriber count
- Handles:
- Albums β one record per message by default, or one record per album with
groupAlbums - Large files β files over
maxMediaSizeMBstay as links instead of being downloaded - Telegram FloodWait limits gracefully (with an explanatory record in the dataset)
- Cross-run conflicts via a per-session queue (see "Queue Behavior" below)
- Albums β one record per message by default, or one record per album with
- Channels you've scraped before are remembered, so repeat runs are faster and avoid 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.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
channels | string | β | β | Channel usernames or links, separated by commas or new lines (e.g. @channel1, https://t.me/channel2) |
maxPosts | number | β | 10 | Max number of Telegram messages per channel (1β200) |
daysRange | number | β | 3 | Number of days to look back from today (1β30) |
includeText | boolean | β | true | Whether to include post text in the output |
mediaOnly | boolean | β | false | If true, skip posts that have no photos, videos or files |
mediaFilter | string | β | all | all, photo, video, audio or document. Returns only posts with this type of file, and lists (or downloads) only those files. GIFs and stickers count only under all |
downloadMedia | boolean | β | false | If true, download media files into the run's Key-Value Store |
maxMediaSizeMB | number | β | 50 | Files larger than this stay as t.me links (not downloaded). 0 = no limit |
groupAlbums | boolean | β | false | If 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 β download all videos from the last week
{"channels": "@channel1, https://t.me/channel2","maxPosts": 100,"daysRange": 7,"mediaFilter": "video","downloadMedia": true,"maxMediaSizeMB": 200,"groupAlbums": true}
π‘ The filter works within
maxPostsanddaysRange. Videos only withmaxPosts: 20returns the videos among the last 20 messages, not 20 videos. To find more, raisemaxPosts.
β οΈ 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
- Open the Actor in Apify Console
- Fill in the input fields β pick a Media type if you need only photos, videos, audio or files
- Turn on Download media if you want the files themselves, not just links
- Click Save, then Start
- Results are on the Output tab:
- Posts β all posts with media links and file details
- Downloaded media files β when
downloadMediais on - Run summary
π€ Output
Each Telegram message (or each album, with groupAlbums: true) is saved as a separate record in the default dataset (JSON format). Every record has a type field:
type | Meaning |
|---|---|
post | A post with content |
no_posts | Channel has no matching posts in the selected period |
skipped | Channel postponed (per-run limit or temporary Telegram limit) β run it again |
telegram_rate_limit | Telegram asked to slow down; includes waitSeconds |
channel_error | Channel not found, private, or another error |
Only post records are charged. 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": 552,"postUrl": "https://t.me/channel_name/552","date": "2026-10-11T14:52:40.000Z","views": 969222,"subscribers": 10357013,"text": "Example post content with #hashtag and @mention","reactions": [{ "emoji": "π", "count": 42 },{ "emoji": "β€οΈ", "count": 18 }],"totalReactions": 60,"links": ["https://example.com"],"hasMedia": true,"mediaUrls": ["https://api.apify.com/v2/key-value-stores/<storeId>/records/channel_name_552.mp4?disableRedirect=1"],"mediaTypes": ["mp4"],"mediaFiles": [{"type": "video","fileName": "IMG_6025.MP4","mimeType": "video/mp4","sizeMB": 27.71,"width": 1080,"height": 1080,"durationSec": 75.95,"postId": 552,"url": "https://api.apify.com/v2/key-value-stores/<storeId>/records/channel_name_552.mp4?disableRedirect=1","downloaded": true}],"groupedPostIds": [552],"isForward": false,"forwardFromType": "","forwardFromId": "","forwardFromName": "","forwardChannelPost": 0,"forwardPostAuthor": "","forwardDate": "","hashtags": ["#hashtag"],"mentions": ["@mention"],"editDate": "","replyToMsgId": 0,"replyToPostUrl": ""}
mediaFiles β file details
| Field | Meaning |
|---|---|
type | photo, video, gif, audio, sticker or document. Telegram marks silent looping videos as gif |
fileName | Original file name, if the file has one (photos usually don't) |
mimeType | For example image/jpeg, video/mp4, application/pdf |
sizeMB | File size in MB |
width, height | In pixels, for photos and videos |
durationSec | Length of videos and audio, in seconds |
url | Direct download URL if the file was downloaded, otherwise the t.me link |
downloaded | true if the file is saved in the run's Key-Value Store |
Run summary (RUN_SUMMARY)
{"posts": 2,"channelsProcessed": 3,"mediaDownloaded": 2,"mediaSkippedLarge": 0,"postponedChannels": [],"failedChannels": [],"costLimitReached": false,"mediaFilter": "video","skippedByMediaFilter": 40}
β³ 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:
- Stops looking up new channels for the rest of this run, to protect the session
- Keeps processing channels you've scraped before β they don't need a lookup
- Adds a
telegram_rate_limitrecord with the wait duration (waitSeconds) and a clear explanation - 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
- Media archiving β save all photos and videos of a channel before they disappear
- AI and ML datasets β collect images, videos and captions, filtered by type, with size and resolution for each file
- Content repurposing β get the videos or images you need from your own or partner channels
- News and content aggregation β pull posts and media from many channels into one feed
- Document collection β download PDFs and other files shared in channels
π Changelog
2026-10-16
- β
New Media type filter (
mediaFilter): all / photo / video / audio / document; posts without such files are skipped and not charged - β
New
mediaFilesfield with details of every file (type, file name, MIME type, size, width, height, duration, URL, downloaded) - β
RUN_SUMMARY:mediaFilter,skippedByMediaFilter - β Output tab: Type, File types and Media links columns
- β Existing fields, defaults and pricing unchanged
2026-10-13
- β Fairer billing is live: same $10 / 1,000 posts, service records are no longer charged
2026-09-29
- β Billing announced for 2026-10-13: same $10 / 1,000 posts, service records no longer charged
- β
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_SUMMARYrecord in the Key-Value Store - β
typefield on every record (post,no_posts,skipped,telegram_rate_limit,channel_error) - β
channelsacceptst.melinks (incl./s/and post links) and new-line separation; duplicates removed - β
New
groupAlbumsoption (off by default) andgroupedPostIdsfield - β
New
maxMediaSizeMBoption (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
editDateand 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
autoReconnectto fail fast and surface real errors
2025-12-05
- β
Added explicit handling and logging for Telegram
contacts.ResolveUsernameFloodWait errors - β
When Telegram returns a FloodWait, the Actor now stops processing further channels in that run and adds a
telegram_rate_limitrecord 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_DUPLICATEDby 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
daysRangeto7..14β the channel may not have posts in the default 3-day window - Increase
maxPoststo20..50 - Make sure the channel is public and the username is correct
"No posts with video files foundβ¦" with a Media type filter
- The channel had no such files among the checked posts. Raise
maxPostsordaysRange
A video is missing with Videos only
- Telegram may mark it as a GIF (silent looping video). Use All media and filter by
mediaFiles.type
A file is a t.me link instead of a download URL
- It's larger than
maxMediaSizeMB(default 50 MB). Raise the limit or set0for no limit
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 β and you pay for one post:
textβ the album's captionmediaUrls/mediaTypes/mediaFilesβ all files of the albumgroupedPostIdsβ ids of all messages in the albumpostId/postUrlβ the first message of the album
π 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.