Cheap Telegram Channel Scraper - History & CSV
Pricing
$0.20 / 1,000 telegram post returneds
Cheap Telegram Channel Scraper - History & CSV
Cheap Telegram channel scraper: $0.20 per 1,000 returned posts, no start fee, platform usage included. Export public history, recent posts or a date range to CSV, JSON or Excel. Get text, dates, views, reactions and media URLs. No Telegram login required.
Pricing
$0.20 / 1,000 telegram post returneds
Rating
0.0
(0)
Developer
Monkey D. Scraping
Maintained by CommunityActor stats
0
Bookmarked
19
Total users
5
Monthly active users
6 hours ago
Last modified
Categories
Share
Cheap Telegram Channel Scraper — $0.20 per 1,000 posts
Export posts from public Telegram channels as structured data for spreadsheets, research, content analysis and AI pipelines. Collect recent posts, a date window, individual post URLs, or the history accessible through Telegram’s public preview.
No Telegram account, phone number, bot token or Telegram API key required.
$0.20 per 1,000 returned posts. No start fee or per-channel fee. Platform usage included.
Ready-to-run example tasks
Open an example below and save your own task in Console. Adjust the visible inputs, check the active Pricing tab and maximum cost per run, then run your copy. Export the dataset as JSON, CSV or Excel after checking the run summary. These examples are snapshots; scheduling them repeats the input and does not maintain a new-post checkpoint.
| Public task | Saved collection limits | Output and export | Post charge at saved limits |
|---|---|---|---|
| Telegram to CSV — Crypto News Starter | Cointelegraph + The Block; up to 25 posts per channel, 50 total | compact: one flat row per post with text, dates, views, reaction totals and source URLs. Export CSV, Excel or JSON. | Up to $0.010 for 50 posts |
| Telegram posts to Markdown for AI datasets | durov; up to 10 posts total | llm: one row per post with a document containing Markdown and a messageUrl source link. Export JSON for your knowledge base or RAG pipeline. | Up to $0.002 for 10 posts |
Each saved post costs $0.0002 at the current rate, with no start fee and platform usage included. Fewer available posts produce fewer rows and a lower post charge. Keep both post limits when copying the task; changing them can change the charge. Check the active Pricing tab and Maximum cost per run before starting your copy.
For the CSV starter, open the Posts dataset view and choose CSV or Excel from Export. For the Markdown example, use Markdown documents to inspect the text, or export JSON and read each row's document field. Markdown is formatted from the collected public post; no AI model is called. Check SUMMARY.quality and CHANNEL_REPORT before interpreting an empty output or treating the collection as complete.
Export Telegram posts in three steps
- Add Public channels and set Post limit per channel. The Console example uses 10.
- Choose Spreadsheet columns for CSV/Excel, Full records for structured JSON, or Markdown documents for indexing.
- Set Maximum cost per run, run the Actor, and open Output → Export.
The Console example:
{"channels": ["cointelegraph"],"maxMessagesPerChannel": 10,"outputPreset": "compact"}
Ten returned posts cost $0.002 at the published rate. Set Maximum cost per run in Run options for an additional spending limit. An empty result has no post charge.
Channel names, @usernames and public URLs such as https://t.me/cointelegraph are accepted.
Choose the export for your workflow
| Goal | Suggested input | Output |
|---|---|---|
| Open posts in Excel or Google Sheets | A small message limit for the first test | compact: flat columns |
| Analyze announcements, mentions or engagement | Date window and optional keyword filters | full: structured fields |
| Build a searchable knowledge base | Selected channels and a date window | llm: one Markdown document per post |
| Refresh your own database | One channel and its saved fromMessageId | Newer posts, with checkpoint managed by your workflow |
| Archive accessible channel history | Remove both message limits and date/ID filters | Check the coverage report before treating it as complete |
Scrape Telegram posts by date
{"channels": ["cointelegraph", "@durov"],"afterDate": "7 days","maxMessages": 1000,"maxMessagesPerChannel": 500,"outputPreset": "full","includeChannelInfo": true,"downloadMedia": false}
The message limits in this example can truncate a busy channel. Remove them when you need
the entire date window, and set an appropriate run budget and timeout.
afterDate and beforeDate accept ISO dates or relative expressions such as 7 days.
The filters include posts on the specified boundaries.
Use includeKeywords, excludeKeywords or regexFilters to narrow posts by text.
Use postUrls to request specific posts; leave channels empty when you only want those URLs.
Fetch new posts on subsequent runs
fromMessageId is an exclusive lower bound: 72469 means return IDs greater than
72469. The number below is an example checkpoint, not a current channel position.
{"channels": ["cointelegraph"],"fromMessageId": 72469,"outputPreset": "full","downloadMedia": false}
- Save the posts in your own database, deduplicating by
channelUsername+messageId. - Inspect
SUMMARYandCHANNEL_REPORTin the run’s key-value store. - Advance the channel’s checkpoint to the highest stored ID only after the requested range was fully collected and your destination successfully saved the results.
- Pass that checkpoint in the next run’s input.
A successful run status alone does not prove full coverage. Check for failed channels,
unreadable ranges, message or budget limits, and the channel’s stoppedBecause value.
range_complete or channel_start, with no unreadable ranges or run errors, indicates the
requested walk finished. If collection was interrupted or capped, keep the old checkpoint,
retry with sufficient limits, and deduplicate the repeated posts. Advancing to the newest ID
from a truncated run could skip older posts that still need to be collected.
Message IDs belong to individual channels. Keep a separate checkpoint and input per channel;
a single fromMessageId applies to every channel in the input.
Scheduling does not automatically update this input or maintain a checkpoint. Use your external workflow to read results and supply the next ID. For a ready-made stateful workflow, see Telegram New Posts Monitor & Channel Discovery below. Incremental collection finds newer IDs; it does not refresh edits, views or reactions on posts you already stored.
Telegram channel data you can export
Depending on what Telegram exposes publicly, records can include:
- Text, Markdown and rich-text entities.
- Publication time, message ID and source URL.
- Public view counts and reactions.
- Media URLs and available metadata for photos, videos, audio, documents and stickers.
- Albums, polls, link previews, replies and forwarded-post references.
- Channel name, description, subscriber count and verification when available.
Enable downloadMedia to also attempt saving available media files in the run’s key-value
store. Files that cannot be downloaded keep their source URL; media URLs can expire.
Leave it off when your workflow only needs text and links.
Every field in the export
| Field | What it holds |
|---|---|
channelUsername, channelName, channelUrl | Which channel the post came from |
messageId, messageUrl | Canonical identity of the post; also used to deduplicate |
publishedAt | Publication time in ISO 8601 UTC |
text, textLength, textMarkdown, entities | Message text as plain, Markdown, and typed offsets |
views, viewsText | View count as an integer, plus the abbreviation as shown |
reactions, reactionsTotal | One object per emoji with its count, plus the sum |
media | Typed array: photo, video, roundVideo, document, voice, audio, sticker — with URL, thumbnail, file name, size and duration |
isAlbum | Whether the row carries a multi-photo album |
poll | Question, quiz type, options and percentages |
linkPreview | Site name, title, description and image of the linked page |
forwardedFrom, replyTo | Source channel, message id and quoted preview |
author, isEdited, isServiceMessage | Post signature and status flags |
links, hashtags, mentions, cashtags | Everything extracted from the text |
channel | Subscribers, verification, description, avatar and channel counters |
scrapedAt | When the row was collected |
Unavailable fields may be null or empty. Counts converted from abbreviations such as 26.2K retain the public display’s precision; they are not exact private analytics.
Output formats and a sample record
- Full (
full): nested structured data for APIs and databases. - Compact (
compact): flat columns for CSV and spreadsheets. - LLM (
llm): Markdown documents for indexing and AI pipelines.
The dataset field schema describes all three presets. Preset-specific fields may be absent: hashtags is an array in full records and a space-separated string or null in compact records; document appears only in Markdown records. Posts with no visible text keep text: null. The common identity, date, text, engagement and extraction-time fields are always present, with null values where the source provides no value.
Illustrative excerpt from a full record; values are examples, not live channel metrics:
{"channelUsername": "examplechannel","messageId": 123,"messageUrl": "https://t.me/examplechannel/123","publishedAt": "2026-10-04T08:00:00.000Z","text": "A new product announcement","textMarkdown": "A new **product announcement**","views": 1200,"reactions": [{ "emoji": "🔥", "count": 5, "countText": "5" }],"reactionsTotal": 5,"media": [],"poll": null,"replyTo": null}
sortOrder: "oldestFirst" reverses returned posts within each channel. With a message limit,
the Actor still selects from the newest matching posts; this option does not request the
oldest posts in the channel or globally merge several channels by date.
Export accessible Telegram channel history
To request accessible history, clear both maxMessages and
maxMessagesPerChannel (use explicit null values in JSON to override Console defaults), and remove date and fromMessageId filters.
There is no fixed input post cap, but your budget, timeout, source availability and collection
limits can stop a run before it finishes.
Each run writes SUMMARY and CHANNEL_REPORT to its key-value store. The channel report
includes the covered message-ID ranges, reachedChannelStart, stoppedBecause and
unreadableRanges. Use these to distinguish a completed range from a partial export.
Deleted posts and content unavailable in the public preview cannot be recovered.
Collection uses parallel requests. Runtime varies with history size, channel availability, retries, filters and media downloads; there is no guaranteed completion time.
Pricing
| Event | Price |
|---|---|
| Returned post | $0.0002 |
| 1,000 returned posts | $0.20 |
| 10,000 returned posts | $2.00 |
| Starting a run | Free |
| Channel details | No additional charge |
Platform usage is included. Set Maximum cost per run in Run options to cap post charges. The Actor stops collecting when that allowance is exhausted. Check the run summary before advancing a checkpoint or treating an archive as complete.
Telegram scraper API, n8n, Make and Zapier
Export the dataset as JSON, CSV or Excel, or read it through the Apify API from your HTTP client, n8n, Make or another automation workflow. A schedule can start repeated runs; a finished-run webhook can trigger processing in your destination. Your integration manages result persistence, deduplication and any incremental checkpoint.
Limitations
- Public Telegram channel previews only; private channels and groups are unsupported.
- A channel without a readable public preview is reported as failed or unreadable.
- Missing public fields can be null or empty; abbreviated counts have limited precision.
- Discussion-group comments are not included.
- Deleted or unavailable posts and media cannot be reconstructed.
- Results reflect the public page when collected, not Telegram’s private analytics.
Related Actors
- Telegram Keyword Search & Channel Scraper — discover public posts and channels by keyword.
- Telegram New Posts Monitor — recurring feeds with saved task checkpoints.
Run budget and billing diagnostics
Small runs check their remaining post allowance before opening another channel and avoid speculative channel requests. An exhausted budget causes no new channel page requests. A successful HTTP response without recognizable public preview markup is reported as UNRECOGNIZED_PUBLIC_PAGE, rather than as an empty channel; that response is not retried. A recognizable preview with no posts can still be a valid empty result.
Set a maximum cost per run to cap post charges. SUMMARY.postsReturned counts posts successfully saved; chargedPosts counts only confirmed telegram-post charges. billingMode distinguishes active billing from runs without that event. If an active charge is only partially fulfilled, the run stops and savedPostsNotCharged reports the difference. An uncertain budget, storage failure or charging error stops further work, preserves a diagnostic summary and fails the run. Charges are never retried automatically. Start a new run instead of resurrecting a run with saved posts or uncertain billing.
Frequently asked questions
Can I scrape Telegram without an API key?
Yes. Enter a public channel username or URL. No Telegram account, phone number or API key is required.
How do I export Telegram messages to CSV or Excel?
Choose Spreadsheet columns (outputPreset: "compact"), run the Actor, and select CSV or Excel from the dataset’s Export menu.
Does full history include deleted or private posts?
No. It means history accessible through the public channel preview. Clear both post limits and date/ID filters, then check the coverage report for interruptions.
Are media files downloaded automatically?
No. Available media URLs and metadata are returned. Enable Download media files only when you also need available files stored with the run.
How much do 1,000 Telegram posts cost?
The published post charge is $0.20 for 1,000 returned posts. Starting a run and channel metadata have no additional charge; platform usage is included.
Coverage and data quality
Read SUMMARY.quality before interpreting an empty dataset. partial means a source error, a known coverage gap or an accepted row missing a required post ID, canonical link or publication timestamp. limited means collection was bounded by a selected limit, budget or collection scope. bounded means the attempted public scan ended without those signals; it does not guarantee every Telegram post is publicly available. These are factual checks, not a score or a promise of complete history.
recordsInspected counts accepted records examined by these checks; it is not a billing counter. missingRequiredFields counts unavailable identifiers, links and dates. optionalFieldsUnavailable counts absent text or views without treating media-only posts as invalid or filling missing values. A zero-row run has no row-level evidence of field completeness. Check existing errors and warnings as well.
CHANNEL_REPORT preserves known unreadable message-ID ranges. For explicit post URLs it also lists requestedPostIds, missingPostIds and notCheckedPostIds: an unseen post is not necessarily deleted, and an unattempted post is not a confirmed missing post. SUMMARY.channelsNotChecked lists channels skipped when collection stopped. Storage or billing errors remain separate from coverage signals.
Post identity and empty previews
Only posts belonging to the requested public channel are accepted. SUMMARY.sourcePostsIgnored counts parsed posts excluded because they belong to another channel; sourceMismatchPages counts affected parsed page responses. CHANNEL_REPORT includes the same counters per channel and reports UNEXPECTED_POST_CHANNEL in sourceErrorCodes. These are diagnostics, not returned posts or billable events.
A page containing only posts from other channels is a source error, not a confirmed empty channel or proof that older history has ended. On older history pages, the affected cursor is not retried in another collection wave and its range is reported as unreadable. Valid posts from mixed pages remain available, with partial coverage. A genuine empty public preview remains a separate case. Forwarded text and links to other channels inside a valid post are preserved.
Retry diagnostics
Public page reads retry recognized temporary HTTP and network errors, with backoff and at most four attempts. Access denials, certificate errors, unknown read errors and failed proxy preparation are not retried. An unrecognized response is not treated as an empty channel. This policy applies to public page reads; storage and billing are not retried.
SUMMARY.requests counts HTTP calls started, retries counts additional fetch attempts, and proxyRequests counts HTTP calls started with a proxy. SUMMARY.transport reports fetchAttempts, failedAttempts, retryableFailures and nonRetryableFailures. Fetch attempts include proxy preparation, so they can exceed HTTP calls. These counters are diagnostics, not returned posts, billable events or proof of complete coverage. An unsuccessful read does not incur a post event; the publisher may still incur platform costs.