Telegram Channel Scraper
Pricing
from $1.00 / 1,000 results
Telegram Channel Scraper
Scrape public Telegram channels without the Telegram API. Extract posts, dates, URLs, outlinks, link previews, and optional channel metadata, then export results to the Apify dataset and CSV files.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Inus Grobler
Maintained by CommunityActor stats
0
Bookmarked
34
Total users
14
Monthly active users
5 days ago
Last modified
Categories
Share
Telegram Scraper: Public Telegram Channel Posts and Metadata
Scrape public Telegram channels on Apify without using the Telegram API. This Telegram scraper extracts posts, timestamps, message URLs, text, hashtags, mentions, outbound links, link previews, channel metadata, subscriber counts, channel descriptions, and channel image URLs from public t.me channels.
Use it for Telegram monitoring, OSINT research, competitor tracking, content archiving, market intelligence, social media analytics, and automated data pipelines.
What This Telegram Scraper Does
- Scrapes public Telegram channel posts from one or many channels
- Supports incremental scraping with
startId - Extracts post text, dates, URLs, links, hashtags, mentions, and link previews
- Always enriches results with channel metadata when available
- Automatically manages scraping concurrency, capped at 4 parallel channel scrapes
- Stores structured results in the Apify dataset
- Stores a run summary in the default key-value store
Common Use Cases
- Monitor Telegram channels for brand, market, or security intelligence
- Track official announcements, news channels, communities, and public figures
- Build datasets for OSINT, media research, or investigation workflows
- Feed Telegram posts into BI tools, dashboards, LLM pipelines, or data warehouses
- Archive public Telegram content with stable message IDs and URLs
- Extract links shared across Telegram channels for threat intelligence or trend analysis
Input
You can provide channels in the structured channels table, the bulk channelList text field, or both.
Example Input
{"channels": [{"channelName": "telegram","startId": 0,"limit": 3}],"defaultStartId": 0,"defaultLimit": 3,"failOnError": false}
This example uses Telegram's official public channel and requests only 3 posts, so it is a small, low-cost smoke test for the Actor.
For bulk input, paste one row per line:
telegram,0,3durov,0,2telegramtips
Each row uses channel,startId,limit. If startId or limit is omitted, the Actor uses defaultStartId and defaultLimit. You can also paste a simple comma-separated list of handles when every channel should use the defaults.
Input Fields
| Field | Type | Description |
|---|---|---|
channels | array | Structured table of Telegram channels to scrape. |
channelName | string | Telegram handle or public URL, such as telegram, @telegram, or https://t.me/telegram. |
startId | integer | Returns only posts with message IDs greater than this value. Use it for incremental updates. |
limit | integer | Maximum number of posts to scrape for that channel. |
channelList | string | Bulk text input. Use one row per channel as channel,startId,limit, or paste a simple list of channel handles to use the defaults. |
defaultStartId | integer | Default startId for entries that do not define one. |
defaultLimit | integer | Default post limit for entries that do not define one. |
failOnError | boolean | If true, the run stops on the first failed channel. If false, failed channels are reported in the summary and the Actor continues. |
Channel metadata is always included. Concurrency is selected automatically and capped at 4.
Output
Each dataset item represents one Telegram post.
Dataset Fields
| Field | Description |
|---|---|
Channel_Handle | Normalized Telegram channel handle. |
Channel_Name | Public channel display name. |
Subscribers | Best-effort subscriber or member count from public Telegram metadata. |
Channel_Description | Public channel description, when available. |
Channel_Photo_Url | Public channel image URL, when available. |
Channel_Url | Canonical public Telegram channel URL. |
Id | Telegram message ID within the channel. |
Date | Post timestamp in UTC ISO 8601 format. |
Url | Public Telegram post URL. |
Body | Post text content. |
Body_Length | Character length of the post body. |
Mentions | Telegram mentions found in the post text. |
Hashtags | Hashtags found in the post text. |
Outlinks | Unique outbound URLs found in the post. |
Outlinks_Count | Number of unique outbound URLs. |
LinkPreview_Url | Link preview target URL, when present. |
LinkPreview_SiteName | Link preview site name, when present. |
LinkPreview_Title | Link preview title, when present. |
LinkPreview_Description | Link preview description, when present. |
LinkPreview_Image_Url | Link preview image URL, when present. |
Hash | Stable deduplication hash based on channel, message ID, URL, and text. |
Example Output Item
{"Channel_Handle": "telegram","Channel_Name": "Telegram News","Subscribers": 10600000,"Channel_Description": "The official Telegram on Telegram. Much recursion. Very Telegram. Wow.","Channel_Photo_Url": "https://cdn1.telesco.pe/file/example.jpg","Channel_Url": "https://t.me/telegram","Id": 445,"Date": "2026-05-14T16:09:50+00:00","Url": "https://t.me/s/telegram/445","Body": "For all the features from this update...","Body_Length": 265,"Mentions": [],"Hashtags": [],"Outlinks": ["https://telegram.org/blog/ai-bot-revolution-11-new-features"],"Outlinks_Count": 1,"LinkPreview_Url": "https://telegram.org/blog/ai-bot-revolution-11-new-features","LinkPreview_SiteName": "Telegram","LinkPreview_Title": "Guest AI Bots, Bot-to-Bot Chats, Chat Automation, Custom AI Styles, 100M+ Emoji & Sticker Search and Much More","LinkPreview_Description": "Telegram adds over 10 new features...","LinkPreview_Image_Url": "https://cdn4.telesco.pe/file/example.jpg","Hash": "67f5253eea70a0d3c7ceab29d07bbd46"}
How to Use This Actor
Run the Actor from Apify Console by opening the Input tab, adding one or more public Telegram channels, and starting the run. When the run finishes, export the results from the Dataset tab as JSON, CSV, Excel, XML, RSS, or HTML.
The Actor also writes an OUTPUT summary to the default key-value store. The summary includes total channels, successful channels, failed channels, total messages, selected concurrency, and per-channel status.
Python API Example
Install the Apify API client:
$pip install apify-client
Run the Telegram scraper and read results from the default dataset:
from apify_client import ApifyClientAPIFY_TOKEN = "YOUR_APIFY_TOKEN"ACTOR_ID = "thescrapelab/Apify-Telegram-Scraper"client = ApifyClient(APIFY_TOKEN)run_input = {"channels": [{"channelName": "telegram","startId": 0,"limit": 3,},],"defaultLimit": 3,"failOnError": False,}run = client.actor(ACTOR_ID).call(run_input=run_input)if run is None:raise RuntimeError("Actor run failed")dataset = client.dataset(run["defaultDatasetId"])for post in dataset.iterate_items():print(post["Channel_Handle"], post["Id"], post["Url"])print(post.get("Body", "")[:200])
Incremental Scraping
Use startId to collect only newer posts. For example, if your previous dataset contains Id 445 for the telegram channel, set startId to 445 on the next run. The Actor will return only posts with IDs greater than 445.
Limitations
This Actor scrapes public Telegram web pages only.
It does not support:
- Private Telegram channels
- Login-protected content
- Telegram account automation
- Joining channels or groups
- Sending messages
- Scraping content hidden behind regional or network restrictions
Subscriber counts and channel metadata are best-effort values from public Telegram preview pages. If Telegram does not expose a value or temporarily blocks metadata access, the field may be empty or 0.
FAQ
Does this use the Telegram API?
No. It scrapes publicly available Telegram web pages and does not require Telegram API credentials.
Can it scrape private Telegram channels?
No. It only supports public channels available through public t.me pages.
Can I scrape multiple Telegram channels in one run?
Yes. Add multiple rows to channels, paste channel,startId,limit rows into channelList, or use both. The Actor automatically manages concurrency and caps it at 4 parallel channel scrapes.
How do I avoid duplicate data between runs?
Use startId. Store the highest Id from each channel and pass that value as the next run's startId.
What can I export?
Apify datasets can be exported as JSON, CSV, Excel, XML, RSS, and HTML from the Dataset tab or through the Apify API.