Telegram Bot API Skill
Use this skill to run Telegram Bot API operations through uxc + OpenAPI.
Reuse the uxc skill for shared execution, auth, and error-handling guidance.
Prerequisites
uxc is installed and available in PATH.
- Network access to
https://api.telegram.org.
- Access to the curated OpenAPI schema URL:
https://raw.githubusercontent.com/holon-run/uxc/main/skills/telegram-openapi-skill/references/telegram-bot.openapi.json
- A Telegram bot token from BotFather.
Scope
This skill covers a lean bot core surface:
- bot identity and chat lookup
- text sends
- media sends by
file_id, HTTP URL, or local multipart upload
- polling via
getUpdates
- webhook setup/status/delete operations
This skill does not cover:
- multipart media groups with
attach:// file arrays
- generic webhook ingestion/runtime hosting
- the full Telegram Bot API surface
Authentication
Telegram Bot API requires the bot token in the request path: https://api.telegram.org/bot<TOKEN>/METHOD_NAME.
Configure the credential with a request path prefix template:
uxc auth credential set telegram-bot \
--auth-type api_key \
--secret-env TELEGRAM_BOT_TOKEN \
--path-prefix-template "/bot{{secret}}"
uxc auth binding add \
--id telegram-bot \
--host api.telegram.org \
--scheme https \
--credential telegram-bot \
--priority 100
Validate the local mapping when auth looks wrong:
uxc auth binding match https://api.telegram.org/getMe
Core Workflow
Use the fixed link command by default:
command -v telegram-openapi-cli
- If missing, create it:
uxc link telegram-openapi-cli https://api.telegram.org --schema-url https://raw.githubusercontent.com/holon-run/uxc/main/skills/telegram-openapi-skill/references/telegram-bot.openapi.json
telegram-openapi-cli -h
Inspect operation schema first:
telegram-openapi-cli get:/getMe -h
telegram-openapi-cli post:/sendMessage -h
telegram-openapi-cli post:/sendPhoto -h
telegram-openapi-cli post:/sendDocument -h
telegram-openapi-cli post:/getUpdates -h
Prefer read/setup validation before writes:
telegram-openapi-cli get:/getMe
telegram-openapi-cli get:/getWebhookInfo
telegram-openapi-cli get:/getChat chat_id=@channel_or_chat_id
Execute operations with key/value or positional JSON:
- key/value:
telegram-openapi-cli post:/sendMessage chat_id=CHAT_ID text="Hello from uxc"
- multipart upload:
telegram-openapi-cli post:/sendPhoto chat_id=CHAT_ID photo=/tmp/photo.jpg caption="Uploaded by uxc"
- positional JSON:
telegram-openapi-cli post:/sendMessage '{"chat_id":"CHAT_ID","text":"Hello from uxc"}'
- daemon-backed polling subscribe:
uxc subscribe start https://api.telegram.org post:/getUpdates '{"timeout":5,"allowed_updates":["message","callback_query"]}' --mode poll --poll-config '{"interval_secs":2,"extract_items_pointer":"/result","request_cursor_arg":"offset","cursor_from_item_pointer":"/update_id","cursor_transform":"increment","checkpoint_strategy":{"type":"item_key","item_key_pointer":"/update_id"}}' --sink file:/tmp/telegram-updates.ndjson
Runtime Validation
The following Telegram polling flow has been validated against the real Bot API through uxc:
get:/getMe
get:/getWebhookInfo
- daemon-backed
uxc subscribe --mode poll on post:/getUpdates
- item-derived offset progression from
update_id + 1
- dedupe/checkpoint behavior for repeated polls
Observed runtime behavior:
data events are emitted for real Telegram updates
poll events record fetched/emitted/skipped counts
checkpoint events are emitted after new updates are seen
- repeated polls skip already-consumed updates after checkpoint advancement
Operation Groups
Read / Lookup
get:/getMe
get:/getChat
get:/getChatMember
get:/getWebhookInfo
Messaging
post:/sendMessage
post:/sendPhoto
post:/sendDocument
post:/sendMediaGroup
Update Delivery
post:/getUpdates
post:/setWebhook
post:/deleteWebhook
Guardrails
- Keep automation on the JSON output envelope; do not use
--text.
- Parse stable fields first:
ok, kind, protocol, data, error.
getUpdates and webhook delivery are mutually exclusive:
- if a webhook is configured, call
post:/deleteWebhook before polling with post:/getUpdates
- if polling is active, do not treat webhook operations as background subscription support
- Telegram allows only one active
getUpdates consumer per bot token:
- if another bot process or script is polling at the same time, Telegram returns HTTP 409
- stop the other consumer before relying on daemon-backed polling subscribe
- For daemon-backed polling subscribe, prefer item-derived offset progression:
extract_items_pointer should be /result
request_cursor_arg should be offset
cursor_from_item_pointer should be /update_id
cursor_transform should be increment
checkpoint_strategy.type should usually be item_key with item_key_pointer=/update_id
uxc auth binding match should be checked against a concrete Telegram method URL such as https://api.telegram.org/getMe, because auth is applied through a path-prefix template that expands to /bot<TOKEN>/....
sendPhoto, sendDocument, and sendMediaGroup in this skill accept existing file_id values or HTTP URLs only; they do not upload new local files.
sendPhoto and sendDocument also support multipart/form-data local file uploads. File fields must be local path strings.
sendMediaGroup still stays JSON-only in this skill because current multipart v1 does not model the media array plus attach:// file set cleanly.
setWebhook supports multipart certificate upload for self-signed certs through the certificate file field.
- Treat
post:/sendMessage, all send* operations, and webhook-changing operations as write/high-risk actions; require explicit user confirmation before execution.
telegram-openapi-cli <operation> ... is equivalent to uxc https://api.telegram.org --schema-url <telegram_openapi_schema> <operation> ....
References
1---2name: telegram-openapi-skill3description: Operate Telegram Bot API through UXC with a curated OpenAPI schema, bot-token path auth, polling-based reads, and webhook management guardrails.4---56# Telegram Bot API Skill78Use this skill to run Telegram Bot API operations through `uxc` + OpenAPI.910Reuse the `uxc` skill for shared execution, auth, and error-handling guidance.1112## Prerequisites1314- `uxc` is installed and available in `PATH`.15- Network access to `https://api.telegram.org`.16- Access to the curated OpenAPI schema URL:17 - `https://raw.githubusercontent.com/holon-run/uxc/main/skills/telegram-openapi-skill/references/telegram-bot.openapi.json`18- A Telegram bot token from BotFather.1920## Scope2122This skill covers a lean bot core surface:2324- bot identity and chat lookup25- text sends26- media sends by `file_id`, HTTP URL, or local multipart upload27- polling via `getUpdates`28- webhook setup/status/delete operations2930This skill does **not** cover:3132- multipart media groups with `attach://` file arrays33- generic webhook ingestion/runtime hosting34- the full Telegram Bot API surface3536## Authentication3738Telegram Bot API requires the bot token in the request path: `https://api.telegram.org/bot<TOKEN>/METHOD_NAME`.3940Configure the credential with a request path prefix template:4142```bash43uxc auth credential set telegram-bot \44 --auth-type api_key \45 --secret-env TELEGRAM_BOT_TOKEN \46 --path-prefix-template "/bot{{secret}}"4748uxc auth binding add \49 --id telegram-bot \50 --host api.telegram.org \51 --scheme https \52 --credential telegram-bot \53 --priority 10054```5556Validate the local mapping when auth looks wrong:5758```bash59uxc auth binding match https://api.telegram.org/getMe60```6162## Core Workflow63641. Use the fixed link command by default:65 - `command -v telegram-openapi-cli`66 - If missing, create it:67 `uxc link telegram-openapi-cli https://api.telegram.org --schema-url https://raw.githubusercontent.com/holon-run/uxc/main/skills/telegram-openapi-skill/references/telegram-bot.openapi.json`68 - `telegram-openapi-cli -h`69702. Inspect operation schema first:71 - `telegram-openapi-cli get:/getMe -h`72 - `telegram-openapi-cli post:/sendMessage -h`73 - `telegram-openapi-cli post:/sendPhoto -h`74 - `telegram-openapi-cli post:/sendDocument -h`75 - `telegram-openapi-cli post:/getUpdates -h`76773. Prefer read/setup validation before writes:78 - `telegram-openapi-cli get:/getMe`79 - `telegram-openapi-cli get:/getWebhookInfo`80 - `telegram-openapi-cli get:/getChat chat_id=@channel_or_chat_id`81824. Execute operations with key/value or positional JSON:83 - key/value:84 `telegram-openapi-cli post:/sendMessage chat_id=CHAT_ID text="Hello from uxc"`85 - multipart upload:86 `telegram-openapi-cli post:/sendPhoto chat_id=CHAT_ID photo=/tmp/photo.jpg caption="Uploaded by uxc"`87 - positional JSON:88 `telegram-openapi-cli post:/sendMessage '{"chat_id":"CHAT_ID","text":"Hello from uxc"}'`89 - daemon-backed polling subscribe:90 `uxc subscribe start https://api.telegram.org post:/getUpdates '{"timeout":5,"allowed_updates":["message","callback_query"]}' --mode poll --poll-config '{"interval_secs":2,"extract_items_pointer":"/result","request_cursor_arg":"offset","cursor_from_item_pointer":"/update_id","cursor_transform":"increment","checkpoint_strategy":{"type":"item_key","item_key_pointer":"/update_id"}}' --sink file:/tmp/telegram-updates.ndjson`9192## Runtime Validation9394The following Telegram polling flow has been validated against the real Bot API through `uxc`:9596- `get:/getMe`97- `get:/getWebhookInfo`98- daemon-backed `uxc subscribe --mode poll` on `post:/getUpdates`99- item-derived offset progression from `update_id + 1`100- dedupe/checkpoint behavior for repeated polls101102Observed runtime behavior:103104- `data` events are emitted for real Telegram updates105- `poll` events record fetched/emitted/skipped counts106- `checkpoint` events are emitted after new updates are seen107- repeated polls skip already-consumed updates after checkpoint advancement108109## Operation Groups110111### Read / Lookup112113- `get:/getMe`114- `get:/getChat`115- `get:/getChatMember`116- `get:/getWebhookInfo`117118### Messaging119120- `post:/sendMessage`121- `post:/sendPhoto`122- `post:/sendDocument`123- `post:/sendMediaGroup`124125### Update Delivery126127- `post:/getUpdates`128- `post:/setWebhook`129- `post:/deleteWebhook`130131## Guardrails132133- Keep automation on the JSON output envelope; do not use `--text`.134- Parse stable fields first: `ok`, `kind`, `protocol`, `data`, `error`.135- `getUpdates` and webhook delivery are mutually exclusive:136 - if a webhook is configured, call `post:/deleteWebhook` before polling with `post:/getUpdates`137 - if polling is active, do not treat webhook operations as background subscription support138- Telegram allows only one active `getUpdates` consumer per bot token:139 - if another bot process or script is polling at the same time, Telegram returns HTTP 409140 - stop the other consumer before relying on daemon-backed polling subscribe141- For daemon-backed polling subscribe, prefer item-derived offset progression:142 - `extract_items_pointer` should be `/result`143 - `request_cursor_arg` should be `offset`144 - `cursor_from_item_pointer` should be `/update_id`145 - `cursor_transform` should be `increment`146 - `checkpoint_strategy.type` should usually be `item_key` with `item_key_pointer=/update_id`147- `uxc auth binding match` should be checked against a concrete Telegram method URL such as `https://api.telegram.org/getMe`, because auth is applied through a path-prefix template that expands to `/bot<TOKEN>/...`.148- `sendPhoto`, `sendDocument`, and `sendMediaGroup` in this skill accept existing `file_id` values or HTTP URLs only; they do not upload new local files.149- `sendPhoto` and `sendDocument` also support `multipart/form-data` local file uploads. File fields must be local path strings.150- `sendMediaGroup` still stays JSON-only in this skill because current multipart v1 does not model the `media` array plus `attach://` file set cleanly.151- `setWebhook` supports multipart certificate upload for self-signed certs through the `certificate` file field.152- Treat `post:/sendMessage`, all `send*` operations, and webhook-changing operations as write/high-risk actions; require explicit user confirmation before execution.153- `telegram-openapi-cli <operation> ...` is equivalent to `uxc https://api.telegram.org --schema-url <telegram_openapi_schema> <operation> ...`.154155## References156157- Usage patterns: `references/usage-patterns.md`158- Curated OpenAPI schema: `references/telegram-bot.openapi.json`159- Telegram Bot API docs: https://core.telegram.org/bots/api160- Local Bot API server: https://github.com/tdlib/telegram-bot-api