Telegram Channel Scraper — History & CSV Export avatar

Telegram Channel Scraper — History & CSV Export

Pricing

$0.20 / 1,000 telegram post returneds

Go to Apify Store
Telegram Channel Scraper — History & CSV Export

Telegram Channel Scraper — History & CSV Export

Scrape public Telegram channel posts and accessible history to CSV, Excel, JSON or Markdown. Filter by date or keyword; collect text, views, reactions and media URLs. No Telegram login. $0.20/1K posts plus the scheduled start fee; platform included.

Pricing

$0.20 / 1,000 telegram post returneds

Rating

0.0

(0)

Developer

Monkey D. Scraping

Monkey D. Scraping

Maintained by Community

Actor stats

1

Bookmarked

39

Total users

8

Monthly active users

6 hours ago

Last modified

Security

Limited permissions

Share

Export posts from public Telegram channels to CSV, Excel or JSON: text, publication dates, views, reaction totals and source links, with available media URLs in the full records. Start with a channel name and 10 posts, or select a date window or individual post URLs. Historical exports cover the posts accessible through Telegram’s public preview; inspect the coverage report before treating a range as complete.

Stateless across runs: this Actor does not store or advance checkpoints. fromMessageId is an explicit input supplied by your own workflow for each channel; it is not saved monitoring state. Repeating the same input can return the same posts. Use the separate Telegram New Posts Monitor for automatic task checkpoints.

No Telegram account, phone number, bot token or Telegram API key required.

$0.20 per 1,000 returned posts. No per-channel fee. Platform usage included. See Pricing for the scheduled native start fee.

What can you use this Telegram channel scraper for?

  • News and crypto research: export posts from known public channels into a dated spreadsheet, with source links for verification.
  • Brand and competitor research: filter posts inside your selected channels by date or phrase, then compare the returned text, views and reactions. The Actor does not calculate sentiment.
  • AI knowledge bases: select Markdown documents to export post text with canonical source links for your indexing pipeline. No AI model is called.

Start with the small example below. Public channels only; private chats, member lists and discussion comments are not supported. Repeated runs are snapshots, not automatic new-post monitoring.

Is this the right Telegram scraper?

Use this Actor when you already know the public channels or post URLs you want to export. Choose Spreadsheet columns for CSV/Excel, or Markdown documents for a text-indexing workflow with links back to the posts.

  • Known channels → export: stay here; begin with one channel and 10 posts ($0.002 post charge; see Pricing for the scheduled start fee).
  • A keyword, but no channel list → discover: use Telegram Keyword Search. Discovery has its own pricing and coverage limits.
  • Only new posts across repeated runs → monitor: use Telegram New Posts Monitor. Reuse the same task/checkpoint according to its instructions.

This Actor exports a snapshot. Scheduling it does not automatically exclude posts collected by earlier runs.

Using keyword filters? Add a start date for a bounded first test. The post limit counts returned matches, not pages examined; a rare or absent term can scan many history pages before returning zero. Check SUMMARY.pagesFetched, filteredOut and coverage before treating an empty export as a complete history search.

Ready-to-run Telegram export examples

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 Channel Scraper — 10-post CSV starterCointelegraph; one channel, up to 10 posts totalcompact: one flat row per post with text, dates, views, reaction totals and source URLs. Export CSV, Excel or JSON.Up to $0.002 for 10 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, with platform usage included. The examples above show post charges; add the native start fee from 19 November 2026 (see Pricing). 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 Channels to scrape and set Maximum posts 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 run output also exposes Download CSV and Download Excel links for seven common columns: channel, post ID, publication date, text, views, reaction total and source URL. These exports use the posts already collected, with no additional scraping or post charge. Full records and Markdown remain available through the dataset export. Dataset access permissions still apply.

The Console example:

{
"channels": ["cointelegraph"],
"maxMessagesPerChannel": 10,
"outputPreset": "compact"
}

Ten returned posts have a $0.002 post charge; from 19 November 2026, the total at default memory is $0.00205, including the native start event. 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.

From a Telegram history export to a recurring feed

Channel Scraper exports a snapshot; Monitor keeps a separate checkpoint. There is no automatic transfer of your export position between the two Actors.

  1. Choose the same public channels in both tools. For a handoff with overlap, first save a new Monitor starter task, use initialRun: "baseline", keep resetState: false, and run it. Confirm the channels were checked without errors.
  2. Export the required history with Channel Scraper. Check SUMMARY and CHANNEL_REPORT for incomplete ranges before treating the export as complete.
  3. Run that same Monitor task again, then schedule it at a frequency suited to your channels. Check pending backlog and source errors after every run; do not overlap runs.
  4. Merge both datasets using channelUsername + messageId as the unique key. The overlap is intentional. Confirm your destination saved each dataset independently.

This reduces the handoff gap but does not guarantee recovery of posts absent from public previews or beyond the scan limits. Creating the baseline only after your export can miss posts published between those steps. Existing edits, views and reactions are not refreshed by the new-post feed.

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
Native Actor startFree until 19 November 2026, 10:14:58 UTC; then $0.00005 per memory unit
Channel detailsNo additional charge

