Cheap Telegram Channel Scraper - History & CSV avatar

Cheap Telegram Channel Scraper - History & CSV

Pricing

$0.20 / 1,000 telegram post returneds

Go to Apify Store
Cheap Telegram Channel Scraper - History & CSV

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

Monkey D. Scraping

Maintained by Community

Actor stats

0

Bookmarked

19

Total users

5

Monthly active users

6 hours ago

Last modified

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 taskSaved collection limitsOutput and exportPost charge at saved limits
Telegram to CSV — Crypto News StarterCointelegraph + The Block; up to 25 posts per channel, 50 totalcompact: 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 datasetsdurov; up to 10 posts totalllm: 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

  1. Add Public channels and set Post limit per channel. The Console example uses 10.
  2. Choose Spreadsheet columns for CSV/Excel, Full records for structured JSON, or Markdown documents for indexing.
  3. 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

GoalSuggested inputOutput
Open posts in Excel or Google SheetsA small message limit for the first testcompact: flat columns
Analyze announcements, mentions or engagementDate window and optional keyword filtersfull: structured fields
Build a searchable knowledge baseSelected channels and a date windowllm: one Markdown document per post
Refresh your own databaseOne channel and its saved fromMessageIdNewer posts, with checkpoint managed by your workflow
Archive accessible channel historyRemove both message limits and date/ID filtersCheck 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
}
  1. Save the posts in your own database, deduplicating by channelUsername + messageId.
  2. Inspect SUMMARY and CHANNEL_REPORT in the run’s key-value store.
  3. 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.
  4. 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

FieldWhat it holds
channelUsername, channelName, channelUrlWhich channel the post came from
messageId, messageUrlCanonical identity of the post; also used to deduplicate
publishedAtPublication time in ISO 8601 UTC
text, textLength, textMarkdown, entitiesMessage text as plain, Markdown, and typed offsets
views, viewsTextView count as an integer, plus the abbreviation as shown
reactions, reactionsTotalOne object per emoji with its count, plus the sum
mediaTyped array: photo, video, roundVideo, document, voice, audio, sticker — with URL, thumbnail, file name, size and duration
isAlbumWhether the row carries a multi-photo album
pollQuestion, quiz type, options and percentages
linkPreviewSite name, title, description and image of the linked page
forwardedFrom, replyToSource channel, message id and quoted preview
author, isEdited, isServiceMessagePost signature and status flags
links, hashtags, mentions, cashtagsEverything extracted from the text
channelSubscribers, verification, description, avatar and channel counters
scrapedAtWhen 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

EventPrice
Returned post$0.0002
1,000 returned posts$0.20
10,000 returned posts$2.00
Starting a runFree
Channel detailsNo 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.

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.