Highlights
Base URL and authentication
Base URL and authentication
401 Access denied.POST /v2/agent and POST /batches return 201, not 200
POST /v2/agent and POST /batches return 201, not 200
Both return
201 Created. The agent-create response field is state, not status. The legacy v1 /agent endpoint returns 200 — only v2 returns 201.scheduled_at must use +00:00, not Z
scheduled_at must use +00:00, not Z
A trailing
Z for UTC is rejected with a 500 error. Use a numeric offset instead, e.g. 2026-06-23T15:30:00+00:00. Scheduling must also be at least 2 minutes in the future, and Bolna rounds up to the next 10-minute mark.Wait for completed, not call-disconnected
Wait for completed, not call-disconnected
call-disconnected fires the instant the line drops — at that moment conversation_duration, total_cost, recording_url, and extracted_data are still null or 0. The completed event arrives a few seconds later with all fields populated.toolchain.pipelines is an array of arrays
toolchain.pipelines is an array of arrays
Not an array of strings. Correct shape:
"pipelines": [["transcriber", "llm", "synthesizer"]].GET /batches/{batch_id}/executions returns a bare array
GET /batches/{batch_id}/executions returns a bare array
Not wrapped in
{ "data": [...] } — the response is the array directly.Webhook source IP
Webhook source IP
Bolna sends webhooks from
13.203.39.153. Whitelist this IP or events will be dropped.What else is in the file
- The full execution status lifecycle (
queued → initiated → ringing → in-progress → call-disconnected → completed, plus terminal states) - The batch status lifecycle
- A minimal working agent creation body
- A key endpoint summary table

