Skip to main content

How the API changes

  • The public API is /api/v1. Operations in the public document don’t change incompatibly within v1. 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} and GET /conferences/by-call/{uuid} describe their answers. The document said 204 with 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. On GET /conversations/{id} and GET /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_busy on POST /calls and POST /calls/ai, with Retry-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 not 422, which still means the request itself is wrong.
  • Call records gain currency: the ISO 4217 code that sell_amount, cost_amount and margin are in. It is absent on calls recorded before this date — the field existed and was never filled.
  • With margin:read, call records also gain cost_currency, cost_amount_original, fx_rate and cost_unconverted: what the carrier charged in its own currency, the exchange rate applied, and whether a rate was missing. When cost_unconverted is true, margin is 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/ai for an AI agent to call someone;
    • reference and signed callback_url on every call;
    • ?dry_run=true;
    • GET /calls/{uuid} and /call-requests/{id}.
  • Campaigns:
    • contacts loaded with your references and variables;
    • start, pause, resume and stop;
    • per-contact results to result_callback_url, with GET /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.