Telegram API endpoint
Returns one page of up to 20 posts from a public Telegram channel's web preview (t.me/s/{username}), newest first. Each post has its id, link, text, links found in the text, publish time, edited flag, view count, author signature, forwarded-from and reply references, photo and video thumbnails, link-preview card, and reaction tallies. Page backwards by passing the previous response's next_before as before; has_more is false and next_before is omitted on the last page. Pass query to search inside the channel instead of browsing; search pages use the same before cursor. A search with no matches returns an empty posts list. Views are the preview's abbreviated figures (for example 32.4K) and are approximate above 1,000. Media entries carry thumbnail references only, never playable file URLs. Polls, documents, voice notes and stickers appear as an unsupported media entry. Private channels, groups, bots, user accounts and channels that disabled their web preview are not supported. Telegram's terms restrict using platform content to train AI or machine-learning systems, so results must not be used for that purpose.
/telegram/channel-postsusername is required: the channel's public username, with or without a leading @ or a t.me link.
Optional parameters:
before pages backwards: only posts with an id lower than before are returned. Pass the previous response's next_before. Omit it for the newest page.query searches inside the channel (up to 128 characters, any language) instead of browsing. Search pages use the same before cursor.Notable response behavior:
has_more is false and next_before is omitted on the last page of the channel's history or of the search results.posts list, not an error. A channel page that comes back empty without Telegram's own "no posts" notice is reported as an upstream error instead of an empty list.views and reaction counts are expanded from Telegram's abbreviated figures (for example 32.4K), so they are approximate above 1,000.emoji. A custom (Premium) emoji reaction has no glyph in the preview and carries custom_emoji_id instead. The Telegram Stars reaction has paid: true and neither.media[].type is photo, video or unsupported. Media entries carry thumbnail references only, never playable file URLs. unsupported means an attachment the web preview cannot display, such as a poll, document, voice note or sticker.Example response (trimmed to one post):
{
"code": 200,
"msg": "OK",
"data": {
"username": "durov",
"title": "Pavel Durov",
"posts": [
{
"id": 531,
"username": "durov",
"url": "https://t.me/durov/531",
"text": "Telegram now has a Rich Text Editor.\n\nIt supports tables, headings, inline media, lists, AI content, formulas, and more.",
"published_at": "2026-07-16T20:45:25+00:00",
"edited": false,
"views": 5840000,
"author": "Pavel Durov",
"media": [
{
"type": "video",
"url": "https://t.me/durov/531",
"thumbnail_url": "https://cdn4.telesco.pe/file/THUMB_ID.jpg"
}
],
"reactions": [
{ "count": 6300, "paid": true },
{ "custom_emoji_id": "5265077361648368841", "count": 54600, "paid": false }
]
}
],
"has_more": true,
"next_before": 531
}
}
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| username | string | Yes | Public channel username, with or without @ or a t.me link | durov | |
| before | integer | No | Return only posts with an id lower than this; use the previous response's next_before. Omit for the newest page | 531 | |
| query | string | No | Search term to look for inside the channel, up to 128 characters | telegram | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/telegram/channel-posts?username=durov&query=coffee" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"username": "durov",
"title": "Pavel Durov",
"posts": [
{
"id": 531,
"username": "durov",
"url": "https://t.me/durov/531",
"text": "Telegram now has a Rich Text Editor.\n\nIt supports tables, headings, inline media, lists, AI content, formulas, and more.",
"published_at": "2026-07-16T20:45:25+00:00",
"edited": false,
"views": 5840000,
"author": "Pavel Durov",
"media": [
{
"type": "video",
"url": "https://t.me/durov/531",
"thumbnail_url": "https://cdn4.telesco.pe/file/THUMB_ID.jpg"
}
],
"reactions": [
{
"count": 6300,
"paid": true
},
{
"custom_emoji_id": "5265077361648368841",
"count": 54600,
"paid": false
}
]
}
],
"has_more": true,
"next_before": 531
}
}Request schema
No body schema
Response schema
#/definitions/telegram.channelPostsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | telegram.ChannelPostsResponse | No | ||||
| data.has_more | boolean | No | ||||
| data.next_before | integer | No | ||||
| data.posts | array | No | Post record, 32 fields: author, edited, forwarded_from, id, link_preview, links, media, published_at, reactions, reply_to, text, url and 2 more. Described under Get one public Telegram channel post API. | |||
| data.query | string | No | ||||
| data.title | string | No | ||||
| data.username | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/telegram/channel-posts?username=durov&query=coffee" \
-H "x-api-key: $CRAWLORA_API_KEY"