Telegram Channel Scraper avatar

Telegram Channel Scraper

Pricing

Pay per event

Go to Apify Store
Telegram Channel Scraper

Telegram Channel Scraper

Scrape public Telegram channels without login or API key: message text, date, views, reactions, media, link previews, forwards, plus channel profile with subscribers. Keyword search inside a channel. Pay-per-result.

Pricing

Pay per event

Rating

0.0

(0)

Developer

NanoScrape

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

10 days ago

Last modified

Categories

Share

Telegram Channel Scraper - Public Posts and Channel Info

Scrape public Telegram channels without a login, API key or phone number. For each channel you get the messages (text, date, views, reactions, media, link previews, forwards, links, hashtags) and, if you want, the channel profile (title, description, subscribers, photo, verified flag). Search for a keyword inside a channel or go back in time up to a date.

What data can you extract?

Message rows (entry_type: "message")

  • Message ID, direct message URL, channel name and title
  • Publication date (ISO 8601, UTC), edited flag, author signature
  • Plain text and HTML text, external links, hashtags, @mentions
  • View count (as shown by Telegram, rounded for large numbers)
  • Reactions with count (emoji or custom emoji ID, paid star reactions)
  • Media: photos, videos, round videos, voice messages, documents, stickers, polls, with URLs where Telegram publishes them
  • Link preview card (URL, site name, title, description, image)
  • Forwarded-from source and reply-to reference

Channel rows (entry_type: "channel", optional)

  • Title, description (plain and HTML), links in the description
  • Subscriber count (rounded as shown by Telegram), counts of photos, videos, files and links
  • Verified flag, channel photo URL

Telegram does not show reply counts or forward counts on the public web preview, so those fields are not available.

Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client, including Claude Desktop, Claude.ai, Cursor, VS Code, LangChain and LlamaIndex.

{
"mcpServers": {
"apify": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.apify.com?tools=santamaria-automations/telegram-scraper",
"--header",
"Authorization: Bearer <APIFY_TOKEN>"
]
}
}
}

Example prompt: "Use telegram-scraper to get the last 50 posts of the durov channel and summarise the topics with view counts."

How to use

{
"channels": ["telegram", "@durov", "https://t.me/bbcnews"],
"maxMessages": 100,
"searchQuery": "",
"includeChannelInfo": true
}

An empty input {} also works and runs the defaults (the telegram channel, 20 messages, plus the channel profile).

Input parameters

ParameterTypeDefaultDescription
channelsarray["telegram"]Channel names: name, @name or a t.me link
maxMessagesinteger20Maximum messages per channel, newest first (1-10,000)
searchQuerystringemptyOnly messages containing this word or phrase, searched inside each listed channel
dateFromstringemptyStop at messages older than this date (YYYY-MM-DD)
includeChannelInfobooleantrueAdd one profile row per channel

Limits

  • Only channels with a public web preview work. Private channels, invite links (t.me/+...) and channels that disabled the preview are reported and skipped.
  • Telegram offers no keyword search across all channels without a login. searchQuery searches inside the channels you list.
  • Large counters (views, subscribers, reactions) are rounded by Telegram, for example 1.59M.

What you get

Message rows and channel profile rows share one table; fields marked "(channel rows)" are only filled for profile rows, message fields are empty (null) on profile rows.

FieldTypeDescription
entry_typestringmessage or channel (channel profile row, only if includeChannelInfo)
channelstringChannel username without @
channel_titlestringChannel display name
channel_urlstringChannel URL
idintegerMessage ID, unique within the channel (message rows)
message_urlstringDirect link to the message
datestringPublication time (ISO 8601, UTC)
textstringPlain text of the message
text_htmlstringMessage text as HTML (formatting and links kept)
views_textstringView count as shown by Telegram
author_signaturestringPost author signature if the channel shows one
editedbooleanTrue if the message was edited
forwarded_fromstringOriginal source of a forwarded message
forwarded_from_urlstringLink to the original source
reply_to_urlstringMessage this one replies to
reply_to_message_idintegerID of the replied message
reply_to_textstringPreview of the replied message
has_mediabooleanTrue if the message has media
media_typestringType of the first media item: photo, video, round_video, voice, document, sticker, poll, location
mediaarrayAll media items with type, url, thumbnail_url, title, duration, size_text, poll_question, poll_options
link_previewobjectLink preview card: url, site_name, title, description, image_url
linksarrayExternal links in the message text
hashtagsarrayHashtags in the message text
mentionsarray@mentions in the message text
reactionsarrayReactions with emoji, custom_emoji_id, paid, count, count_text
search_querystringKeyword used for the in-channel search
titlestringChannel title (channel rows)
descriptionstringChannel description (channel rows)
description_htmlstringChannel description as HTML (channel rows)
subscribersintegerSubscriber count, rounded as shown by Telegram (channel rows)
subscribers_textstringSubscriber count as shown (channel rows)
photos_countintegerNumber of photos in the channel (channel rows)
videos_countintegerNumber of videos in the channel (channel rows)
files_countintegerNumber of files in the channel (channel rows)
links_countintegerNumber of links in the channel (channel rows)
verifiedbooleanVerified channel (channel rows)
photo_urlstringChannel photo URL (channel rows)
scraped_atstringWhen the row was scraped

Output example

{
"entry_type": "message",
"channel": "durov",
"channel_title": "Pavel Durov",
"id": 548,
"message_url": "https://t.me/durov/548",
"date": "2026-09-11T16:04:02+00:00",
"text": "Telegram has become the sponsor of Codeforces ...",
"views": 3550000,
"views_text": "3.55M",
"author_signature": "Pavel Durov",
"has_media": false,
"link_preview": {"url": "https://codeforces.com/blog/entry/156620", "site_name": "Codeforces", "title": "Telegram Returns as Title Sponsor of Codeforces!"},
"links": ["https://codeforces.com/blog/entry/156620"],
"reactions": [{"emoji": null, "custom_emoji_id": "5399847211989246390", "paid": false, "count": 36300, "count_text": "36.3K"}],
"scraped_at": "2026-10-21T15:39:33Z"
}

Fields Telegram does not publish for a message are null (or an empty list).

Pricing

Pay per result. You are charged one start event per run and one event for every row saved to the dataset.

EventPriceWhen
telegram-start$0.005Once per run, right before the first row is saved
telegram-message-result$0.0012Per message saved ($1.20 per 1,000 messages)
telegram-channel-result$0.002Per channel profile row saved (only if includeChannelInfo is on)

Runs without results cost nothing. Duplicates are never saved or charged twice, and a restarted run does not charge rows it already saved.

Performance

  • Speed: about 20 messages per page and one page per 1-2 seconds, so roughly 1,000 messages per minute
  • Transfer: about 1.2 MB per 1,000 messages

Tips

  • Use dateFrom for daily or weekly monitoring so you only collect new posts
  • Set includeChannelInfo to false if you only need the messages
  • Combine several channels in one run; the start event is charged once

Data protection

This actor reads only information that is publicly visible on the Telegram web preview of public channels. Messages, author signatures, forwarded-from names and linked profiles can contain personal data of named individuals. You are responsible for having a lawful basis (for example legitimate interest under Article 6 GDPR) for the way you store and use that data, and for complying with GDPR, national data-protection laws, unfair competition acts and Telegram's terms. Review your use case with a qualified data protection officer before large-scale processing or outreach. Do not use scraped data to contact people who have not agreed to it where the law requires consent.