Enterprise level - Telegram Keyword Search & Channel Scraper avatar

Enterprise level - Telegram Keyword Search & Channel Scraper

Pricing

from $1.00 / 1,000 telegram posts

Go to Apify Store
Enterprise level - Telegram Keyword Search & Channel Scraper

Enterprise level - Telegram Keyword Search & Channel Scraper

Search public Telegram posts by keyword or collect known channels from $1 per 1,000 saved posts, plus start and applicable discovery fees. Export text, dates, source links, views and media references to JSON, CSV or Excel. No Telegram login or API key required.

Pricing

from $1.00 / 1,000 telegram posts

Rating

0.0

(0)

Developer

Monkey D. Scraping

Monkey D. Scraping

Maintained by Community

Actor stats

1

Bookmarked

36

Total users

10

Monthly active users

9 hours ago

Last modified

Share

Cheap Telegram Keyword Search & Channel Scraper

Search public Telegram posts by keyword, scrape channels you already know, or combine both in one dataset. Export text, dates, source links, available views, reactions and media references to JSON, CSV or Excel for brand research, news analysis and OSINT. No Telegram account or API key required.

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 taskUse caseExpected output
Scrape recent crypto news from TelegramCollect posts from two known public crypto channels published within the past seven daysUp to 50 posts with dates, text and source URLs; channel and total limits can truncate the date window
Search Bitcoin posts on public Telegram — StarterTry one keyword with Quick discovery and a five-post limitUp to five literal keyword matches in post text or channel title; public indexing can yield no matches

Example costs at the saved settings

Both examples use 128 MB of memory and include platform usage in the event price. These amounts cover one Actor start and the saved post limits, with one verified discovery page for the one-keyword Quick starter:

ExampleActive event charges since October 18, 2026 at 09:00:21 UTC
Crypto news: up to 50 channel posts, no discoveryUp to $0.05005
Bitcoin starter: one verified page and up to five postsUp to $0.01005
Bitcoin starter: one verified page confirming no results$0.00505

These are event-charge calculations, not a promise that every run finds posts. Fewer saved posts reduce the post charge. A failed or unverified search page has no discovery charge; the start event still applies. The starter's saved $0.02 run budget is a spending limit, not a fixed fee. Changing keywords, coverage, post limits or memory changes the calculation. Check the active Pricing tab before running.

The keyword starter displays only the keyword and total post limit. Its saved setup uses Quick discovery, no context posts, no media downloads and a $0.02 maximum cost per run. Fees depend on the active Pricing tab: verified keyword pages can be billed even when they return no posts. The existing crypto-news task collects known channels without keyword discovery.

Search Telegram posts in four steps

  1. Choose Scraping mode: Keyword search for topic discovery, Channel scraping for known sources, or Both.
  2. Fill the matching Keywords or Channels field. A focused mode ignores the other source type and reports a warning if it is filled.
  3. Set Total post limit. Start with 5 and Quick coverage, as prefilled in the Console. Existing saved tasks keep their own settings.
  4. Set Maximum cost per run, start the Actor, and open Output. Choose an export format from Export.

For a keyword-only run, use this input:

{
"collectionMode": "keyword",
"keywords": ["bitcoin"],
"channels": [],
"maxResults": 20
}

Results depend on public availability and may be empty. The post limit does not cap discovery fees. Check Pricing and the run summary before scaling up.

Scrape a channel without keyword discovery

{
"collectionMode": "channel",
"keywords": [],
"channels": ["cointelegraph"],
"maxResults": 20
}

When switching a copied or saved task between keywords and channels, check Scraping mode at the top of the form. Choose channel-only and clear Keywords for direct channel collection; choose keyword-only and clear Public channels for keyword research. A focused mode ignores the other source type. For API task overrides, include collectionMode, keywords and channels, as in these examples, so the saved mode or unused sources do not carry over. Existing date and phrase filters still apply unless you change them.

Known channels avoid keyword discovery fees. For large history exports, use Telegram Channel Scraper.

