Telegram Channel Scraper: Posts, Views & Reactions
Pricing
from $6.80 / 1,000 results
Telegram Channel Scraper: Posts, Views & Reactions
Scrape posts and metadata from any public Telegram channel: text, publish date, view count, media, reactions, forwards, links and subscriber stats. Export to JSON, CSV or Excel. No login or API key.
Pricing
from $6.80 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Telegram Channel Scraper
Here is one real result, with every field a post record returns:
{"thumbnail": "https://cdn1.telesco.pe/file/vMsNFMSndJw-Nb8U-JA0gVKYgiJMQBNhllnhk0vB0Ht ... [URL trimmed for brevity; the real field returns the full signed URL]","type": "post","channel": "telegram","channelTitle": "Telegram News","id": 453,"url": "https://t.me/telegram/453","text": "350 Million GIFs. The GIF panel now contains over 350 million GIFs in 36 languages. Your Telegram GIF searche ... [text trimmed for brevity; the real field returns the full post text]","author": "Telegram News","datetime": "2026-07-19T17:58:17+00:00","views": 1180000,"viewsLabel": "1.18M","mediaType": "video","mediaUrl": "https://cdn1.telesco.pe/file/e07208aa9b.mp4?token=AxV7Ou6RhKX2RJn6mBOqqZ ... [signed URL trimmed for brevity]","mediaThumbnail": "https://cdn1.telesco.pe/file/vMsNFMSndJw-Nb8U-JA0gVKYgiJMQBNhllnhk0vB0Ht ... [URL trimmed for brevity]","mediaUrls": ["https://cdn1.telesco.pe/file/e07208aa9b.mp4?token=... [trimmed]"],"videoDuration": "0:09","documentTitle": null,"forwardedFrom": null,"forwardedFromUrl": null,"replyToUrl": null,"isForwarded": false,"linkPreview": null,"links": ["https://t.me/telegram/450", "https://t.me/telegram/451", "... [trimmed]"],"hashtags": null,"reactions": null,"totalReactions": null,"observedAt": "2026-08-10T14:33:08.021Z","error": null}
The thumbnail, text, media URLs and links values above are trimmed to keep this example readable; the actor returns the full text, signed CDN URLs and complete arrays. All other values are the exact record from a live run.
The most complete Telegram channel scraper available. It returns a channel-metadata record (subscribers, verified status, media counts) plus one record per post with the text, author, views, media (photo, video, document with direct CDN URLs), link previews, reactions and forwarding details, and it lets you scrape many public channels in one run with an optional keyword filter.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor reads one or more public Telegram channels from their web preview (t.me/s/<channel>), and writes to the run's dataset one channel-metadata record per channel (subscribers, description, verified status, photo/video/link counts) followed by one record per post, newest first. Each post record carries the text, author, timestamp, view count, any attached media with direct CDN URLs, link previews, outbound links, hashtags, reactions and forwarding details. An optional searchQuery keeps only posts that match the given text. Missing source values are returned as null rather than invented.
Only public channels are accessible. Private and invite-only channels cannot be read.
Quickstart
Open the actor, paste this into the input, and press Run. It returns the channel metadata plus the 10 most recent posts of the official Telegram channel.
{"channels": ["telegram"],"maxPosts": 10}
Enter channels as a username (durov), an @username, or a full t.me link. Leave searchQuery empty to collect the most recent posts.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
channels | string[] | yes | ["telegram"] | Public channels to scrape. Each as a username (for example durov), an @username, or a full t.me link. Private and invite-only channels cannot be accessed. |
maxPosts | integer | no | 10 | Maximum posts to collect from each channel, newest first. Range 1 to 1000000. |
searchQuery | string | no | (empty) | Only return posts matching this text within the given channels. Empty collects the most recent posts. |
Output reference
The dataset contains two record kinds, distinguished by type: one channel record per channel, then post records. Types: string, integer, boolean, string[], object, or null when the source value is absent.
| Field | Type | Applies to | Description |
|---|---|---|---|
type | string | both | channel for the metadata record, post for a post. |
channel | string | both | Channel username as scraped. |
channelTitle | string | both | Display title of the channel. |
id | integer | both | Post ID for posts; null on the channel record. |
url | string | both | Canonical t.me URL of the channel or post. |
thumbnail | string | both | Channel avatar or post thumbnail URL, or null. |
description | string | channel | Channel description text. |
subscribers | integer | channel | Subscriber count as a number. |
subscribersLabel | string | channel | Subscriber count as shown, for example 9.86M. |
photosCount | integer | channel | Number of photos in the channel. |
videosCount | integer | channel | Number of videos in the channel. |
linksCount | integer | channel | Number of links in the channel. |
isVerified | boolean | channel | true when the channel is verified. |
text | string | post | Full post text. |
author | string | post | Post author or signature. |
datetime | string | post | Post timestamp (ISO 8601). |
views | integer | post | View count as a number. |
viewsLabel | string | post | View count as shown, for example 1.18M. |
mediaType | string | post | Attached media type: photo, video, document, or null. |
mediaUrl | string | post | Direct CDN URL of the primary media, or null. |
mediaThumbnail | string | post | Media thumbnail URL, or null. |
mediaUrls | string[] | post | All media URLs on the post, or null. |
videoDuration | string | post | Video length as M:SS, or null. |
documentTitle | string | post | Attached document title, or null. |
forwardedFrom | string | post | Original channel name when the post is forwarded, or null. |
forwardedFromUrl | string | post | Original channel URL when forwarded, or null. |
replyToUrl | string | post | URL of the post this one replies to, or null. |
isForwarded | boolean | post | true when the post is a forward. |
linkPreview | object | post | Link preview card (url, siteName, title, description, thumbnail), or null. |
links | string[] | post | Outbound links found in the post, or null. |
hashtags | string[] | post | Hashtags in the post, or null. |
reactions | object | post | Emoji reactions with counts, or null. |
totalReactions | integer | post | Total reaction count, or null. |
observedAt | string | both | ISO 8601 timestamp of when the record was collected. |
error | string | both | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
The channel-metadata record from the same live run (input {"channels": ["telegram"], "maxPosts": 10}):
{"thumbnail": "https://cdn1.telesco.pe/file/duy0s_bkW1-f9R8cqXfI7Cy__6SJviapxuBmERrT9RPKef5KA ... [URL trimmed for brevity]","type": "channel","channel": "telegram","channelTitle": "Telegram News","id": null,"url": "https://t.me/telegram","description": "The official Telegram on Telegram. Much recursion. Very Telegram. Wow.","subscribers": 9860000,"subscribersLabel": "9.86M","photosCount": 14,"videosCount": 225,"linksCount": 372,"isVerified": true,"observedAt": "2026-08-10T14:33:07.927Z","error": null}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~telegram-channel-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"channels":["telegram"],"maxPosts":25}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~telegram-channel-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"channels":["durov","telegram"],"searchQuery":"update","maxPosts":100}'
Apify CLI:
apify call scrapers_lat/telegram-channel-scraper \--input '{"channels":["https://t.me/telegram"],"maxPosts":50}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per record returned (
resultevent), including the channel-metadata record. See the pricing tab for the current per-result price. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 posts per channel per run. Upgrade for higher
maxPosts.
FAQ and troubleshooting
A channel returned no posts. Why?
The channel is private or invite-only (not accessible), the username was wrong, or your searchQuery filtered everything out. Only public channels with a t.me/s/ preview can be read.
Can I read private or invite-only channels? No. This actor reads only public channels. Private and invite-only channels cannot be accessed.
Why is reactions or mediaUrl null?
Not every post has reactions or attached media. When there is none, those fields are null rather than invented.
Are the media URLs downloadable? The CDN URLs are signed by Telegram and time-limited. Download them promptly; they can expire.
Can I collect posts from several channels at once?
Yes. Add each channel to channels. maxPosts applies per channel.
Is this an official Telegram tool?
No. This actor is independent and has no affiliation with Telegram. It reads only data that is publicly available on t.me.
Related scrapers
- Text Classifier Tool: Classify post text into your own labels.
- Text to JSON Tool: Turn post text into structured JSON fields.
- Twitter/X Scraper: Posts and profiles from X.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Telegram. Accesses only publicly available channel data on t.me.
