Telegram Media Downloader
Pricing
Pay per event
Telegram Media Downloader
Extract public Telegram channel/post media URLs, metadata, timestamps, views, and optional KVS downloads without login.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
Extract media URLs, message metadata, and optional downloadable files from public Telegram channels and public Telegram posts.
Telegram Media Downloader is an Apify Actor for researchers, analysts, journalists, OSINT teams, and developers who need repeatable public Telegram media collection without maintaining custom parsers.
It works with public t.me/s/<channel> archive pages and public t.me/<channel>/<messageId> post URLs. It does not log in, bypass private channels, or attempt to access Telegram content that is not publicly visible on the web.
What does Telegram Media Downloader do?
This Actor reads public Telegram web HTML and saves one dataset item per message.
It extracts:
- Channel handle and title
- Message ID and canonical Telegram URL
- Message text
- Publish timestamp
- View count when Telegram exposes it
- Media type list
- Source media URLs
- Detailed media objects
- Optional key-value-store download references
- Skip reasons for unsupported or private pages
Who is it for?
OSINT and trust-and-safety analysts
Archive public Telegram evidence with message URLs, timestamps, text, and attached media references.
Journalists and researchers
Collect public channel posts and media for reproducible research datasets.
Brand monitoring teams
Track public impersonation, scam, or announcement channels and export the media evidence.
Developers and data engineers
Use Apify datasets, API clients, webhooks, and integrations to pipe Telegram message media into downstream workflows.
Why use this Telegram media extractor?
- HTTP-first and lightweight: no browser needed for public Telegram HTML.
- Public-only by design: no account credentials, cookies, or login bypass.
- Export-friendly: every message becomes a stable dataset row.
- Media-aware: photos, videos, documents, audio, and unknown CDN files are grouped per message.
- Optional downloads: persist media during the same run when you need Apify storage copies.
- Automation-ready: works with Apify API, schedules, webhooks, and integrations.
Supported Telegram URLs
Use public Telegram links such as:
https://t.me/s/telegramhttps://t.me/telegram/429
The Actor accepts multiple start URLs in one run.
Unsupported Telegram URLs
The Actor intentionally skips:
- Private channels
- Invite-only group links
- Login-only pages
- Deleted posts
- Pages blocked by Telegram access controls
- Telegram account session/cookie workflows
This keeps the Actor compliant with public-web extraction and avoids access-control bypass.
Input options
| Field | Type | Description |
|---|---|---|
startUrls | array | Public Telegram archive or post URLs. |
maxMessages | integer | Maximum message rows to save. |
downloadFiles | boolean | Save media files to key-value store when enabled. |
mediaTypes | array | Keep selected media types. |
minDate | string | Optional ISO earliest publish date. |
maxDate | string | Optional ISO latest publish date. |
Example input
{"startUrls": [{ "url": "https://t.me/s/telegram" }],"maxMessages": 100,"downloadFiles": false,"mediaTypes": ["photo", "video", "document", "audio"]}
Output data
Each dataset item represents one public Telegram message.
| Field | Description |
|---|---|
channelHandle | Telegram public channel handle. |
channelTitle | Display name when available. |
messageId | Numeric Telegram message ID. |
messageUrl | Canonical message URL. |
sourceUrl | Input URL that produced the row. |
text | Message text. |
publishedAt | Message publish timestamp. |
views | Public view count when present. |
mediaTypes | Unique media types found on the message. |
mediaCount | Number of media objects saved in the row. |
mediaUrls | Direct source/CDN URLs detected in the public HTML. |
media | Detailed media objects with type, URL, extension, thumbnail, and KVS references. |
downloaded | Whether at least one file was downloaded to KVS. |
skippedReason | Why a source produced no public message. |
scrapedAt | Extraction timestamp. |
Example output item
{"channelHandle": "telegram","channelTitle": "Telegram News","messageId": 429,"messageUrl": "https://t.me/telegram/429","text": "Member Tags...","publishedAt": "2026-03-02T17:33:34+00:00","views": 1570000,"mediaTypes": ["video"],"mediaCount": 1,"mediaUrls": ["https://cdn1.telesco.pe/file/example.mp4?..."],"downloaded": false}
How much does it cost to download Telegram media?
This Actor uses pay-per-event pricing.
You are charged a small run start event and a per-message item event. Final live pricing is shown on the Apify Store pricing tab and may include tiered discounts.
For cost control:
- Start with
downloadFiles=falseif URLs are enough. - Keep
maxMessagesmodest during testing. - Enable downloads only when you need stored file copies.
- Use date filters to avoid collecting older posts you do not need.
How to run the Actor
- Open the Actor on Apify.
- Paste public Telegram channel archive or post URLs.
- Set
maxMessages. - Choose media types.
- Decide whether to download files to key-value store.
- Start the run.
- Export results from the dataset as JSON, CSV, Excel, XML, RSS, or HTML.
Tips for best results
- Prefer
https://t.me/s/<channel>for channel archive collection. - Use single post URLs when you only need one message.
- Keep media downloads off for discovery runs.
- Re-run on schedules for public channels that post frequently.
- Store the
messageUrlin downstream systems so evidence remains traceable.
Integrations
Use Telegram Media Downloader with:
- Apify datasets for CSV/Excel exports
- Google Sheets exports
- Webhooks for monitoring workflows
- Make and Zapier automations
- Data warehouses via Apify API
- Slack/Discord alerts for new public media evidence
API usage: Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/telegram-media-downloader').call({startUrls: [{ url: 'https://t.me/s/telegram' }],maxMessages: 100,downloadFiles: false});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
API usage: Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_APIFY_TOKEN')run = client.actor('automation-lab/telegram-media-downloader').call(run_input={'startUrls': [{'url': 'https://t.me/s/telegram'}],'maxMessages': 100,'downloadFiles': False,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items[0])
API usage: cURL
curl -X POST "https://api.apify.com/v2/acts/automation-lab~telegram-media-downloader/runs?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"startUrls":[{"url":"https://t.me/s/telegram"}],"maxMessages":100}'
MCP usage
Use the Apify MCP server with:
https://mcp.apify.com/?tools=automation-lab/telegram-media-downloader
Add it to Claude Code:
$claude mcp add apify-telegram-media https://mcp.apify.com/?tools=automation-lab/telegram-media-downloader
Claude Desktop JSON config example:
{"mcpServers": {"apify-telegram-media": {"url": "https://mcp.apify.com/?tools=automation-lab/telegram-media-downloader"}}}
Example prompts:
- "Run Telegram Media Downloader for this public channel and summarize posts with videos."
- "Extract public Telegram media URLs from this message and return CSV-ready rows."
- "Monitor this public Telegram archive weekly and alert me when new documents appear."
Public-only legality note
This Actor is designed for public Telegram pages that anyone can access in a browser without logging in.
You are responsible for using the extracted data lawfully, respecting copyright, privacy, and platform rules, and avoiding collection of private or restricted content.
FAQ
Can this Actor access private Telegram channels?
No. It only extracts content visible on public Telegram web pages without login.
Should I enable file downloads?
Enable downloadFiles when you need durable Apify storage copies. Keep it off when CDN URLs and metadata are enough.
Troubleshooting: no rows returned
Check that the URL is public and uses t.me.
If the channel requires joining, logging in, an invite link, or an app-only flow, the Actor cannot access it.
Troubleshooting: media URL expired
Telegram CDN URLs can be temporary.
If you need durable copies, enable downloadFiles so the Actor stores media files in the run key-value store during extraction.
Related scrapers
Related Automation Lab actors:
- https://apify.com/automation-lab/telegram-media-downloader
- https://apify.com/automation-lab/threads-post-media-downloader
- https://apify.com/automation-lab/tumblr-media-downloader
Changelog
0.1
Initial public Telegram channel/post media extraction with optional KVS downloads.
Limits
The Actor reads public Telegram web pages and paginates public channel archives. It does not use the Telegram API and does not authenticate.
Data quality notes
Telegram can change public HTML markup. If a message has unusual media markup, the Actor still saves text and metadata when available and leaves media arrays empty if no public URL is found.
Privacy and compliance
Do not use this Actor to collect or redistribute private content. Keep datasets only as long as needed for your workflow.
Support
If a public Telegram URL does not work, share the public URL, run ID, and expected result so the extractor can be adjusted to Telegram's current markup.