Telegram Channel Messages Scraper avatar

Telegram Channel Messages Scraper

Pricing

from $0.25 / 1,000 telegram messages

Go to Apify Store
Telegram Channel Messages Scraper

Telegram Channel Messages Scraper

Get public Telegram channel messages with text, dates, views, reactions, links, media, and channel details. Filter by date, keyword, or views, add post comments, or monitor channels for new posts. No Telegram login needed.

Pricing

from $0.25 / 1,000 telegram messages

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

67

Total users

8

Monthly active users

7 days ago

Last modified

Security

Limited permissions

Share

📨 Get public Telegram channel posts as clean data

Telegram Channel Messages Scraper is for researchers, analysts, marketers, and developers who follow public Telegram channels. Paste channel links or @handles and get one row for each message, with its text, date, link, views, reactions, links, media, and channel details. You do not need a Telegram login, phone number, or API key.

  • Save the latest posts from news, crypto, or product channels so you can read and search them in one place.
  • Track how views and reactions change across a channel's posts over time.
  • Collect every link, @mention, hashtag, and email address that a channel posts.
  • Pull only the posts that match a keyword, a date range, or a minimum view count.
  • Schedule a channel monitor that saves only the posts published since the last run.

📋 What each Telegram message row contains

Each row is one public channel message. It includes:

  • The message number, link, publish date, and text
  • The edited flag and the author signature, when Telegram shows them
  • The view count and each reaction count, including paid Star reactions
  • The original source of a forwarded message, and the message that a reply answers
  • The hashtags, @mentions, links, and email addresses in the text
  • Photos, videos, and files, with their public links and preview images
  • Public comments under the post, when you turn comments on
  • Channel details: title, description, verified badge, picture, subscriber count, and counts of photos, videos, and links

When Telegram does not show a value, the field is null, {}, or []. The Actor does not guess it.

🚀 How to scrape a Telegram channel

  1. Add one or more public channel targets. You can use a channel URL, a t.me/s archive URL, an @handle, a bare handle, or a direct post URL.
  2. Set how many messages to save. Leave it empty or set 0 to save all available messages.
  3. Add a date range, keyword, or other filter if you want fewer messages.
  4. Start the run and open the dataset. Export it as JSON, CSV, Excel, or another format.

Start with a small limit, check the rows, and then run the same input on a schedule or through the Apify API.

⚙️ Input

Input fields

FieldTypeWhat it does
targetsarrayRequired. Public Telegram channels to read, 1 to 500 per run. Works with https://t.me/durov, https://t.me/s/durov, @durov, durov, and direct post links such as https://t.me/durov/500. Private /c/ links and invite-only channels do not work.
maxMessagesintegerThe most message rows to save across the whole run. Leave it empty or set 0 to save all available messages. The form prefills 60.
sortOrderstringnewest_first (default) or oldest_first. Sets the order of the saved rows.
dateFromstringOptional. Saves only messages published on or after this date, in UTC. The form prefills 2026-01-01, but there is no default when you leave it out.
dateTostringOptional. Saves only messages published before the start of this date, in UTC. It must be later than dateFrom.
afterMessageNumberintegerOptional. Saves only messages with a higher message number. The message number is the last part of a post link, such as 540 in https://t.me/durov/540.
beforeMessageNumberintegerOptional. Saves only messages with a lower message number.
keywordstringOptional. Saves only the messages that Telegram's channel search finds for this word.
minViewsintegerOptional. Saves only messages with at least this many views.
onlyWithMediabooleanSaves only messages with a photo, video, file, or other media. Default false.
onlyWithLinksbooleanSaves only messages with at least one link. Default false.
monitorNamestringOptional. A name for a channel monitor, using letters, numbers, dashes, and underscores, up to 63 characters. Each later run with the same name saves only messages published since the last run of that monitor, for each channel. It works with channels, not single post links.
includeCommentsbooleanSaves the public comments under each post, with each author's public name and username. Each saved comment is charged. Default false.
maxCommentsPerPostintegerThe most comments to save for each post. Default 20. Set 0 to save all comments. Used only when includeComments is on.

Example input

{
"targets": [
"https://t.me/telegram"
],
"maxMessages": 60,
"sortOrder": "newest_first",
"dateFrom": "2026-01-01",
"onlyWithMedia": false,
"onlyWithLinks": false,
"includeComments": false,
"maxCommentsPerPost": 20
}

If two targets point to the same message, the Actor saves that message only once.

🧾 Output

Output fields