When to use it

This Actor is designed for one-time public Telegram data extraction rather than ongoing monitoring. It is useful when you need a current, reproducible dataset for:

  • Telegram brand monitoring and competitor research
  • News, market, and policy research
  • Public-source journalism and OSINT workflows
  • Channel archiving for analysis, audit, or compliance research
  • Crypto, finance, technology, and community research
  • Multilingual topic discovery using country and language preferences

For a repeated, stateful “what is new since the last run?” workflow, use a dedicated monitoring Actor rather than treating this extractor as a scheduler.

Telegram keyword search or channel scraping?

1. Discover public posts by keyword

Add one or more keywords when the relevant channels are not yet known. The Actor finds publicly indexed Telegram references and returns posts with a literal match in the post text or public channel title by default. Open Keyword search options and choose Quick, Standard, or Thorough coverage to match your time and breadth needs. Country and language preferences help focus discovery, but they do not establish the author’s location or classify a post’s language.

Strict matches and optional context

The default keyword output is intentionally strict: every keyword_match row contains at least one requested keyword in its public post text or public channel title. A channel-title match can include posts without the term in their text, and signatures can also match. This is literal matching, not a guarantee of topical relevance. Choose Where must the keyword appear? → Post text only in Keyword search options for narrower results. Keep Include nearby posts without a keyword off when every discovery result must match the post text.

Enable Include nearby public context posts only when you also need surrounding channel material. Those rows are returned as channel_context, with matchedKeywords: []; they are never represented as literal keyword hits.

2. Collect known public channels

Add a channel username such as cointelegraph, an @username, or a public Telegram channel URL. The Actor collects publicly accessible posts until the date boundary or the run’s global result cap is reached.

3. Combine both in one run

Use keywords and channels together when you need broad discovery alongside authoritative sources. Canonical post URLs are deduplicated, so the same public post is emitted at most once.

How a hybrid run uses the result cap

maxResults is always one global limit. If both sources are present, use Priority when both sources are used to make the allocation explicit:

PriorityUse it whenEffect if the global cap is reached
Known channels firstYour selected sources are the most important evidence.Direct channel collection gets capacity before keyword-discovered channels.
Keyword discovery firstBroad topic discovery matters more than source coverage.Keyword-discovered channels get capacity before direct channel collection.

You can also set optional per-keyword and per-channel limits to prevent one search term or high-volume channel from using all available capacity. Neither setting changes canonical deduplication.

Input guide

InputUse it for
keywordsTopic, brand, product, organization, event, or phrase discovery across public Telegram content.
channelsDirect collection from public channel usernames or URLs.
collectionModeGuided choice: automatic, keyword-only, channel-only, or hybrid.
afterDate / beforeDateInclusive date boundaries: choose a date or use a relative value such as 7 days.
countryCodeOptional ISO 3166-1 alpha-2 preference for keyword discovery.
languageCodeOptional ISO 639-1 preference for keyword discovery.
discoveryCoverageQuick, Standard, or Thorough keyword discovery breadth. Standard is the balanced default.
maxResultsOne global maximum for unique posts from all sources in the run.
maxResultsPerKeywordOptional balance limit for verified matching posts from one input keyword.
sourcePriorityExplicit allocation choice for a combined run that reaches its global cap.
maxResultsPerChannelOptional fairness cap for one channel within the global maximum.
includeContextPostsOptional, clearly labelled nearby public channel posts; disabled by default.
includeKeywords / excludeKeywordsSimple phrase filters applied to public post text and public channel title.
regexFiltersOptional advanced text filters using JavaScript-compatible regular expressions.
downloadMediaOff by default. Enable only when you need available public media files stored with the run.

Country and language preferences

For keyword discovery, you can optionally enter a two-letter country code such as IT or US, and a two-letter language code such as it or en. These fields guide discovery toward a regional and linguistic context; they are not strict filters and do not prove a post’s country of origin or language.

