Telegram Channel Scraper | Posts Messages
Pricing
from $0.00005 / actor start
Telegram Channel Scraper | Posts Messages
Scrape Telegram channels posts and messages. Export text, media, views, reactions, sender data, and links
Pricing
from $0.00005 / actor start
Rating
0.0
(0)
Developer
Easy Tools
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Telegram Channel Scraper β export posts, media, and channel data from Telegram π
This Telegram Channel Scraper helps you collect Telegram posts, message metadata, and downloadable media without manually scrolling channels or exporting chats by hand. It is built for teams that need a reliable telegram posts scraper for research, monitoring, archives, enrichment, and reporting.
You get structured output after each run, and billing happens only when the actor successfully delivers a post to the dataset. That makes it practical for recurring collection, one-off telegram data export jobs, and large historical backfills. β
What you get after each run π
- Dataset: one row per delivered Telegram post plus one
source_summaryrow per source; exportable from Apify in JSON, CSV, Excel, XML, and RSS π - Files/Storage: downloadable media files are stored in the default key-value store and exposed in output as direct URLs when
downloadMedia=trueποΈ
Modes / Features βοΈ
Full scrapeβ collect posts, text, reactions, sender data, webpage and poll metadata πResolve onlyβ validate sources and resolve invite links without scraping messages π§Ύ
Support
For issues, use the Actor page Issues or send email artur.novikk@gmail.com or message in Telegram
π‘ Tip: Use this actor when you need a Telegram channel downloader, telegram message export workflow, or searchable dataset instead of raw Telegram export files.
Table of contents π
- Key features
- Use cases
- How to scrape Telegram channel posts
- Pricing
- Input
- Output
- Statuses & error codes
- FAQ
Key features β¨
- Scrape Telegram sources from
@username, plain usernames, publict.me/...links, and invite links. - Export one dataset row per post, with album posts grouped into one row by
albumId. - Download media and keep direct file URLs in output for photo, document, video, and audio posts.
- Capture views, forwards, reactions, sender metadata, webpage previews, and poll artifacts.
- Resume from checkpoints so repeated runs can continue historical collection instead of starting from scratch.
Use cases π―
- Competitive research β monitor channel activity, reactions, and posting volume over time.
- Content archiving β create a clean telegram channel export with media links and message metadata.
- Lead generation and enrichment β collect channel titles, usernames, descriptions, and post URLs.
- Media collection β use it as a media saver for Telegram channels with downloadable assets.
- Reporting and analytics β build dashboards from views, forwards, replies, and reactions.
How to scrape Telegram channel posts π§
- Add your Telegram sources in the
sourcesfield. - Select
fromDateandtoDatewith the built-in date picker if you need a bounded scrape. - Turn on
downloadMediaif you want direct file links in the output. - Enable the metadata you need: reactions, views, forwards, sender, webpage, and poll artifacts.
- Run the actor and export the resulting dataset or download media from the provided URLs.
Pricing πΈ
$0.01per delivered text post$0.015per delivered media post
β οΈ Important pricing note
- The actor charges only after a post is successfully delivered to the dataset.
- Invalid input, failed resolution, filtered-out posts, and
resolveOnlyruns do not create delivery charges for posts.- Charging is event-based, not dataset-item-based.
Input β¨οΈ
Fields
sources(array, required): Telegram sources to process. Supports@username,username,https://t.me/username,https://t.me/+inviteHash, andhttps://t.me/joinchat/inviteHash.maxMessagesPerChannel(integer, optional): Maximum number of delivered posts per source. Leave empty to continue through all available history from the checkpoint.downloadMedia(boolean, optional, defaulttrue): Download supported media files and expose direct URLs in output.mediaTypes(array, optional, default["photo","document","video","audio","webpage","poll"]): Media categories to keep.includeReactions(boolean, optional, defaulttrue): Include Telegram reactions.includeViews(boolean, optional, defaulttrue): Include Telegram view counters when available.includeForwards(boolean, optional, defaulttrue): Include Telegram forward counters when available.includeSender(boolean, optional, defaulttrue): Include sender identity fields when available.includeWebpageArtifacts(boolean, optional, defaulttrue): Include normalized webpage preview data.includePollArtifacts(boolean, optional, defaulttrue): Include normalized poll data.keywords(array, optional): Keep only posts containing at least one keyword.mediaOnly(boolean, optional, defaultfalse): Keep only posts with downloadable media.textOnly(boolean, optional, defaultfalse): Keep only posts without downloadable media.fromDate(string, optional): Lower date bound selected with the Apify calendar UI. Format:YYYY-MM-DD.toDate(string, optional): Upper date bound selected with the Apify calendar UI. Format:YYYY-MM-DD.joinOnInvite(boolean, optional, defaulttrue): Attempt to join or import an invite link before scraping.resolveOnly(boolean, optional, defaultfalse): Validate and resolve sources without scraping posts.
Input examples β
Example 1 β scrape a public channel with media downloads
{"sources": ["@TEST_MEDIA"],"downloadMedia": true,"mediaTypes": ["photo", "document", "video", "audio", "webpage", "poll"],"includeReactions": true,"includeViews": true,"includeForwards": true,"includeSender": true,"includeWebpageArtifacts": true,"includePollArtifacts": true,"keywords": [],"mediaOnly": false,"textOnly": false,"fromDate": "2026-03-02","toDate": "2026-03-26","joinOnInvite": true,"resolveOnly": false}
Example 2 β text-only message scrape for multiple sources
{"sources": ["https://t.me/pack333","https://t.me/ekvlvsem"],"maxMessagesPerChannel": 100,"downloadMedia": false,"includeReactions": true,"includeViews": true,"includeForwards": true,"includeSender": false,"includeWebpageArtifacts": true,"includePollArtifacts": false,"keywords": ["youtube", "traffic"],"mediaOnly": false,"textOnly": true,"joinOnInvite": true,"resolveOnly": false}
Example 3 β resolve invite links without scraping
{"sources": ["https://t.me/+F3m2kcP1Fo0MmYy","@TEST_MEDIA"],"downloadMedia": false,"includeReactions": false,"includeViews": false,"includeForwards": false,"includeSender": false,"includeWebpageArtifacts": false,"includePollArtifacts": false,"keywords": [],"mediaOnly": false,"textOnly": false,"joinOnInvite": true,"resolveOnly": true}
Output π¦
Where output is stored ποΈ
- Default dataset: contains both
messagerows andsource_summaryrows. - Default key-value store: contains checkpoint state and downloaded media files.
- Output tabs in Apify Console:
MessagesandSource Summaries.
Example output item
{"itemType": "message","id": "TEST_MEDIA:14567","channel": "@TEST_MEDIA","channelLink": "https://t.me/TEST_MEDIA","sourceInput": "@TEST_MEDIA","sourceId": 1234327890,"canonicalSource": "TEST_MEDIA","channelTitle": "TEST Media","channelUsername": "TEST_MEDIA","channelDescription": "News and analytics","subscribers": 125000,"messageId": 14567,"postUrl": "https://t.me/TEST_MEDIA/14567","date": "2026-03-24T10:15:00Z","dateLabel": "2026-03-24","postType": "regular","text": "Market update and charts.","views": 18234,"forwards": 87,"replyCount": 0,"reactions": [{ "emoji": "π₯", "count": 44 },{ "emoji": "π", "count": 21 }],"reactionMap": {"π₯": 44,"π": 21},"totalReactions": 65,"likes": 65,"links": ["https://example.com/report"],"hasMedia": true,"mediaTypes": ["photo"],"albumId": null,"media": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/14567.jpg?disableRedirect=1&token=TOKEN","sender": {"id": 1234567890,"username": "TEST_MEDIA","name": "TEST Media","firstName": null,"lastName": null},"status": "DELIVERED","errorCode": null,"scrapedAt": "2026-03-26T12:00:00Z"}
Output fields
itemType:messageorsource_summary.id: Stable row identifier.channel: Human-readable channel handle such as@TEST_MEDIA.channelLink: Public channel URL when available.sourceInput: Original source provided by the user.sourceId: Telegram numeric source ID when available.canonicalSource: Canonical internal source identifier used by the actor.channelTitle: Resolved channel title.channelUsername: Resolved public username when available.channelDescription: Resolved channel description when available.subscribers: Subscriber/member count when Telegram exposes it.messageId: Telegram message ID.postUrl: Public post URL when available.date: Post timestamp in UTC ISO format.dateLabel: Short UTC date label.postType:regularorservice.text: Post text.views: View count when available.forwards: Forward count when available.replyCount: Reply count when available.reactions: Array of{emoji, count}objects.reactionMap: Flattened reaction map for analytics.totalReactions: Sum of all reactions.likes: Alias for total reactions.links: URLs detected in post text or webpage metadata.hasMedia: Whether the post contains downloadable media.mediaTypes: Media types found on the post.replyToMessageId: Parent message ID when available.albumId: Shared Telegramgrouped_idfor album posts.forwardInfo: Forward metadata when Telegram provides it.postAuthor: Telegram post author field when present.media: A single direct media URL or an array of direct media URLs for album posts.webpage: Normalized webpage preview object when enabled.poll: Normalized poll object when enabled.sender: Sender object when enabled and available.contentHash: Stable content hash used for idempotency logic.status: Delivery or summary status.errorCode: Error code when the row represents a failure or skipped outcome.scrapedAt: Actor timestamp when the row was written.checked,messagesSeen,messagesSaved,mediaDownloaded,errorMessage,startedAt,finishedAt: Summary fields used bysource_summaryrows.
Statuses & error codes π§Ύ
Statuses
DELIVEREDβ a message row was successfully written.RESOLVED_ONLYβ source was resolved, but no scraping was requested.SCRAPEDβ source scraping completed and at least one post was saved.FAILEDβ source failed without producing saved posts.INVALID_INPUTβ source or input field was invalid.WAITING_FOR_APPROVALβ Telegram invite exists but requires approval.BUDGET_EXCEEDEDβ delivery charging was blocked by the configured budget.FAILED_AFTER_CHARGEβ a charged delivery did not complete dataset persistence cleanly.SKIPPED_BUDGETβ remaining sources were skipped after budget stop.SKIPPED_FAILSAFEβ remaining sources were skipped after a failsafe stop.
Error codes
INVALID_INPUT_EMPTYβsourcesis missing or empty.INVALID_INPUTβ generic invalid input, including too many sources.INVALID_INPUT_CONFLICTβ conflicting flags such asmediaOnly=trueandtextOnly=true.INVALID_INPUT_NEGATIVE_LIMITβ negativemaxMessagesPerChannel.INVALID_INPUT_DATE_RANGEβfromDateis aftertoDate.INVALID_DATE_FORMATβ invalid date value.INVALID_FORMATβ invalid source format.INVALID_INVITEβ invite link is invalid.JOIN_REQUEST_PENDINGβ invite requires approval.RESOLVE_FAILEDβ source could not be resolved.CONFIG_MISSING_SECRETβ missing Telegram secret.CONFIG_INVALID_API_KEYβ invalid Telegram credentials or unauthorized session.CONFIG_INVALID_MONETIZATIONβ pay-per-event is not configured correctly.CHARGE_FAILEDβ charge failed or limit was reached.TELEGRAM_RATE_LIMITβ Telegram flood wait or rate limit failure.TELEGRAM_API_ERRORβ Telegram-side request failure.CHECKPOINT_SAVE_FAILEDβ checkpoint persistence failed.DATASET_PUSH_FAILEDβ dataset write failed.MEDIA_DOWNLOAD_FAILEDβ media download or validation failed.
Best practices β
- Start with one or two channels before running a large historical scrape.
- Use date filters to reduce scan volume for high-traffic channels.
- Disable
downloadMediawhen you only need metadata and post URLs. - Keep
includeSender,includeReactions, andincludeViewsenabled only when you need those fields downstream. - Use
resolveOnly=trueto validate invite links before a large production run.
FAQ β
How do I scrape Telegram channel posts by date?
Use fromDate and toDate in the actor input. In the Apify UI those fields now open a calendar picker and submit dates in YYYY-MM-DD format.
Can I use this as a telegram media downloader?
Yes. Turn on downloadMedia=true. The actor will keep direct media URLs in the media field for supported downloadable files.
Does it export Telegram messages to CSV or Excel?
Yes. The output is stored in the default dataset, so you can export it from Apify as JSON, CSV, Excel, XML, or RSS.
Is this a telegram channel exporter or only a message scraper?
It does both. You get resolved channel metadata plus delivered post rows, which makes it useful as a telegram channel exporter and a messages scraper.
Where do I download the media files?
If downloadMedia=true, the actor stores media in the default key-value store and writes direct URLs into the media field of each message row.
Why was a source marked WAITING_FOR_APPROVAL?
That status means Telegram accepted the invite format, but the source requires a manual join approval before scraping can continue.
Can it handle albums with multiple images or files?
Yes. Album posts are grouped into one row, and media becomes an array of direct links when the post contains multiple downloadable files.