FieldTypeWhat it does
inputTargetstringThe channel name, @handle, or link you entered that found this message.
channelUsernamestringThe public username of the channel.
messageIdstringThe number of the message in the channel.
messageUrlstringThe link to open the message on Telegram.
datestring or nullWhen the channel published the message.
textstring or nullThe text of the message.
isEditedboolean or nullTelegram shows that the message was edited.
authorSignaturestring or nullThe author name that Telegram shows on the message.
viewsinteger or nullThe number of views.
viewsTextstring or nullThe view count as Telegram shows it, such as 15.3K.
replyCountinteger or nullThe number of replies that Telegram shows.
reactionsobjectReaction counts. Each key is an emoji, or the number ID of a custom emoji. The key ⭐ holds paid Star reactions.
forwardedFromobject or nullFor a forwarded message, the original source.
forwardedFrom.namestring or nullThe name of the original source.
forwardedFrom.urlstring or nullThe Telegram link of the original source.
replyToobject or nullFor a reply, the message that it answers.
replyTo.messageIdstring or nullThe number of the message that it answers.
replyTo.messageUrlstring or nullThe link of the message that it answers.
hashtagsarrayThe hashtags in the message.
mentionsarrayThe @mentions in the message.
urlsarrayThe links in the message.
emailsarrayThe email addresses in the message.
mediaarrayThe photos, videos, and files in the message.
media.typestringThe kind of media, such as photo or video.
media.urlstring or nullThe public link to the media file.
media.thumbnailUrlstring or nullThe public link to the preview image.
commentsarrayThe public comments under the post. Empty when comments are off.
comments.authorNamestring or nullThe public name of the comment author.
comments.authorUsernamestring or nullThe public username of the comment author.
comments.textstring or nullThe text of the comment.
comments.datestring or nullWhen the comment was published.
channelobjectDetails of the channel that published the message.
channel.titlestring or nullThe name of the channel.
channel.descriptionstring or nullThe description of the channel.
channel.isVerifiedboolean or nullTelegram shows a verified badge for the channel.
channel.avatarUrlstring or nullThe link to the channel picture.
channel.subscriberCountinteger or nullThe number of subscribers.
channel.photoCountinteger or nullThe number of photos in the channel.
channel.videoCountinteger or nullThe number of videos in the channel.
channel.linkCountinteger or nullThe number of links in the channel.

Example message

{
"inputTarget": "durov",
"channelUsername": "durov",
"messageId": "503",
"messageUrl": "https://t.me/durov/503",
"date": "2026-05-06T15:57:26+00:00",
"text": "🏁 TON leads Layer-1 blockchains in finality time. 🔗 Sources: https://telegra.ph/Comparison-of-Layer-1-blockchains-by-finalization-time-05-01",
"isEdited": false,
"authorSignature": "Pavel Durov",
"views": 14800000,
"viewsText": "14.8M",
"replyCount": null,
"reactions": {
"⭐": 10300,
"5265077361648368841": 41600,
"5314647211299067950": 15700,
"5472404692975753822": 10800,
"5447193685919811994": 6770,
"5447458260200214425": 118
},
"forwardedFrom": null,
"replyTo": null,
"hashtags": [],
"mentions": [],
"urls": [
"https://telegra.ph/Comparison-of-Layer-1-blockchains-by-finalization-time-05-01"
],
"emails": [],
"media": [
{
"type": "video",
"url": "https://cdn4.telesco.pe/file/85102421eb.mp4?token=JbL7IbbWLPlAvGjWzp2m5t6F1lZ4ty9iB40FL7ejgzBbz8HxML3Zu7ZJksDka2gsOJUjnl3eqIjnqgs5BI9hnRO2vANy9wRTw57IcO59aH_AFkjsb4TNRvVER7mXK_19nbb8ne43cG4G4GTxlYvdP-T2Ao28zGZ1mjMFZc6xn4JxikELsF-Fw1gg1xZvcJ8pDraqqtqQB7qHmeCs5Qo4QpC24Nmv4-JXiD7KAfpGUSLNubPqKIu4keHEVAYTWng633D52lFTWCdM2G_Lpn__45SNoBQvrA5K2kq3a6Q9witr125SDJOCwH9twIR_4qNC5M62iyYdpGm7QQcvfrWlSw",
"thumbnailUrl": "https://cdn4.telesco.pe/file/PnlkhpY4klk_AK6u3GEX6v_vA0ZyFIi4jpR3YQlhR45XK1vC31CzITzGRQDLx8UtmzcJZXGn6DSvb_HimTlsMQJ3mXbZ9z5uMMIEIXiHvb1zqVv9UCQFThPpoLGGdUbJzczFWoLx0G5uPbdMi6RJUhm9ojUnTc9VAwgA8U0JzF-hz-1HG-VZibXSvgGA5k7agbbZ9n4_Ncby_IwCO7McWgyegbpWXVyewyxJM4wU-HWMafGuxnkNiSrXU3qIMW2FEZ937szc0i-Hg1TxvXfUTsFDpq6eMvSrupHdnbe5AzHfxdTRBd-Mr9Tz5_NC1nk8loWX7fFVLNFaI6JcCxuAXw"
}
],
"comments": [],
"channel": {
"title": "Pavel Durov",
"description": "Founder of Telegram.",
"isVerified": true,
"avatarUrl": "https://cdn4.telesco.pe/file/TotdkaP-2xUX87mdgGA6XuCX6b3m-acrpIFK05L9o1sPWhLmC-cTk0tTxQPNhpFoRWV0u5Gbk4PrCxD_rTDFMztog61SKKDOz7z26KUr9_riVkRwSMxW3KxqX5oUCQKBYcPqj3O4dMn8ITdAKVZkJp9HVzKcHWcuZFfqxcBz8QblSJ2DQvME3IIo14TFfuexAMLPbyXm9xOMlSDIxH8GRAqfrYwfu9j0BxUqZajvHslNFhVsWslSIbXYeN9Q9J7vuhzxNpRP1ql6Dy2NAmlcCwXBvx0CHne4EH79l_THYRvmez9MKoghidCZzxfj5le3jHbPATEDolGtGdXbWz8EfA.jpg",
"subscriberCount": 10200000,
"photoCount": 102,
"videoCount": 47,
"linkCount": 200
}
}