Use them together when it helps your research. For example, countryCode: "IT" with languageCode: "it" is a reasonable starting point for Italian-language topic discovery. Direct collection from a known public channel does not depend on either preference.

Example inputs

Public Telegram keyword research

{
"collectionMode": "keyword",
"keywords": ["bitcoin", "crypto"],
"channels": [],
"afterDate": "14 days",
"countryCode": "it",
"languageCode": "it",
"discoveryCoverage": "standard",
"maxResultsPerKeyword": 100,
"maxResults": 100,
"downloadMedia": false
}

Scrape known public channels

{
"collectionMode": "channel",
"keywords": [],
"channels": ["cointelegraph", "https://t.me/durov"],
"afterDate": "7 days",
"maxResults": 250,
"downloadMedia": false
}

Combine discovery and direct collection

{
"collectionMode": "hybrid",
"keywords": ["open source security"],
"channels": ["cointelegraph"],
"sourcePriority": "keywordsFirst",
"afterDate": "7 days",
"includeKeywords": ["advisory", "patch"],
"excludeKeywords": ["giveaway"],
"maxResults": 150
}

Telegram data you can export

The default dataset contains one row per canonical public Telegram post. Each record includes source-channel identity, public channel title and description when exposed, canonical channel and post URLs, message ID, publication time when exposed, post text or caption, public counters when reliably available, structured public reactions by emoji and displayed count, media references, links, tags, mentions, matched input keywords, a clear matchType, and collection provenance.

The Actor deliberately distinguishes “not available” from “zero”:

  • null means the public page did not reliably expose a value.
  • An empty array means no value was extracted from the public post representation; it is not a claim about private or deleted content.
  • Textless posts retain text: null; no author, engagement figure, date, or media type is invented.

The default key-value store also contains SUMMARY, with discovered channels, examined posts, verified keyword matches, optional context posts, deduplication, and isolated non-sensitive errors. A successful run can validly return zero rows.

CLI, API, and MCP-ready contract

The input schema, output schema, dataset schema, and README use the same field names and meanings. This makes the Actor straightforward to configure in the Apify Console, API, CLI, and Apify MCP server. An agent can determine the required source inputs, inspect the expected dataset fields before a run, and retrieve the post dataset and SUMMARY after it finishes.

The Actor itself does not use an AI model. “MCP-ready” here means that external AI agents can discover and call a well-described Apify Actor tool.

Telegram scraper API, n8n, Make and Zapier

Read the default dataset and SUMMARY through the Apify API or webhooks. The standard Actor result format can also be consumed by compatible automation platforms such as n8n, Make, and Zapier, as well as your own JavaScript, TypeScript, Python, spreadsheet, or data-warehouse workflow.

The canonical public post URL makes downstream linking and deduplication straightforward. Integration availability and configuration remain the responsibility of the destination platform and the user’s account.

Coverage and responsible use

This Actor handles public material only. It cannot access private channels, invite-only channels, login-protected material, deleted posts, or content that is not publicly available. Keyword discovery depends on public indexing, so it is not a guarantee of complete, real-time, or exhaustive Telegram coverage.

Use the Actor in accordance with applicable law, platform rules, and your organization’s policies. Do not use it to infer identities, location, intent, or engagement values that the public source does not expose.

FAQ

Do I need a Telegram login or API key?

No. The Actor does not ask the user for Telegram credentials.

Can I search keywords and scrape channels at the same time?

Yes. Both sources can be included in one stateless run and are deduplicated by canonical post URL.

What does the country or language option do?

They are optional discovery preferences. They help focus keyword discovery, but do not certify where a post came from or which language it uses.

Can I use “7 days” instead of a calendar date?

Yes. The date fields accept a calendar date or a relative value such as 7 days, 2 weeks, 1 month, or 1 year.

The Actor returns at most maxResults unique posts. Choose source priority to decide which source is processed first, and optionally add a per-channel cap for a more balanced dataset.

Why is a field null?

