Skip to content

Daemon HTTP surface

Base path: /v1

Status and webhook

GET    /status?live=false
GET    /webhook
POST   /webhook
DELETE /webhook?drop_pending_updates=false

Browse endpoints

GET /chats
GET /chats/{chat_ref}

GET /messages?chat_ref=&search=&media_kind=&limit=
GET /messages/{message_ref}

GET /updates?kind=&source=&status=&limit=
GET /updates/{update_ref}

GET /callbacks?message_ref=&answered=&limit=
GET /callbacks/{callback_ref}

GET /media?message_ref=&chat_ref=&media_kind=&download_status=&limit=
GET /media/{media_ref}

GET /actions?subject_ref=&action_kind=&limit=
GET /actions/{action_ref}

Ingest

POST /updates/ingest

Body:

{
  "bot_ref": "bot:main",
  "source": "inject",
  "update": {"update_id": 1, "message": {...}}
}

Outbound actions

POST /actions/send-text
POST /actions/send-photo
POST /actions/send-document
POST /actions/reply
POST /actions/react
POST /actions/ack
POST /actions/delete
POST /actions/pin
POST /actions/unpin

Polling

POST /poll/once
GET  /poll/schedules
POST /poll/schedules
POST /poll/schedules/run-due
GET  /poll/runs

Notes:

  • POST /poll/schedules is purely local DB state and does not require a live token.
  • POST /poll/once and POST /poll/schedules/run-due require bot_token.
  • GET /status?live=true also requires bot_token; it does not silently fall back to offline status.
  • Poll intervals must be positive, timeout must be non-negative, and Telegram limits must be between 1 and 100.
  • Browse endpoint limit values must be between 1 and 1000.
  • When CALL_BAXTER_INGRESS_TOKEN is configured, bearer authentication is required on every /v1/* endpoint and the authentication scheme is parsed case-insensitively.
  • GET /healthz returns a simple daemon health probe.