Telegram Channel Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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
| Parameter | Type | Default | Description |
|---|---|---|---|
channels | array | ["telegram"] | Channel names: name, @name or a t.me link |
maxMessages | integer | 20 | Maximum messages per channel, newest first (1-10,000) |
searchQuery | string | empty | Only messages containing this word or phrase, searched inside each listed channel |
dateFrom | string | empty | Stop at messages older than this date (YYYY-MM-DD) |
includeChannelInfo | boolean | true | Add 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.
searchQuerysearches 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.
| Field | Type | Description |
|---|---|---|
entry_type | string | message or channel (channel profile row, only if includeChannelInfo) |
channel | string | Channel username without @ |
channel_title | string | Channel display name |
channel_url | string | Channel URL |
id | integer | Message ID, unique within the channel (message rows) |
message_url | string | Direct link to the message |
date | string | Publication time (ISO 8601, UTC) |
text | string | Plain text of the message |
text_html | string | Message text as HTML (formatting and links kept) |
views_text | string | View count as shown by Telegram |
author_signature | string | Post author signature if the channel shows one |
edited | boolean | True if the message was edited |
forwarded_from | string | Original source of a forwarded message |
forwarded_from_url | string | Link to the original source |
reply_to_url | string | Message this one replies to |
reply_to_message_id | integer | ID of the replied message |
reply_to_text | string | Preview of the replied message |
has_media | boolean | True if the message has media |
media_type | string | Type of the first media item: photo, video, round_video, voice, document, sticker, poll, location |
media | array | All media items with type, url, thumbnail_url, title, duration, size_text, poll_question, poll_options |
link_preview | object | Link preview card: url, site_name, title, description, image_url |
links | array | External links in the message text |
hashtags | array | Hashtags in the message text |
mentions | array | @mentions in the message text |
reactions | array | Reactions with emoji, custom_emoji_id, paid, count, count_text |
search_query | string | Keyword used for the in-channel search |
title | string | Channel title (channel rows) |
description | string | Channel description (channel rows) |
description_html | string | Channel description as HTML (channel rows) |
subscribers | integer | Subscriber count, rounded as shown by Telegram (channel rows) |
subscribers_text | string | Subscriber count as shown (channel rows) |
photos_count | integer | Number of photos in the channel (channel rows) |
videos_count | integer | Number of videos in the channel (channel rows) |
files_count | integer | Number of files in the channel (channel rows) |
links_count | integer | Number of links in the channel (channel rows) |
verified | boolean | Verified channel (channel rows) |
photo_url | string | Channel photo URL (channel rows) |
scraped_at | string | When 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.
| Event | Price | When |
|---|---|---|
telegram-start | $0.005 | Once per run, right before the first row is saved |
telegram-message-result | $0.0012 | Per message saved ($1.20 per 1,000 messages) |
telegram-channel-result | $0.002 | Per 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
dateFromfor daily or weekly monitoring so you only collect new posts - Set
includeChannelInfotofalseif you only need the messages - Combine several channels in one run; the start event is charged once
Related actors
- Instagram Scraper - posts and profiles from Instagram.
- TikTok Search Scraper - videos and creators from TikTok.
- Reddit Scraper - posts and comments from Reddit.
- YouTube Channel Scraper - channel data from YouTube.
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.