How the API changes
- The public API is
/api/v1. Operations in the public document don’t change incompatibly withinv1. New fields, new events and new optional parameters can appear at any time, so ignore what you don’t recognise. - An incompatible change means a new version. The old one keeps working for at least six months after the new one is announced here.
- Endpoints outside the public document are the panel’s own interface and can change without notice.
2026-09-23: conference rooms, and who spoke
- Conference rooms join the public API. Creating and editing rooms, their default members and PIN exemptions, dialling somebody in, a room’s sessions and recordings, and running a room while it is up — mute, kick, lock, record, end — are all in the public document now and change only as versioned changes. They were served and documented before this; what changes today is the commitment. See Conference rooms.
GET /conferences,GET /conferences/{room}andGET /conferences/by-call/{uuid}describe their answers. The document said204with no body for all three, copied from the controls beside them. They are reads and always returned a body: the room, its members and whether you may control it. A client generated before today has a void return type for them and should be regenerated.- A transcript turn gains
speaker: who said it, when several people could have. It carries a name on a conference session a virtual agent sat in, and is empty on an ordinary call, where the caller is the caller. OnGET /conversations/{id}andGET /cdrs/{uuid}/conversation. - Extensions gain
codec_string: the codecs that extension offers, in order, chosen one by one. Empty means its codec profile decides. GET /extensions/{id}— the single read beside the list.- A new webhook event,
conference.minutes: a virtual agent that sat in a room wrote the session’s minutes. It carries the session, the room, who was there, the minutes themselves and where they were sent. One per session in which minutes were written.
2026-09-20: capacity refusals, and a call’s currency
503 node_busyonPOST /callsandPOST /calls/ai, withRetry-After: 30: the call was not placed because the node has no room right now — it is at its channel limit, the machine is loaded, or every AI session it allows is in use. Nothing rang and nothing was billed; send the same request again. This is deliberately not422, which still means the request itself is wrong.- Call records gain
currency: the ISO 4217 code thatsell_amount,cost_amountandmarginare in. It is absent on calls recorded before this date — the field existed and was never filled. - With
margin:read, call records also gaincost_currency,cost_amount_original,fx_rateandcost_unconverted: what the carrier charged in its own currency, the exchange rate applied, and whether a rate was missing. Whencost_unconvertedistrue,marginis not a margin — it is one currency subtracted from another — and must not be shown as money.
2026-09-15: the public API
- Integration keys:
- owned by the organisation, with presets;
- a compulsory IP allowlist;
- per-key rate limits;
Idempotency-Key.
- Calls:
- click-to-call by
from(extension, agent or login email); POST /calls/aifor an AI agent to call someone;referenceand signedcallback_urlon every call;?dry_run=true;GET /calls/{uuid}and/call-requests/{id}.
- click-to-call by
- Campaigns:
- contacts loaded with your references and variables;
- start, pause, resume and stop;
- per-contact results to
result_callback_url, withGET /campaigns/{id}/results.
- Contacts and data:
GET /contacts/lookup;PUT /contacts/by-reference/{ref};GET /cdrs/export.
- Webhooks:
- durable delivery, retried for about 15 hours and switched off after three days of failures;
- redelivery;
- new events:
call.missed,voicemail.received,recording.ready,conversation.completed,callback.requested,ticket.created,ticket.updated,contact.created,campaign.contact.completed,campaign.completed,csat.submitted.
- The Developer section in the panel: console, callback inbox, request log and test numbers.