Media links come from Telegram and can expire after some time.

💳 Pricing

This Actor uses pay-per-event pricing. You pay for:

  • Actor start: one small charge each time a run starts.
  • Message: one charge for each message row saved to the dataset.
  • Comment: one charge for each public comment saved, only when you turn comments on.

A run that finds no matching messages pays only the start charge. Filters such as dates, keyword, and minimum views run before saving, so messages they skip are not charged. See the Pricing tab for the current prices. To control cost, set maxMessages and a maximum charge per run.

🔌 Integrations

You can run this Actor from the Apify API, on a schedule, or from tools such as Make, Zapier, n8n, Google Sheets, and webhooks. A scheduled run with monitorName gives you a simple feed of new channel posts.

❓ FAQ

Can I get only new messages each day?

Yes. Set monitorName and run the Actor on a schedule. Each run with the same monitor name saves only the messages published since the last run of that monitor, for each channel.

How do I get a channel's full history?

Leave maxMessages empty or set it to 0, and leave the date and message number fields empty. The Actor then saves every public message it can reach, back to the first one.

Can I scrape private Telegram channels or groups?

No. The Actor reads public channels only. Private /c/ links, invite-only channels, private chats, and DMs do not work.

Do I need a Telegram account, cookies, or an API key?

No. Paste public channel links or handles and start the run.

How is this different from Telethon or Pyrogram?

Telethon and Pyrogram are Python libraries that use the Telegram API. You need your own API ID, a phone login, and code. This Actor needs no login or code. It gives you the data as a ready dataset that you can export or connect to other tools.

Can I download the media files?

The Actor saves the public link and preview image of each photo, video, or file. It does not store copies of the files. For a media-first job, use a Telegram media downloader.

Why are some fields empty?

Telegram does not show every value on every message. For example, reply counts and reactions show only when the channel allows them. The Actor keeps those fields empty instead of guessing.

Actor Release Notes

v1.0 (31-10-2026)

  • With newest_first, messages are now saved from newest to oldest. Before, older messages could be saved first.
  • Fixed long runs that could run out of memory and stop before saving results.
  • New filters: keyword, afterMessageNumber, beforeMessageNumber, minViews, onlyWithMedia, and onlyWithLinks.
  • New monitorName input. Later runs with the same name save only messages published since the last run.
  • New includeComments and maxCommentsPerPost inputs save the public comments under each post. Each saved comment is charged.
  • Breaking change: maxMessages no longer has a default of 60. When you leave it empty or set it to 0, the run saves all available messages, and each one is charged. To keep the old behavior, set maxMessages to 60. The old limit of 10,000 is gone.
  • New output fields: isEdited, authorSignature, viewsText, forwardedFrom, replyTo, mentions, emails, comments, and channel with channel details.
  • Breaking change: the mediaMode, includeReactions, and includeExtractedEntities inputs are removed. Every row now always has media, reactions, links, and hashtags. Remove these keys from your input. The Actor ignores them.
  • Breaking change: the normalizedTarget, channelUrl, sourceUrl, position, forwards, and scrapedAt output fields are removed with no replacement. Use inputTarget, channelUsername, and messageUrl to find the channel and message.
  • Custom emoji reactions now use the custom emoji number ID as their key in reactions.

v0.0

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré