All scrapers

Social & video

Telegram Scraper

t.me

99.9% Success rate
1.2s Avg response
Bot detection + rate limiting Protection
1,200 calls Measured over

Public Telegram channels are served through a dedicated plugin endpoint rather than the generic page fetch. Give it a channel - a username like durov, @durov or a t.me link - and it reads the channel's public web preview and returns it already parsed: the channel's title, @username, description, avatar and verified mark with its subscriber, photo, video and link counts, and its posts newest first, each with id, URL, date, the text as plain text and as Telegram's own HTML, views, the author signature, an edited flag, the channel a post was forwarded from, the post it replies to, media (photos, videos, round videos, voice notes and stickers with their Telegram CDN links, audio files and documents with their title and size), polls, link previews, reactions with their counts, inline buttons, and the links, hashtags and mentions in the text. Without max_posts a call reads one page, the newest posts (about 20); with it, the plugin pages back through the channel's history until it has up to 500, while before, after and since bound the range, q searches inside the channel and post_id (or a post link) returns one post. It works for public channels with a web preview only: users, bots, groups and private channels have none, and comments, which live in a separate discussion group, are not included. No Telegram account, bot token or API key is involved.

What you can extract

  • Channel title, @username, description, avatar and verified mark
  • Subscriber count and the photo, video and link counters
  • Post id, URL, date (ISO-8601 UTC), plain text and Telegram text HTML
  • Views, author signature and an edited flag
  • Forwarded-from and reply-to references
  • Media: photos, videos, round videos, voice notes and stickers with Telegram CDN links, thumbnails and durations; audio files and documents with title and size
  • Polls, link previews, reactions with their counts and inline buttons
  • Links, hashtags and mentions found in the text
  • One page of the newest posts by default, up to 500 per call with max_posts, bounded by before, after or since, and search inside a channel with q

Dedicated endpoints

/social/telegram-channel

A public Telegram channel and its posts

A public channel's web preview by channel (username, @username or t.me link; a post link returns that post): channel (username, url, title, description, avatar, verified, subscribers, counters) and posts newest first with id, url, date, text, textHtml, views, author, edited, forwardedFrom, replyTo, media (type, url, thumbnail, duration, or title and size for files), poll, linkPreview, reactions, buttons, links, hashtags and mentions. One page (about 20 posts) by default; max_posts 1-500 pages back through history, before continues below a post id (pass nextBefore), after and since (YYYY-MM-DD) stop at a post id or a date, q searches inside the channel and post_id returns one post. Every answer carries postsReturned, pagesFetched, hasMore and nextBefore.

How to scrape it

curl -X POST \
  -H "X-ScrapeUnblocker-Key: $SU_API_KEY" \
  "https://api.scrapeunblocker.com/social/telegram-channel?channel=durov&max_posts=40"
import requests

resp = requests.post(
    "https://api.scrapeunblocker.com/social/telegram-channel",
    headers={"X-ScrapeUnblocker-Key": SU_API_KEY},
    params={"channel": "durov", "max_posts": "40"},
)
print(resp.text)
import { ScrapeUnblockerClient } from 'scrapeunblocker';

const su = new ScrapeUnblockerClient({ apiKey: process.env.SU_API_KEY });

const channel = await su.telegramChannel('durov', {
  maxPosts: 40,
});
console.log(channel);

Requests are POST and take their parameters in the query string. Browser rendering always happens - there is no flag to enable.

Example response

