# Telegram Channel Posts

<p>Post history for a public channel, newest first, 20 posts per page, with reactions, views, media, polls, documents, link previews and forward origins.</p><p>Pass <code>next_before</code> from the previous response as <code>before</code> to walk backwards. Pagination stops at the oldest post of the channel, so the cursor is never 0.</p><p>View counts arrive rounded, for example <code>14.3K</code>. The raw string is returned with <code>is_approximate</code>; an exact integer is never invented.</p>

- **Documentation:** [https://scrappa.co/docs/telegram-api/telegram_posts](https://scrappa.co/docs/telegram-api/telegram_posts)
- **API group:** Telegram API
- **Endpoint:** `GET https://scrappa.co/api/telegram/channels/{username}/posts`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `username` | string | Yes | <p>Public channel handle. A bare handle or an <code>@handle</code> also works in the path; use this parameter for the host forms, which contain a slash: <code>t.me/telegram</code>, <code>t.me/s/telegram</code>, <code>https://t.me/s/telegram</code>, <code>https://telegram.me/telegram</code>, <code>https://telegram.dog/telegram</code>. Every form normalises to the bare lowercase handle, because Telegram usernames are case-insensitive, and no request is ever issued to a mirror host.</p><p>When this parameter is present it is the handle that is used; the path segment is only the fallback for the forms that fit there.</p> |
| `before` | integer | No | <p>Post id cursor: the lowest id of the previous page.</p> |

## Example response

```json
{
    "data": {
        "count": 1,
        "posts": [
            {
                "id": 459,
                "date": "2026-07-16T20:45:25+00:00",
                "poll": null,
                "text": "Post body text.",
                "media": {
                    "album": null,
                    "photos": [
                        {
                            "url": "https://cdn.example/media/photo-459.jpg",
                            "width": 320,
                            "height": 240
                        }
                    ],
                    "videos": [],
                    "documents": []
                },
                "views": {
                    "raw": "14.3K",
                    "is_approximate": true
                },
                "edited": false,
                "channel": "telegram",
                "post_key": "telegram/459",
                "permalink": "https://t.me/telegram/459",
                "reactions": [
                    {
                        "count": 41,
                        "glyph": "\ud83c\udf89",
                        "is_paid": false,
                        "emoji_id": "5265077361648368841"
                    }
                ],
                "view_blob": {
                    "c": -1001234567890,
                    "h": "a1b2c3d4e5f60718",
                    "p": 459,
                    "t": 1784246725
                },
                "link_preview": null,
                "forward_origin": null,
                "reply_to_post_id": null
            }
        ],
        "channel": {
            "username": "telegram",
            "preview_url": "https://t.me/s/telegram",
            "permalink_url": "https://t.me/telegram"
        },
        "has_more": true,
        "next_before": 459
    },
    "meta": {
        "attempts": 1,
        "duration_ms": 744
    },
    "success": true
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | The username, post id or search query failed validation. A 422 carries a message and an errors map, and no error code. |
| 503 | Upstream Unavailable | No usable page came back. The request did not consume a credit. The code varies by failure type: UPSTREAM_HTTP_ERROR when the target answered with a non-successful status, TELEGRAM_DISABLED while the surface is switched off, TRANSPORT_ERROR when every gateway failed to connect, and a generic upstream_unavailable when no connection was available at all. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