The value was not reliably available on the public source. The Actor does not guess missing metadata.

Why does matchType matter?

keyword_match is a verified literal match for one or more input keywords. channel_context is an explicitly requested nearby public post and may not contain a keyword. channel_post came from a public channel you entered directly.

Are media files downloaded automatically?

No. The Actor returns public media references when available. Media download is disabled by default.

Does this Actor monitor new posts over time?

No. It is a stateless extractor for one-time collection. Use a stateful monitoring workflow when you need checkpoints and only-new-post detection.

Pricing

The active public plan charges $0.001 per saved post, $0.005 per verified keyword discovery page, plus $0.00005 per Actor start event (minimum one event, then one per GB of memory). Platform usage is included. Check the live pricing panel for the rates applicable to your run.

Scheduled keyword discovery pricing

The keyword discovery page fee has been active since October 18, 2026 at 09:00:21 UTC. Always check the live pricing panel for the rates applicable to your run. A confirmed empty search is a completed discovery page. Unverified responses and failed requests do not incur this discovery event. Collecting directly from known channels does not incur a discovery fee.

The completed discovery evidence is available in the default key-value store under DISCOVERY; SUMMARY.billing explains verified pages and billing mode. Discovery is billed only when this event is included in the run's active pricing. Check the live pricing panel before starting. In preview mode no discovery event is charged. A preview total is an estimate, not a platform invoice.

At these rates, a run with one verified discovery page and five saved posts would cost $0.01005 at up to 1 GB of memory. A verified empty search would cost $0.00505. Additional discovery pages add $0.005 each. Actor start is charged once per GB of memory, with a minimum of one event. Set a maximum cost per run to keep spending within your budget; when discovery billing is active, the Actor stops further work when it cannot bill another page or post within that limit.

maxResults limits saved posts. The Actor collects and saves posts after each verified search page, then stops further discovery when the global result cap is reached. A per-keyword cap also stops further pages for that keyword. With channels-first priority, direct channels are collected before keyword discovery and can satisfy the cap without any search. Large keyword lists with few matching posts can still require substantial search work: use focused batches and set a run budget. Keyword metadata reflects the searches completed before a post was saved; a saved post is not charged or emitted again when a later keyword also matches it.

Restart behavior

When discovery billing is active, automatic resume is not supported after discovery evidence has been saved. A resurrected run stops with DISCOVERY_RESTART_BLOCKED before repeating discovery or charging for it again. Existing DISCOVERY and dataset records remain available. Start a new run when a new extraction is intended; a new run is separate work with a separate budget.

If discovery billing or evidence storage fails, work stops with DISCOVERY_BILLING_FAILED. Inspect the previous run before starting another: an uncertain billing response is not retried by this Actor.

Which Telegram Actor should I use?

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

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

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.

A login, challenge or unrelated HTML response without recognized public-preview markup produces UNRECOGNIZED_PUBLIC_PAGE; it is not confirmed empty and is not cached. channelScans lists attempted channel contexts, pages read and stop reasons; repeated pages and the history safety cap are partial coverage. channelsNotChecked lists direct channel inputs skipped because collection stopped. Keyword results depend on the public index and the selected discovery scope, and are always bounded.

Post identity and selected channels

Each parsed post must belong to the channel whose public preview was requested. Posts from other channels are excluded before keyword matching, result limits, pagination and saving. SUMMARY.errors reports UNEXPECTED_POST_CHANNEL, and coverage is partial. A preview containing only posts from other channels is a source error, not a confirmed empty channel.

SUMMARY.channelPages.sourcePostsIgnored counts excluded parsed posts; sourceMismatchPages counts affected page loads. Reusing a cached page for another keyword does not count those exclusions again. These are diagnostic counters, not billable events. Forwarded text and links to other channels inside a valid post are preserved.

Retry diagnostics

Public reads retry only recognized temporary HTTP or network errors, with at most three attempts and backoff. Authentication, proxy authorization, certificate, configuration, storage and billing failures are not retried. A successful response that cannot be verified is not retried or treated as a confirmed empty search. Earlier verified results remain available if a later search page fails.

