Telegram API endpoint
Returns a single post from a public Telegram channel by username and post id, as Telegram's public embed widget shows it: text, links, publish time, edited flag, views, author signature, forwarded-from and reply references, photo and video thumbnails, link-preview card, and reaction tallies. The post id is the number at the end of a post link (t.me/durov/531 has id 531) or the id field of telegram-channel-posts. A post that does not exist, was deleted, or belongs to a channel that is not public returns not found. Telegram's terms restrict using platform content to train AI or machine-learning systems, so results must not be used for that purpose.
/telegram/postBoth parameters are required:
username: the channel's public username, with or without a leading @ or a t.me link.id: the post id. It is the number at the end of a post link (t.me/durov/531 has id 531) or the id field of telegram-channel-posts.Notable response behavior:
404. Telegram gives the same answer for all three, so they cannot be told apart.telegram-channel-posts entry, under a post key. views and reaction counts are expanded from Telegram's abbreviated figures and are approximate above 1,000.media[].type is photo, video or unsupported; entries carry thumbnail references only, never playable file URLs.Example response (text and reactions trimmed):
{
"code": 200,
"msg": "OK",
"data": {
"post": {
"id": 4423,
"username": "tginfo",
"url": "https://t.me/tginfo/4423",
"text": "Реестр .me заблокировал домен t.me\n\nUPD 14 июля 16:00 МСК: Домен восстановлен.\n\nПользователи Telegram по всему миру стол…",
"links": [
"http://t.me/",
"https://telegram.me/tginfo/4426",
"https://www.whois.com/whois/t.me"
],
"published_at": "2026-07-13T20:15:18+00:00",
"edited": true,
"views": 43300,
"author": "Sominemo",
"reactions": [
{ "emoji": "😱", "count": 356, "paid": false },
{ "emoji": "👎", "count": 58, "paid": false }
]
}
}
}
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| username | string | Yes | Public channel username, with or without @ or a t.me link | durov | |
| id | integer | Yes | Post id, from a post link or telegram-channel-posts' own posts[].id field | 531 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/telegram/post?username=durov&id=531" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"post": {
"id": 4423,
"username": "tginfo",
"url": "https://t.me/tginfo/4423",
"text": "Реестр .me заблокировал домен t.me\n\nUPD 14 июля 16:00 МСК: Домен восстановлен.\n\nПользователи Telegram по всему миру стол…",
"links": [
"http://t.me/",
"https://telegram.me/tginfo/4426",
"https://www.whois.com/whois/t.me"
],
"published_at": "2026-07-13T20:15:18+00:00",
"edited": true,
"views": 43300,
"author": "Sominemo",
"reactions": [
{
"emoji": "😱",
"count": 356,
"paid": false
},
{
"emoji": "👎",
"count": 58,
"paid": false
}
]
}
}
}Request schema
No body schema
Response schema
#/definitions/telegram.postResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | telegram.PostResponse | No | ||||
| data.post | telegram.Post | No | ||||
| data.post.author | string | No | ||||
| data.post.edited | boolean | No | ||||
| data.post.forwarded_from | telegram.ForwardedRef | No | ||||
| data.post.forwarded_from.name | string | No | ||||
| data.post.forwarded_from.url | string | No | ||||
| data.post.id | integer | No | ||||
| data.post.link_preview | telegram.LinkPreview | No | ||||
| data.post.link_preview.description | string | No | ||||
| data.post.link_preview.image_url | string | No | ||||
| data.post.link_preview.site_name | string | No | ||||
| data.post.link_preview.title | string | No | ||||
| data.post.link_preview.url | string | No | ||||
| data.post.links | array | No | ||||
| data.post.media | array | No | ||||
| data.post.media[].thumbnail_url | string | No | ||||
| data.post.media[].type | string | No | ||||
| data.post.media[].url | string | No | ||||
| data.post.published_at | string | No | ||||
| data.post.reactions | array | No | ||||
| data.post.reactions[].count | integer | No | ||||
| data.post.reactions[].custom_emoji_id | string | No | ||||
| data.post.reactions[].emoji | string | No | ||||
| data.post.reactions[].paid | boolean | No | ||||
| data.post.reply_to | telegram.ReplyRef | No | ||||
| data.post.reply_to.author | string | No | ||||
| data.post.reply_to.id | integer | No | ||||
| data.post.reply_to.text | string | No | ||||
| data.post.reply_to.url | string | No | ||||
| data.post.text | string | No | ||||
| data.post.url | string | No | ||||
| data.post.username | string | No | ||||
| data.post.views | integer | 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/post?username=durov&id=531" \
-H "x-api-key: $CRAWLORA_API_KEY"