The native apify-actor-start event is charged automatically: one unit up to and including 1 GB RAM, then one additional unit for each extra GB. At the default 256–512 MB, 10 posts cost $0.00205 and 40 posts cost $0.00805 after the change. Empty runs also incur the start fee. The Pricing tab shows the current and upcoming tariffs.

Platform usage is included. Set Maximum cost per run in Run options to cap total event 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.

Which Telegram Actor should I use?

Your goalRecommended ActorStart with an example
Find indexed public posts by keywordTelegram Keyword Search — discovery with literal matches in text or channel title Product mentions → CSV
Export recent posts or accessible historyTelegram Channel Scraper — date filters and CSV, JSON or Markdown layouts Known channels → CSV
Collect newly published posts repeatedlyTelegram New Posts Monitor — reuse the same saved task and checkpoint New posts → saved checkpoint

All three use public Telegram previews without a Telegram login. Private channels and deleted or unavailable posts are outside their coverage.

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, set an appropriate Maximum page requests and run budget, 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 post charge is $0.20 for 1,000 returned posts; channel metadata and platform usage are included. Until 19 November 2026 at 10:14:58 UTC, starting a run is free. After that, add the native $0.00005 start event per memory unit: $0.20005 total for 1,000 posts in one run at the default memory. See Pricing for memory scaling and empty runs.

When an export is empty or stops early

Open Run outcome and next step in Output. SUMMARY.outcome.code distinguishes no_matches, no_posts_in_range, empty_public_preview, source_incomplete, scan_limit, charge_limit and billing errors. The accompanying message explains the next step. A successful run status alone does not prove that the requested range was fully collected.

The default Maximum page requests is 100 for the whole run, shared across channels, date lookups and retries. It limits source work independently of returned posts and the maximum event charge. A rare keyword can exhaust this cap without returning any post. Set maxRequests explicitly (1–10,000) for a larger export; prefer a narrower date window first. A cap stop is reported as partial, never as complete history or proof of no matches. Do not advance your checkpoint on partial coverage.

For repeated snapshots, batch known channels into one run where practical and choose a collection interval that matches their posting frequency. If there are no new posts, wait before repeating the same request. Use the separate New Posts Monitor for managed checkpoints.

Optional media downloads default to 10 MiB per file and 25 MiB received per run. Set maxMediaFileBytes (up to 20 MiB) and maxMediaTotalBytes (up to 100 MiB) only when needed. Failed downloads count toward received bytes; a final streamed chunk can cross the limit. Oversized or failed files retain their source URL. Full records expose media[].downloadStatus; SUMMARY.media reports received bytes, saved, skipped and failed files. Text and post collection continue when a media file is skipped. Automatic retries and redirects are disabled for media downloads.

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.

Can I search all Telegram messages by keyword here?

No. This Actor starts from known public channels or post URLs. Its text filters select from the posts it reads; they do not discover channels or search all Telegram messages. Use the keyword-search Actor for indexed discovery.

Why can a successful run return fewer posts than requested?

The public preview may expose fewer posts, filters may exclude them, or a budget or collection limit may stop the run. Review SUMMARY.quality and CHANNEL_REPORT before assuming the export is complete. Missing reactions or other optional fields are not proof that their true value is zero.

Does Markdown output call an AI model?

No. It formats the collected post into a document with a source link. Summarization, embeddings and model inference belong in your downstream workflow and may have separate costs.

How do I get help with a failed export?

Open the Issues tab with the run ID, a public channel or post URL and the expected result. Include the relevant coverage warning without sharing credentials or private data.

Does the end date include the whole day?

Yes. For a date-only input, afterDate starts at 00:00:00 UTC and beforeDate ends at 23:59:59.999 UTC. Timestamps with a timezone preserve their exact instant. Relative months and years use calendar arithmetic, clamped to the last valid day when necessary. Invalid dates and inverted ranges stop before collection; posts without a valid date do not pass a date filter. This makes historical exports reproducible across timezones.

Real observed output excerpt

Reduced record from an owner verification run observed on 17 October 2026. Field values are retained from that observation and may have changed since then.

{
"channelUsername": "cointelegraph",
"messageId": 72711,
"messageUrl": "https://t.me/cointelegraph/72711",
"publishedAt": "2026-10-17T11:46:24.000Z",
"views": 4630,
"reactionsTotal": 93,
"scrapedAt": "2026-10-17T17:33:06.260Z"
}

This is the compact preset. Message text and media fields are omitted here. Numeric views and reaction totals are observations at collection time, not unique audience measurements. IDs and source URLs identify the post; this sample does not establish complete channel history.

Exact subscriber counts

Enable Fetch exact subscriber count with Include channel details to read the public profile once per channel with matching posts. Disabled by default. This extra request shares Maximum page requests and has no separate event fee. If unavailable or the budget is exhausted, the preview count is retained. subscribers uses the exact count when available; subscribersExact is otherwise null and subscribersSource identifies public_profile or public_preview. In full output these fields are nested under channel; compact output exposes them directly. subscribersText preserves the original abbreviated preview value. LLM output uses the selected count in the document. Counts can change between requests.