SUMMARY.discoveryTransport reports pagesAttempted, fetchAttempts, retries, failedAttempts, retryableFailures and nonRetryableFailures. Fetch attempts include preparation of a search request; SUMMARY.discoveryHttpRequests counts only HTTP calls started after proxy preparation. These counters describe work attempted, not successful results or a proxy invoice. DISCOVERY and SUMMARY.billing report verified pages separately. A verified logical page is charged once when discovery billing is active, even if a read needed more than one attempt. Failed attempts do not incur the discovery event. The maximum customer charge does not guarantee a cap on every infrastructure cost incurred by the publisher.

How are duplicate keywords and date filters handled?

Repeated keywords, including letter-case variants, trigger one discovery sequence per unique term. Date-only values use UTC: afterDate starts at 00:00:00 and beforeDate ends at 23:59:59.999. Timestamps with an explicit timezone retain that instant. Relative months and years use calendar arithmetic, clamped to the last valid day when necessary. Invalid dates or a start later than the end stop collection with an input error. Undated posts are excluded when a date filter is active.

Why did this post match my keyword?

matchedTextKeywords lists the discovery terms found literally in the public post text or caption. matchedChannelKeywords lists terms found in the public channel title. matchedKeywords contains the terms accepted by your selected scope. These fields are also included in the dataset table and exports.

The default keywordMatchScope: "textOrChannel" preserves existing behavior. Choose "postText" to exclude channel-title-only matches from keyword results. For example, a post saying “Market update” in a channel titled “Bitcoin News” matches bitcoin in the default mode, but is excluded in postText mode with context disabled. A signature containing bitcoin still counts as a text match; this is not semantic classification. Phrases must occur within one field, never across the boundary between post text and channel title.

If includeContextPosts is true, unmatched nearby posts may still be included as channel_context with empty matchedKeywords; the evidence columns can still show a title match rejected by postText scope. Direct-channel collection remains unfiltered by this discovery option. Inspect SUMMARY.keywordMatchScope to confirm the selected mode.

{
"collectionMode": "keyword",
"keywords": ["bitcoin"],
"channels": [],
"keywordMatchScope": "postText",
"includeContextPosts": false,
"discoveryCoverage": "quick",
"maxResults": 5
}

Fewer accepted posts do not reduce the work needed to verify a discovery page. The applicable page fee can still apply when no posts pass this filter; set a run budget.

Why can a keyword search take longer than a channel export?

Keyword search must discover public sources before reading matching posts. Its duration varies with source availability; requesting fewer posts does not eliminate that initial work. If you already know the channels, choose Channel scraping to collect directly. Use Quick for a smaller discovery scope; it does not guarantee a fixed response time or complete coverage.

SUMMARY.performance reports elapsed processing time, time to the first confirmed dataset write (null if none), and aggregate time spent on discovery, channel reads, optional media and output writes. Times are milliseconds and exclude container startup. Stage times exclude work outside those stages and should not be added as an end-to-end runtime guarantee. These diagnostics contain no request URLs or credentials. They do not alter pricing or result selection.

Real observed output excerpt

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

{
"channelUsername": "bitcoinbullets",
"messageId": "17316",
"messageUrl": "https://t.me/bitcoinbullets/17316",
"publishedAt": "2026-10-08T03:38:47.000Z",
"views": "4.92K",
"matchedKeywords": [
"bitcoin"
],
"matchedTextKeywords": [
"bitcoin"
],
"matchedChannelKeywords": [
"bitcoin"
],
"matchType": "keyword_match",
"discoveredBy": "keyword",
"scrapedAt": "2026-10-18T14:10:10.306Z"
}

Post text and media are omitted here. Both text and channel fields matched this keyword in the observed record; a channel match alone must not be treated as a text match. The formatted views string is preserved. Search discovery is not an exhaustive search of Telegram.