> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firetone.com.au/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> What changed in the public API, and how changes are made.

## How the API changes

* **The public API is `/api/v1`.** Operations in the
  [public document](/api/reference) 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](/api/conferences).
* **`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.