{
  "channel": {
    "username": "durov",
    "url": "https://t.me/durov",
    "title": "Pavel Durov",
    "description": "Founder of Telegram.",
    "avatar": "https://cdn4.telesco.pe/file/ZmgDSnVaNbJG2t9mSNAUKDOGVg0AEDnNQRnooGnt_A3z8M832bl...jpg",
    "verified": true,
    "subscribers": 10500000,
    "subscribersRaw": "10.5M",
    "counters": { "subscribers": 10500000, "photos": 102, "videos": 46, "links": 200 }
  },
  "query": { "maxPosts": 40 },
  "posts": [
    {
      "id": 546,
      "url": "https://t.me/durov/546",
      "channel": "durov",
      "type": "message",
      "date": "2026-08-31T16:30:15Z",
      "text": "🏳️ Gram Wallet in Telegram is ready and is now accessible to a select group of users...",
      "textHtml": "...Gram Wallet in Telegram is ready and is now accessible to a select group of users.<br/><br/>...",
      "views": 3210000,
      "viewsRaw": "3.21M",
      "author": "Pavel Durov",
      "edited": false,
      "media": [
        {
          "type": "video",
          "url": "https://cdn4.telesco.pe/file/e0b2769474.mp4?token=Eb2XGKYH0FySr2g4...",
          "thumbnail": "https://cdn4.telesco.pe/file/uz8d2sdnRZENi9ZLOZPbWHDwy8fQsxO...jpg",
          "duration": "0:20",
          "durationSeconds": 20,
          "postId": 546
        }
      ],
      "reactions": [
        { "emoji": "⭐", "paid": true, "count": 35600, "countRaw": "35.6K" },
        { "customEmojiId": "5399847211989246390", "count": 26800, "countRaw": "26.8K" },
        { "emoji": "😺", "customEmojiId": "5373223594484587136", "image": "https://telegram.org/img/emoji/40/F09F98BA.png", "count": 8740, "countRaw": "8.74K" }
      ]
    },
    {
      "id": 526,
      "url": "https://t.me/durov/526",
      "channel": "durov",
      "type": "message",
      "date": "2026-06-13T20:15:20Z",
      "text": "🖥 Don't be surprised if you see tables, nested lists, inline media, formulas, headers and more in Telegram messages...",
      "views": 23100000,
      "viewsRaw": "23.1M",
      "author": "Pavel Durov",
      "edited": false,
      "media": [
        {
          "type": "animation",
          "url": "https://cdn4.telesco.pe/file/1fd3fed61d.mp4?token=Qif8hzjy6bgdJB-4...",
          "thumbnail": "https://cdn4.telesco.pe/file/dMPQRD-QbGCA0oD3YfM4HEFI03Sb23m...jpg",
          "postId": 526
        }
      ],
      "reactions": [
        { "emoji": "⭐", "paid": true, "count": 5980, "countRaw": "5.98K" },
        { "customEmojiId": "5465587407350942612", "count": 45900, "countRaw": "45.9K" }
      ],
      "links": ["https://core.telegram.org/bots/api#rich-message-formatting-options"]
    }
  ],
  "postsReturned": 40,
  "pagesFetched": 3,
  "hasMore": true,
  "nextBefore": 507
}

Read the API docs

Frequently asked questions

Is it legal to scrape Telegram channels?

Collecting the public posts of public Telegram channels is lawful in many jurisdictions, but the rules depend on your country, the data you collect and how you use it. Posts can name or show people, so follow the privacy rules that apply to you. ScrapeUnblocker returns what the channel's public web preview shows; what you collect and how you use it is your responsibility.

How do I scrape Telegram without getting blocked?

The plugin does not log in or use the Telegram API: it reads the public web preview Telegram serves at t.me/s/<channel> through ScrapeUnblocker's rotating exits, and fetches a page again, up to three tries, when what comes back is not a Telegram page. A deep call stops paging after about 100 seconds or 50 pages and returns what it collected with a cursor to continue from. In ScrapeUnblocker's benchmark it returned real data on 99.9% of 1,200 calls, each a different public channel (newest posts, older pages with before and searches with q), about 1.2s per call.

Which Telegram channels can I scrape?

Public channels with a web preview, given as a username such as durov, @durov or a t.me link. Users, groups, private channels and channels whose owner turned the preview off have no public preview, so they answer 404, and a bot username or a private invite link is refused with 400. The plugin returns the channel's own posts; comments, which Telegram keeps in a separate discussion group, and member lists are not included.

How many Telegram posts can I get?

A call without max_posts reads one page of the web preview: the newest posts, about 20 (an album takes one slot per photo, so a page can hold fewer posts). Set max_posts up to 500 and the plugin follows the preview's own cursor back through the channel's history, page by page, up to 50 pages per call. To go further, call again with before set to the nextBefore of the previous answer, until hasMore is false. after (a post id) and since (a date) stop the walk at a point, which suits polling for new posts; q searches inside the channel and pages the same way, and post_id or a post link such as https://t.me/durov/400 returns one post.

What data do I get for each Telegram post?

Each post has its id, URL and date in ISO-8601 UTC, the text as plain text and as Telegram's own HTML, the view count, the author signature where the channel shows one, an edited flag, a forwardedFrom reference for forwarded posts and a replyTo reference for replies, its media with type and, by type, the Telegram CDN link, thumbnail and duration or a file's title and size, a poll with its question, options, percentages and voters, a link preview with site, title, description and image, reactions with their counts (paid star reactions flagged), inline buttons, and the links, hashtags and mentions found in the text. The channel header adds the title, description, avatar, verified mark and subscriber count.

How much does it cost to scrape Telegram?

Each web preview page fetched is billed as one request. A call without max_posts reads one page and costs 1 request; a call with max_posts costs one request per page it walked, about 20 posts per page (fewer on channels heavy with albums), up to 50 pages, and pagesFetched shows the exact number. 1 request = 1 credit, EUR 1.00 per 1,000 on pay as you go, down to about EUR 0.55 per 1,000 on the Ultimate plan. Blocks and timeouts are not billed, and the free trial includes 500 requests with no card.

Related scrapers

Start scraping this site today

Free tier included. No credit card required to test it.