# Telegram Posts Scraper - Public Channels, Posts & Link Previews (`tugelbay/telegram-posts-scraper`) Actor

Scrape Telegram public channels via t.me/s/ - no bot token, no phone login. Posts, views, link previews, media URLs. PPE pricing, MCP-native, clean markdown output for RAG.

- **URL**: https://apify.com/tugelbay/telegram-posts-scraper.md
- **Developed by:** [Tugelbay Konabayev](https://apify.com/tugelbay) (community)
- **Categories:** Social media, AI
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Telegram Posts Scraper API - Public Channels, Posts & Link Previews

> **Fast first run** — the default input returns a small 10-post sample from public `t.me/s/<channel>` preview pages.
> **No Telegram account or bot token required** for public preview pages. Telegram may still limit or hide some channels.
> **Pay-per-use after** — $0.002/post. Cheaper than running your own Telethon deployment, without managing a Telegram account, SIM, or `api_id`/`api_hash` credentials.

Scrape posts from public Telegram channels without phone numbers, 2FA, OAuth, bot tokens, or spending weeks on MTProto client libraries. This actor wraps Telegram's own `t.me/s/` SEO preview pages (which Telegram itself exposes to every indexing bot) behind a single Apify-platform input with proxy rotation, pagination, filters, and a clean canonical output schema.

Perfect for **brand monitoring, channel intelligence, AI RAG pipelines, crypto/news tracking, research datasets**, and **competitive analysis** across one-person blogs to million-subscriber broadcast channels. Returns structured JSON with post text, view counts, timestamps, media URLs, link previews — plus an optional **clean Markdown format** that plugs straight into LangChain document loaders or Claude MCP tools.

### How it works

Three input sources, used together in one run:

1. **`channels`** — list of channel handles (without `@` or `t.me/`). Scraper walks `t.me/s/<handle>` newest-first, paginating via `?before=<post_id>` until `maxItems` or end of feed. This is the main mode.
2. **`postUrls`** — list of full post URLs (e.g. `https://t.me/durov/478`). Each URL fetches one post with its OG metadata and embedded widget data.
3. **`search`** — channel handle lookup via `t.me/s/<query>`. Useful when you know a likely public handle but want to run it through the same preview parser.

Posts are pushed to the dataset **incrementally** — even if the run is aborted, everything fetched so far is already stored.

> **What "public" means on Telegram:** every channel with previews enabled. The channel admin sets this toggle in Telegram → Channel Settings. Most news, crypto, and broadcast channels have previews on. Some private or sensitive ones don't — we detect this case and surface it cleanly (empty dataset with a warning log).

### Why use this instead of alternatives?

| Feature | Telegram Posts Scraper | Telethon (self-host) | Telegram Bot API | Other Apify scrapers |
| --- | --- | --- | --- | --- |
| **Auth required** | None | Phone number + 2FA + SIM | Bot token + channel admin | Varies |
| **Can scrape without joining channel** | Yes (public preview) | Yes (after join) | Only if bot is admin | Varies |
| **IP rotation** | Yes — Apify proxy | Manual | N/A | Varies |
| **Output formats** | full / minimal / rag-markdown | Custom code | Raw objects | full only |
| **Link preview extraction** | Yes, structured | Manual | Manual | Rare |
| **View counts + dates** | Yes | Yes | Not directly exposed | Varies |
| **Pagination** | Automatic via `?before=<id>` | Manual | Manual | Varies |
| **MCP compatible** | Yes (PPE = agent-friendly) | No | No | Rarely |
| **Pay model** | PPE — only what you scrape | Free but self-host | Free but bot must be admin | Varies |

**Key advantage:** no Telegram account. No SIM risk. No `api_id`/`api_hash` registration. No 2FA loops. Just channel handles in, structured posts out.

### Input examples

#### Read two channels (default prefill)

```json
{
  "channels": ["durov", "telegram"],
  "maxItems": 10,
  "outputFormat": "full"
}
````

#### Monitor a crypto announcement channel since a specific date

```json
{
  "channels": ["binance_announcements"],
  "sinceIso": "2026-04-01T00:00:00Z",
  "minViews": 5000,
  "maxItems": 200
}
```

#### Fetch a specific viral thread + related posts

```json
{
  "postUrls": [
    "https://t.me/durov/478",
    "https://t.me/durov/479"
  ],
  "outputFormat": "rag"
}
```

#### Paginate deep into a channel's history

```json
{
  "channels": ["telegram"],
  "before": 400,
  "maxItems": 500,
  "outputFormat": "minimal"
}
```

#### Find a channel by topic

```json
{
  "search": "cats",
  "maxItems": 20
}
```

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `channels` | array\[string] | `["durov", "telegram"]` | Channel handles (no `@`, no `t.me/`). Most common mode. |
| `postUrls` | array\[string] | `[]` | Specific `https://t.me/<channel>/<id>` URLs to fetch. |
| `search` | string | — | Channel-name lookup. Telegram returns the top-matching public channel. |
| `maxItems` | integer | 10 | Cap on total posts across all sources. Each is one PPE event. |
| `before` | integer | — | Start at posts OLDER than this post ID. Default is newest first. |
| `outputFormat` | enum | `full` | `full` / `minimal` / `rag`. See Output format section. |
| `minViews` | integer | 0 | Drop posts below N views. Good for "only viral posts" runs. |
| `sinceIso` | string | — | ISO-8601 (`2026-01-01T00:00:00Z`). Older posts are skipped. |
| `proxyConfiguration` | object | `{useApifyProxy: true}` | Apify proxy group. Default auto-selects. |

### Output format

#### Full (default)

Every post includes:

```json
{
  "channel": "durov",
  "post_id": 478,
  "data_post": "durov/478",
  "url": "https://t.me/durov/478",
  "date": "2026-04-23T17:12:59+00:00",
  "text": "🔄 Your massive monthly Telegram update is out.\n\n🧠 100% private AI Editor for your outgoing messages...",
  "views": 1500000,
  "forwarded_from": null,
  "reply_to_url": null,
  "photos": ["https://cdn4.telesco.pe/file/..."],
  "video_url": null,
  "has_voice": false,
  "document_url": null,
  "link_preview": {
    "url": "https://telegram.org/blog/april-2026",
    "site_name": "Telegram",
    "title": "April 2026 Update",
    "description": "100% private AI Editor, new polls, Live Photos...",
    "image_url": "https://telegram.org/..."
  }
}
```

#### Minimal

Keeps: `channel`, `post_id`, `url`, `date`, `text`, `views`, `forwarded_from`, `photos`, `video_url`, `link_preview`.

#### RAG (Markdown)

Each post becomes one Markdown block with post metadata, text, and link preview — paste directly into a vector DB.

```markdown
## t.me/durov/478

**Channel:** durov  ·  2026-04-23T17:12:59+00:00  ·  1500000 views

🔄 Your massive monthly Telegram update is out.
🧠 100% private AI Editor for your outgoing messages.
🗳 The most powerful polls in any messenger...

**Link preview:** [April 2026 Update](https://telegram.org/blog/april-2026)
```

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `channel` | string | Handle without `@`, e.g. `durov`. |
| `post_id` | integer | Numeric ID within channel (used for pagination). |
| `url` | string | Canonical `t.me/<channel>/<id>`. |
| `date` | string (ISO-8601) | When posted (UTC). |
| `text` | string|null | Post body. `<br>` converted to `\n`, all formatting stripped. |
| `views` | integer|null | Parsed from `1.5K`/`2M` notation to absolute integer. |
| `forwarded_from` | string|null | Original author if this is a forward. |
| `reply_to_url` | string|null | URL of post being replied to, if any. |
| `photos` | array\[string] | CDN URLs for photo attachments. |
| `video_url` | string|null | Direct video URL (may be time-limited CDN link). |
| `has_voice` | boolean | True if post contains a voice message. |
| `document_url` | string|null | Direct document URL for file uploads. |
| `link_preview` | object|null | `{url, site_name, title, description, image_url}` if post includes a link preview card. |

### Integrations

#### Python — quick RAG ingest

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("tugelbay/telegram-posts-scraper").call(run_input={
    "channels": ["durov"],
    "outputFormat": "rag",
    "maxItems": 100
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    vector_db.ingest(item["markdown"])
```

#### JavaScript/Node

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('tugelbay/telegram-posts-scraper').call({
    channels: ['binance_announcements'],
    sinceIso: '2026-04-01T00:00:00Z',
    minViews: 10000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### MCP (Claude / GPT agents)

Expose this actor as a tool via the Apify MCP Server (`mcp.apify.com`). Your agent gets a Telegram-read tool with no credentials to manage:

```json
{
  "name": "scrape_telegram_channel",
  "apifyActor": "tugelbay/telegram-posts-scraper",
  "description": "Read recent public Telegram posts from one or more channels"
}
```

#### LangChain / LlamaIndex

Use the RAG output format. The `markdown` field drops straight into `Document(page_content=item['markdown'], metadata={"channel": item["channel"], "url": item["url"]})`.

### Use cases

- **Brand & competitor monitoring** — watch a competitor's announcement channel, alert on keywords.
- **Crypto signal tracking** — monitor shilling channels, extract mentioned token tickers via regex over `text`.
- **AI news feed** — aggregate AI/ML channels, dedupe, feed to LLM-summary pipelines.
- **Channel research for ads** — before sponsoring a channel, pull last 100 posts, measure view decay, engagement.
- **Internal KB from public team channel** — teams that use public Telegram for announcements can ingest their own channel into Notion/Confluence.
- **Local news aggregation** — hundreds of Telegram channels for every country/city — aggregate by location.
- **Dataset building** — label corpus for abuse detection, sentiment analysis, language identification.
- **Academic research** — social-network effects without needing Telegram developer registration.
- **Journalism leads** — monitor OSINT channels during breaking events.
- **Public figure tracking** — read every post from a politician/CEO/founder channel as it arrives.

### Cost estimation

| Scenario | Posts | Cost (FREE tier) | Cost (GOLD tier) |
| --- | --- | --- | --- |
| Daily 20-post feed from 5 channels | 100/day | $0.20/day | $0.13/day |
| Monthly digest — 500 posts across 10 channels | 500 | $1.00 | $0.65 |
| One-off research dump — 10,000 posts | 10,000 | $20.00 | $13.00 |
| RAG cold-start — 100 channels × 200 posts | 20,000 | $40.00 | $26.00 |

Compare to running your own Telethon instance: $5–10/mo proxy + SIM card risk + ~40 hours maintenance/year.

### FAQ

**Do I need a Telegram account?** No. No account, no phone, no 2FA. The actor reads public channel previews that Telegram serves to every indexing bot.

**What about private channels?** Private channels and channels with "web previews" disabled return empty. No way around that without a real account — which we explicitly don't do.

**Can it read comments?** Only when comments are public widgets on the channel post (rare). Private comment sections require account login.

**How fresh is the data?** Real-time. Each run hits Telegram live — you get the same posts a website visitor sees.

**What rate limits apply?** In validation, 40 rapid requests to `t.me/s/` returned 200. Apify proxy handles any edge-case throttling. Heavy runs (>10k posts) should use `RESIDENTIAL` proxy group for safety.

**Is this legal?** Channel previews are public by design (they're indexed by Google). Standard web-scraping compliance applies — respect channel owners' rights, honor takedown requests, don't re-publish copyrighted material.

**What languages?** All. Text is extracted as-is. Telegram channels exist in every major language; the actor returns whatever bytes Telegram serves.

**Why `t.me/s/` and not the Bot API?** Bot API requires the bot to be a channel admin. `t.me/s/` requires nothing. Different access model — we chose simplicity.

**Can I get channel subscriber count?** Not currently. `t.me/s/<handle>` doesn't expose it. Could add via `t.me/<handle>` in a future version if requested.

### Troubleshooting

| Issue | Cause | Fix |
| --- | --- | --- |
| 0 posts returned for a channel | Channel is private or has previews disabled | Confirm `t.me/s/<channel>` in a browser — if it shows no posts, this channel isn't scrapeable publicly. |
| Some posts missing link previews | Telegram doesn't always generate them | Nothing to fix — `link_preview` is null when Telegram doesn't emit the card. |
| Photo URLs expire after a few hours | Telegram CDN signs media URLs | Download media during the run, don't rely on URLs later. Or hit the page again when needed. |
| Pagination stops early | Hit oldest post in preview window | Telegram only shows ~100–200 posts in `/s/` view for most channels. For deeper history, pass lower `before` IDs or use a Telethon account. |
| Rate limit / slowdown | Heavy burst from one IP | Use `RESIDENTIAL` proxy group or lower concurrency. |

### Limitations

- No private channels, no group chats — only channel public previews.
- No comments — Telegram renders those client-side.
- Media URLs are CDN-signed and expire; download during the run if you need persistence.
- No reactions count — not in the public preview HTML.
- Subscriber counts not yet extracted (future work).
- Some channels have previews limited to last 100 posts — deeper history requires account-based access (out of scope).

### Changelog

- **0.1** (2026-04-24) — Initial release. Full / minimal / RAG formats. Pagination via `?before=`. Filters by views + date. MCP-compatible PPE pricing.

# Actor input Schema

## `channels` (type: `array`):

Telegram channel handles (without @ or t.me/). Each channel must be PUBLIC and have previews enabled. The scraper will fetch posts from t.me/s/<channel>.

## `postUrls` (type: `array`):

Full Telegram post URLs (e.g. https://t.me/durov/478). If set together with channels, both sources are scraped.

## `search` (type: `string`):

Channel handle lookup using t.me/s/<query>. Returns posts from the matching public preview page when Telegram exposes one. Leave empty if using channels/postUrls.

## `maxItems` (type: `integer`):

Maximum number of posts to return across all sources. Each post counts as one PPE event.

## `before` (type: `integer`):

Begin pagination at posts OLDER than this ID. Leave empty for newest first. Useful for catching up a specific date range.

## `outputFormat` (type: `string`):

'full' includes every Telegram field (media, link preview, forwards). 'minimal' keeps key fields. 'rag' outputs one Markdown block per post, ready for vector DB.

## `minViews` (type: `integer`):

Drop posts with fewer than N views. 0 = no filter. Useful for feed-scanning to keep only viral posts.

## `sinceIso` (type: `string`):

ISO-8601 timestamp (e.g. 2026-01-01T00:00:00Z). Posts older than this are skipped. Leave empty for all posts.

## `proxyConfiguration` (type: `object`):

Telegram has very light rate limits on /s/ pages, but Apify proxy is recommended for large runs. The default uses any Apify group.

## Actor input object example

```json
{
  "channels": [
    "durov",
    "telegram"
  ],
  "maxItems": 10,
  "outputFormat": "full",
  "minViews": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "channels": [
        "durov",
        "telegram"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tugelbay/telegram-posts-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "channels": [
        "durov",
        "telegram",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tugelbay/telegram-posts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "channels": [
    "durov",
    "telegram"
  ],
  "maxItems": 10
}' |
apify call tugelbay/telegram-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tugelbay/telegram-posts-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Telegram Posts Scraper - Public Channels, Posts & Link Previews",
        "description": "Scrape Telegram public channels via t.me/s/ - no bot token, no phone login. Posts, views, link previews, media URLs. PPE pricing, MCP-native, clean markdown output for RAG.",
        "version": "0.1",
        "x-build-id": "yXnDkyT2C2IgCMHy9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/tugelbay~telegram-posts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-tugelbay-telegram-posts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/tugelbay~telegram-posts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-tugelbay-telegram-posts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/tugelbay~telegram-posts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-tugelbay-telegram-posts-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "channels": {
                        "title": "Channel handles",
                        "type": "array",
                        "description": "Telegram channel handles (without @ or t.me/). Each channel must be PUBLIC and have previews enabled. The scraper will fetch posts from t.me/s/<channel>.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "postUrls": {
                        "title": "Specific post URLs",
                        "type": "array",
                        "description": "Full Telegram post URLs (e.g. https://t.me/durov/478). If set together with channels, both sources are scraped.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "search": {
                        "title": "Channel name search",
                        "type": "string",
                        "description": "Channel handle lookup using t.me/s/<query>. Returns posts from the matching public preview page when Telegram exposes one. Leave empty if using channels/postUrls."
                    },
                    "maxItems": {
                        "title": "Max posts",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of posts to return across all sources. Each post counts as one PPE event.",
                        "default": 10
                    },
                    "before": {
                        "title": "Start before post ID",
                        "type": "integer",
                        "description": "Begin pagination at posts OLDER than this ID. Leave empty for newest first. Useful for catching up a specific date range."
                    },
                    "outputFormat": {
                        "title": "Output format",
                        "enum": [
                            "full",
                            "minimal",
                            "rag"
                        ],
                        "type": "string",
                        "description": "'full' includes every Telegram field (media, link preview, forwards). 'minimal' keeps key fields. 'rag' outputs one Markdown block per post, ready for vector DB.",
                        "default": "full"
                    },
                    "minViews": {
                        "title": "Minimum views",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop posts with fewer than N views. 0 = no filter. Useful for feed-scanning to keep only viral posts.",
                        "default": 0
                    },
                    "sinceIso": {
                        "title": "Only posts after this date",
                        "type": "string",
                        "description": "ISO-8601 timestamp (e.g. 2026-01-01T00:00:00Z). Posts older than this are skipped. Leave empty for all posts."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Telegram has very light rate limits on /s/ pages, but Apify proxy is recommended for large runs. The default uses any Apify group.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
