# FireTone - [FireTone](https://docs.firetone.com.au/index.md): A multi-tenant cloud phone system: inbound services, outbound campaigns, and AI that answers, assists and is billed for. - [What FireTone is](https://docs.firetone.com.au/guides/what-is-firetone.md): The model the whole product is built on, in one page. - [Signing in](https://docs.firetone.com.au/guides/signing-in.md): Two doors, on purpose: one for staff, one for the people on the phones. - [Roles](https://docs.firetone.com.au/guides/roles.md): Four roles on one axis, and what each is deliberately kept away from. - [The overview](https://docs.firetone.com.au/guides/your-overview.md): The first screen after you sign in: what is happening right now, and what the machines are doing about it. - [Recording, and what is kept](https://docs.firetone.com.au/guides/recording-and-retention.md): The one rule that decides whether a call is recorded, where the audio lives, and how long anything is kept. - [Your first campaign](https://docs.firetone.com.au/guides/first-campaign.md): From an empty tenant to a broadcast that has rung somebody, end to end. - [Processes](https://docs.firetone.com.au/tenant/inbound/processes.md): One named inbound service: its numbers, its hours, its workflow and where a caller lands when the workflow does not take them. - [Phone numbers](https://docs.firetone.com.au/tenant/inbound/numbers.md): The numbers you own, what each one reaches, and the wizard that sets one up. - [Queues](https://docs.firetone.com.au/tenant/inbound/queues.md): Where an inbound caller waits, who is offered the call, and what today's queue actually does with the strategy you chose. - [Conference rooms](https://docs.firetone.com.au/tenant/inbound/conferences.md): Dial-in bridges your organisation owns: a number, a PIN, and a moderator who can run the room. - [Call history](https://docs.firetone.com.au/tenant/inbound/call-history.md): Every call the organisation has made or taken, and the page that answers how one of them went and why it went there. - [Voice broadcasting](https://docs.firetone.com.au/tenant/outbound/voice-broadcasting.md): Play a message to whoever answers. No agent, so nobody is ever left holding. - [Automatic dialler](https://docs.firetone.com.au/tenant/outbound/automatic-dialer.md): Call a list and connect whoever answers to a free agent, at a pace that matches how many are actually free. - [Contacts](https://docs.firetone.com.au/tenant/outbound/contacts.md): Everyone who has called or been called, and what you know about them. - [Segments](https://docs.firetone.com.au/tenant/outbound/segments.md): A named group of contacts, reusable across campaigns. - [IVR flows](https://docs.firetone.com.au/tenant/design/ivr-flows.md): The graph that answers a call: greetings, menus, time checks, actions and destinations. - [The audio library](https://docs.firetone.com.au/tenant/inbound/audio.md): Every recording the organisation has: prompts a flow plays, and the music a caller hears while waiting. - [Apps, actions and skills](https://docs.firetone.com.au/tenant/design/apps-and-actions.md): What lets "press 1 to book" and "I'd like to book" reach the same code, and what decides which of those a virtual agent may do. - [Outbound routing](https://docs.firetone.com.au/tenant/design/routing.md): Which carrier an outgoing call uses, and in what order. - [Voicemail](https://docs.firetone.com.au/tenant/customers/voicemail.md): Where messages come from, what makes one appear in the inbox, and the difference between reading a message and hearing it. - [Tickets](https://docs.firetone.com.au/tenant/customers/tickets.md): Work a call leaves behind, raised by a person, a virtual agent or a flow, with who wrote it recorded on every one. - [Conversations](https://docs.firetone.com.au/tenant/customers/conversations.md): What was said on a call, as text, with a post-call review that flags what an AI agent should not have said. - [Satisfaction](https://docs.firetone.com.au/tenant/customers/satisfaction.md): How a caller is asked to rate a call, and why a spoken score and a pressed digit are counted separately. - [Extensions](https://docs.firetone.com.au/tenant/phone-system/extensions.md): The handsets and softphones that register with FireTone. - [Dialling out](https://docs.firetone.com.au/tenant/phone-system/dialling.md): How FireTone reads the number somebody dials, and what it refuses. - [Integrations](https://docs.firetone.com.au/tenant/phone-system/integrations.md): Look callers up in your own system during a call, and receive call events as they happen. - [SMS](https://docs.firetone.com.au/tenant/phone-system/sms.md): Text messages through your own FireFlo account: sender IDs, templates, and what was sent. - [Teams & agents](https://docs.firetone.com.au/tenant/phone-system/teams-and-agents.md): Who takes calls, and what a team actually is. - [Trunks](https://docs.firetone.com.au/tenant/phone-system/trunks.md): The carriers that carry your calls. - [Settings](https://docs.firetone.com.au/tenant/phone-system/settings.md): Your own sign-in, who else may sign in, and the connections to your own systems. A tab you cannot see is a tab with nothing behind it. - [Virtual agents](https://docs.firetone.com.au/tenant/ai/virtual-agents.md): An AI that answers the phone, holds the conversation and can act. - [Knowledge base](https://docs.firetone.com.au/tenant/ai/knowledge-base.md): What your AI agents may tell callers, and nothing else. - [Live assist](https://docs.firetone.com.au/tenant/ai/live-assist.md): An AI that listens to a call between two people and writes suggestions to the agent's screen. - [What AI costs](https://docs.firetone.com.au/tenant/ai/what-ai-costs.md): Tokens, where they are counted, and how to read a figure that is approximate. - [Billing](https://docs.firetone.com.au/tenant/billing.md): What the organisation has been charged, what is left, and why two of the figures on the screen say withheld rather than zero. - [Signing in](https://docs.firetone.com.au/agent/signing-in.md): Your extension and your PIN, at the start of a shift. - [Your desk](https://docs.firetone.com.au/agent/your-desk.md): What is on screen while you work. - [The phone in your browser](https://docs.firetone.com.au/agent/the-phone.md): Answering, dialling and handling calls without a handset. - [Who you are talking to](https://docs.firetone.com.au/agent/who-you-are-talking-to.md): The customer's details, the moment the call connects. - [What the AI already asked them](https://docs.firetone.com.au/agent/before-you-picked-up.md): When a call is handed to you by an AI, read this first. - [Recording an outcome](https://docs.firetone.com.au/agent/recording-an-outcome.md): What came of the call, in the form your organisation designed. - [Your call history](https://docs.firetone.com.au/agent/call-history.md): Every call you have taken or made, and the page that answers what happened on one of them. - [Your voicemail](https://docs.firetone.com.au/agent/voicemail.md): Messages left for your extension and for your queues, what the transcript status means, and what you cannot change about one. - [The directory](https://docs.firetone.com.au/agent/directory.md): Your colleagues, the three different things the panel means by available, and calling one of them. - [Tickets and conversations](https://docs.firetone.com.au/agent/tickets-and-conversations.md): The two records a call leaves behind that you can read: the work it raised, and what was said. - [What a supervisor can do](https://docs.firetone.com.au/supervisor/what-you-can-do.md): Oversight that comes from scope rather than from extra powers, and the one line that says which of your screens is your team's and which is the whole tenant's. - [Listening in on a live call](https://docs.firetone.com.au/supervisor/listening-in.md): Three ways to join a call your agent is on, the tone both parties hear, and the mark it leaves on the call afterwards. - [Queues, rosters and budgets](https://docs.firetone.com.au/supervisor/queues-and-teams.md): What you may change about how calls are distributed, what stays with the organisation admin, and the one thing about team budgets worth checking before you rely on one. - [Satisfaction](https://docs.firetone.com.au/supervisor/satisfaction.md): Scores by agent and by team, and the one rule that keeps a spoken score and a pressed digit from being averaged into a number that means neither. - [Running a live conference](https://docs.firetone.com.au/supervisor/live-conferences.md): Mute, kick, lock, record and end a room that is happening now, without being able to create one. - [FireTone Agent](https://docs.firetone.com.au/mobile/index.md): The FireTone softphone for Android and iPhone: what it is, and what it replaces. - [Installing it](https://docs.firetone.com.au/mobile/installing.md): Getting the app onto a phone, and the permissions it asks for. - [Connecting to your PBX](https://docs.firetone.com.au/mobile/connecting.md): The SIP account screen: credentials, transport, codecs, and proving it registered. - [During a call](https://docs.firetone.com.au/mobile/in-a-call.md): The in-call screen: mute, keypad, audio route, hold, a second call, and recording. - [History and people](https://docs.firetone.com.au/mobile/recents-and-contacts.md): The call log, filters, your address book, favourites, and per-contact settings. - [Recording calls](https://docs.firetone.com.au/mobile/recording.md): What gets recorded, who decides, and where the files go. - [The intercom](https://docs.firetone.com.au/mobile/intercom.md): Push-to-talk into a SIP conference room, with the microphone off until you hold the button. - [Settings](https://docs.firetone.com.au/mobile/settings.md): Every row on the settings screen and what it controls. - [Audio and diagnostics](https://docs.firetone.com.au/mobile/audio-and-diagnostics.md): Choosing and testing the speaker and microphone, and reading the SIP log when a call will not connect. - [What it does not do yet](https://docs.firetone.com.au/mobile/limitations.md): The honest list: what is missing, what is built but unproven, and what the platform will not allow. - [Organisations](https://docs.firetone.com.au/operator/organisations.md): The tenants on your platform. - [Email](https://docs.firetone.com.au/operator/email.md): Your SMTP server, the templates every email uses, and what was sent. - [Mobile push](https://docs.firetone.com.au/operator/mobile-push.md): Waking the FireTone app for an incoming call when the phone is in a pocket - [Trunks and rate cards](https://docs.firetone.com.au/operator/trunks-and-rates.md): Carriers, what they cost you, and what you charge for them. - [Outbound routing](https://docs.firetone.com.au/operator/outbound-routing.md): Which carrier an organisation's outgoing call uses, in the order the switch decides it. - [AI pricing](https://docs.firetone.com.au/operator/ai-pricing.md): What a model costs per million tokens, and who is charged. - [Billing](https://docs.firetone.com.au/operator/billing.md): Balances, what a period came to, and reading a figure that is withheld. - [The fleet](https://docs.firetone.com.au/operator/fleet.md): The machines carrying calls, the limits that protect them, and what happens at each. - [Blocking addresses](https://docs.firetone.com.au/operator/blocking.md): What the Bans page shows, the one list that is never blocked, and the blocks the platform places on its own. - [Alerts](https://docs.firetone.com.au/operator/alerts.md): The toll-fraud alarm: two measurements over a sliding hour, on by default, and what an operator does when one fires. - [Logs](https://docs.firetone.com.au/operator/audit-and-logs.md): Three questions in one screen: why somebody cannot sign in, who changed a thing, and what the machine is actually doing. - [Choosing table columns](https://docs.firetone.com.au/operator/table-columns.md): Every list in the panel shows the columns you pick. - [Modules](https://docs.firetone.com.au/operator/modules.md): The optional parts of FireTone, the two switches in series that decide whether one runs, and what switching one off actually stops. - [Installing FireTone](https://docs.firetone.com.au/operator/installing.md): What runs where, and the order to bring it up in. - [Every setting](https://docs.firetone.com.au/operator/settings.md): The FIRETONE_* environment the daemon reads. - [Quickstart](https://docs.firetone.com.au/api/quickstart.md): From nothing to a signed callback in about ten minutes. - [Authentication](https://docs.firetone.com.au/api/authentication.md): Getting a token, and what a token can do. - [Conventions](https://docs.firetone.com.au/api/conventions.md): Paging, filtering, money, and the difference between absent and zero. - [Errors and limits](https://docs.firetone.com.au/api/errors.md): Every error code, what it means, and whether to retry. - [Placing calls](https://docs.firetone.com.au/api/calls.md): Click-to-call from your CRM, an AI agent ringing a lead, and hearing how each call went. - [Conference rooms](https://docs.firetone.com.au/api/conferences.md): Create dial-in rooms, put people in them, and run a room while it is up: mute, kick, lock, record, end. - [Running campaigns](https://docs.firetone.com.au/api/campaigns.md): Load contacts from your system, start and stop the campaign, and get each contact's result back. - [Contacts and call data](https://docs.firetone.com.au/api/contacts-and-data.md): Screen-pop by number, keep contacts in step with your CRM, and export calls. - [Webhooks](https://docs.firetone.com.au/api/webhooks.md): Every event, what it carries, how it's signed and delivered. - [Live events](https://docs.firetone.com.au/api/events.md): A WebSocket of what happens as it happens: for wallboards and screen-pops. - [Recipes](https://docs.firetone.com.au/api/recipes.md): The common integrations, end to end. - [The Developer section](https://docs.firetone.com.au/api/developer.md): Keys, the console, the callback inbox, the request log and test numbers, in your panel. - [Reference](https://docs.firetone.com.au/api/reference.md): The public API's OpenAPI document, and where it lives. - [Changelog](https://docs.firetone.com.au/api/changelog.md): What changed in the public API, and how changes are made. - [List agents](https://docs.firetone.com.au/api-reference/provisioning/list-agents.md): Sort keys: created_at, kind, name, number, status. An unknown sort key is a 400. - [List conference rooms](https://docs.firetone.com.au/api-reference/provisioning/list-conference-rooms.md): Dial-in bridges the organisation owns. A room has a number inside the organisation (what an extension dials, and what a caller keys when a shared 'conference' phone number asks which room), a participant PIN and, optionally, a moderator PIN. The PINs are returned: they are invitation codes, not cred… - [Create a conference room](https://docs.firetone.com.au/api-reference/provisioning/create-a-conference-room.md): Refused in words when the number is not 2-8 digits, a PIN is not 4-10 digits, or the two PINs are equal (every caller would be a moderator). A room may wait for a moderator with no moderator PIN when an exempt extension joins as one. Name and number are each unique within the organisation. - [Get a conference room](https://docs.firetone.com.au/api-reference/provisioning/get-a-conference-room.md) - [Delete a conference room](https://docs.firetone.com.au/api-reference/provisioning/delete-a-conference-room.md): Refused with 409 while a phone number points at the room: a number pointing at a deleted room rings into nothing, and the database will not say so. - [Update a conference room](https://docs.firetone.com.au/api-reference/provisioning/update-a-conference-room.md): Every field optional. The PINs are judged together as they will be after the change, so a patch that makes them equal is refused. `moderator_pin: ""` removes the moderator role. - [Dial somebody into a room](https://docs.firetone.com.au/api-reference/provisioning/dial-somebody-into-a-room.md): Places a call to an extension of the organisation (`kind: extension`, `target` the number) or to an outside number (`kind: external`, `target` in E.164) and, when it is answered, seats the person in the room in `role` (participant or moderator) WITHOUT asking for a PIN -- the role travels as a chann… - [Set which extensions need no PIN for a room](https://docs.firetone.com.au/api-reference/provisioning/set-which-extensions-need-no-pin-for-a-room.md): Replaces the whole set: the organisation's extensions that dial the room number and are seated without keying anything, each in its role (participant by default, or moderator). Only a leg the directory authenticated carries an extension, so nobody from outside can claim an exemption. Every extension… - [Which of a room's sessions a virtual agent sat in](https://docs.firetone.com.au/api-reference/provisioning/which-of-a-rooms-sessions-a-virtual-agent-sat-in.md): Served by the AI module. One row per seat, newest session first: the agent, its state, whether minutes exist or why not, and how many notes and transcript lines there are. One read for a room's history page in place of one per session. - [Set a room's default members](https://docs.firetone.com.au/api-reference/provisioning/set-a-rooms-default-members.md): Replaces the whole set: the organisation's extensions rung when the room opens, each in its role (participant by default, or moderator). A busy, unregistered or unanswered member is tried again a minute later, five times, then given up on; one who joined and dropped off while the room is up is rung… - [A room's history](https://docs.firetone.com.au/api-reference/provisioning/a-rooms-history.md): Every occupancy of the room, newest first: when it ran, how many were in it at most, who was in it with their roles and times, and whether a recording exists (has_recording, recording_bytes). Paged. - [What the virtual agent made of a session](https://docs.firetone.com.au/api-reference/provisioning/what-the-virtual-agent-made-of-a-session.md): Served by the AI module. When a virtual agent's extension was a default member and sat in this session: the minutes it wrote when the room closed, the notes it took as things were decided, who said what (each caller turn attributed to who was speaking, approximate), how many of its replies were held… - [Play a session's recording](https://docs.firetone.com.au/api-reference/provisioning/play-a-sessions-recording.md): The WAV, from the node's disk or the organisation's bucket, with Range support. recordings:listen, because it is somebody's conversation; scoped by the room's organisation. - [List extensions](https://docs.firetone.com.au/api-reference/provisioning/list-extensions.md): SIP passwords are never included. Sort keys: caller_id_name, created_at, enabled, number. An unknown sort key is a 400. - [One extension](https://docs.firetone.com.au/api-reference/provisioning/one-extension.md) - [List virtual agent profiles](https://docs.firetone.com.au/api-reference/provisioning/list-virtual-agent-profiles.md): Sort keys: created_at, name, provider. An unknown sort key is a 400. - [Resolved scope for the current token](https://docs.firetone.com.au/api-reference/auth/resolved-scope-for-the-current-token.md) - [A call request's progress](https://docs.firetone.com.au/api-reference/live/a-call-requests-progress.md): What an API-placed call is doing: dialing, connected (with call_uuid), completed, or failed (with failure). Requires calls:read. - [Click to call](https://docs.firetone.com.au/api-reference/live/click-to-call.md): Answers once the agent has picked up (up to 30 seconds); ?dry_run=true checks instead -- the extension has a phone registered to ring, the number resolves, an outside number has a route and credit -- and returns the plan, placing nothing. Rings the agent first, then dials the destination when they a… - [Live channels](https://docs.firetone.com.au/api-reference/live/live-channels.md): Read from FreeSWITCH on every request, never cached: the switch is the only thing that knows, and a cached copy is wrong the moment a call ends. - [An AI agent calls a number](https://docs.firetone.com.au/api-reference/live/an-ai-agent-calls-a-number.md): The profile's virtual agent rings `to` from `caller_id` (one of your numbers; optional when you have exactly one) and talks to whoever answers, with `variables` in its brief as what it knows about this call. Answers 202 at once: the dial happens in the background, and how it went is posted to callba… - [One call](https://docs.firetone.com.au/api-reference/live/one-call.md): state live (from the switch, while it lasts) or ended (from its record): who, when, the hangup cause, your reference, and the recording's URL when there is one. Requires calls:read. - [Hang up a live call](https://docs.firetone.com.au/api-reference/live/hang-up-a-live-call.md) - [What was posted to a call's callback URL](https://docs.firetone.com.au/api-reference/live/what-was-posted-to-a-calls-callback-url.md): The call's callback deliveries, as the webhook delivery log shows them. The call uuid or its request id. Requires calls:read. - [Put a live call on hold](https://docs.firetone.com.au/api-reference/live/put-a-live-call-on-hold.md): States the wanted state rather than toggling. uuid_hold toggles by default, which is the wrong shape for an API: two clients disagreeing about the current state would flip it back and forth. Requires calls:control. - [Transfer a live call to an extension or queue](https://docs.firetone.com.au/api-reference/live/transfer-a-live-call-to-an-extension-or-queue.md): Blind transfer. NEVER external, and that is a policy rather than an omission: an agent transferring a customer to a premium-rate number is toll fraud billed to their own employer, and a blind transfer hands the call away entirely, so unlike a conference leg there is nothing left to observe. The same… - [Take a live call off hold](https://docs.firetone.com.au/api-reference/live/take-a-live-call-off-hold.md): States the wanted state rather than toggling. uuid_hold toggles by default, which is the wrong shape for an API: two clients disagreeing about the current state would flip it back and forth. Requires calls:control. - [WebSocket event stream](https://docs.firetone.com.au/api-reference/live/websocket-event-stream.md): Upgrade to a WebSocket. Events are filtered by the same scope as REST, so a panel never receives an organisation it could not query. The server pings every 30 seconds; reconnect on close. Events travel through Redis pub/sub, so a panel connected to one instance still sees calls handled by another. - [Merge two of your calls, or dial a third party into this one](https://docs.firetone.com.au/api-reference/calls/merge-two-of-your-calls-or-dial-a-third-party-into-this-one.md): Two shapes, chosen by the body. - [Get one call](https://docs.firetone.com.au/api-reference/calls/get-one-call.md): One CDR, including the contact it was with. Cost and margin are withheld unless the caller holds billing:margin, exactly as in the list. - [Download the recording](https://docs.firetone.com.au/api-reference/calls/download-the-recording.md): The audio itself, streamed, with Content-Disposition set so a browser saves it. Separate from /recording, which returns metadata for a list and is cheap; this streams megabytes. Supports Range requests so an audio player can seek without fetching the whole file. The stored path is confined to the re… - [Rooms live right now](https://docs.firetone.com.au/api-reference/calls/rooms-live-right-now.md): Every open conference session in the caller's scope, dial-in and merged alike, with the member count. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs con… - [The live room a call is in](https://docs.firetone.com.au/api-reference/calls/the-live-room-a-call-is-in.md): For the Desk: a call that was merged shows its room's participants beside its own controls. 404 when the call is in no room. - [Who is in a room now](https://docs.firetone.com.au/api-reference/calls/who-is-in-a-room-now.md): The switch's members (id, call uuid, name, number, muted, talking, joined_at) with the daemon's roles folded in, plus the session's locked, recording and all_muted state and whether THIS caller may control the room. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-… - [End a room](https://docs.firetone.com.au/api-reference/calls/end-a-room.md): Everybody is hung up; the room is destroyed and its session closed. conference kick all. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs conferenc… - [Lock a room](https://docs.firetone.com.au/api-reference/calls/lock-a-room.md): No new participant may join; a moderator still may. conference lock. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs conferences:read; acting on i… - [Remove a member](https://docs.firetone.com.au/api-reference/calls/remove-a-member.md): conference kick : the leg is hung up. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs conferences:read; acting on it conferences:control -… - [Mute a member](https://docs.firetone.com.au/api-reference/calls/mute-a-member.md): conference mute . member is the switch's member id from GET /conferences/{room}. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs conferenc… - [Unmute a member](https://docs.firetone.com.au/api-reference/calls/unmute-a-member.md): conference unmute . Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs conferences:read; acting on it conferences:control -- or being in it.… - [Mute or unmute everyone but the moderators](https://docs.firetone.com.au/api-reference/calls/mute-or-unmute-everyone-but-the-moderators.md): A toggle, as *7 is from a moderator's keypad; the state is the session's so every moderator sees the same toggle. Answers {all_muted}. - [Start or stop recording a room](https://docs.firetone.com.au/api-reference/calls/start-or-stop-recording-a-room.md): Body {on: true|false}. Records the MIX into conf-.wav in the recordings directory (conference record ); stopping is norecord. The file belongs to the session, not to any participant's call, and is checked, uploaded and aged as a call recording is. A room whose `record` flag is… - [Unlock a room](https://docs.firetone.com.au/api-reference/calls/unlock-a-room.md): conference unlock. Live rooms are keyed by the SWITCH'S room name (ft-room- for a dial-in room, ft-conf- for a merged call), so a merged call gets the same list and controls. Reading a dial-in room needs conferences:read; acting on it conferences:control -- or being in it. A merged… - [List campaigns](https://docs.firetone.com.au/api-reference/campaigns/list-campaigns.md): Orchestrated outbound. Manual dial is deliberately NOT a campaign: an agent dialling a number is ad-hoc, and forcing it into this table would create a row for every click-to-call. Sort keys: created_at, dialed, kind, name, status. - [Create a campaign](https://docs.firetone.com.au/api-reference/campaigns/create-a-campaign.md): A campaign is created in `draft`. It cannot be started: see PATCH. - [Get one campaign](https://docs.firetone.com.au/api-reference/campaigns/get-one-campaign.md) - [Update a campaign](https://docs.firetone.com.au/api-reference/campaigns/update-a-campaign.md): Partial. Setting `status` to `running` starts the dialer, and is refused with 422 when the runtime could not honour it: a campaign with no contacts left to call, a voice broadcast with no recorded message (text-to-speech and AI scripts are not built), or a kind with no handler. The checks are about… - [The campaign's call list](https://docs.firetone.com.au/api-reference/campaigns/the-campaigns-call-list.md): Paged, sortable and searchable, because this is what an operator reads BEFORE launching a campaign rather than a diagnostic dump afterwards. It was capped at 500 with no paging, no sort and no filter: a list of fifty thousand showed the first five hundred by state and gave no way to find anybody, wh… - [Load contacts into a campaign](https://docs.firetone.com.au/api-reference/campaigns/load-contacts-into-a-campaign.md): Takes contact ids, not numbers: a campaign must not conjure customer records as a side effect of being filled in. Idempotent -- a contact already on the list is skipped. At most 10,000 per request. - [What agents recorded about this campaign's calls](https://docs.firetone.com.au/api-reference/campaigns/what-agents-recorded-about-this-campaigns-calls.md): Paged. An agent reads back what THEY recorded rather than the floor's; a supervisor sees their teams. The campaign's form supplies the field ORDER -- the answers cannot, because they are a jsonb object and jsonb does not preserve key order, a defect this codebase has already paid for once on the age… - [Pause a campaign](https://docs.firetone.com.au/api-reference/campaigns/pause-a-campaign.md): Running to paused: no new calls; calls in progress finish. 409 wrong_status names the status it must be in; 422 not_ready says what is missing. Requires campaigns:write. - [Each contact's final outcome](https://docs.firetone.com.au/api-reference/campaigns/each-contacts-final-outcome.md): Newest first. A contact's outcome is final when nothing more will be done: done, or every attempt used. outcome is reached, not_reached, bad_number, suppressed, failed or unknown; disposition is the exact result. The same data campaign.contact.completed carried -- read this to catch up after a misse… - [Resume a campaign](https://docs.firetone.com.au/api-reference/campaigns/resume-a-campaign.md): Paused to running. 409 wrong_status names the status it must be in; 422 not_ready says what is missing. Requires campaigns:write. - [Start a campaign](https://docs.firetone.com.au/api-reference/campaigns/start-a-campaign.md): From draft to running: the dialer starts within seconds, inside the calling window. Refused while it cannot run (no message, no contacts left, a kind without its pieces). 409 wrong_status names the status it must be in; 422 not_ready says what is missing. Requires campaigns:write. - [What a campaign is doing right now](https://docs.firetone.com.au/api-reference/campaigns/what-a-campaign-is-doing-right-now.md): Meant to be polled while a campaign runs. In flight is counted from leased contacts rather than from live channels: the dialer sets a campaign id as a channel variable, but the switch's channel listing does not surface custom variables, so it cannot be filtered by campaign. - [Stop a campaign](https://docs.firetone.com.au/api-reference/campaigns/stop-a-campaign.md): To completed, whatever is left: campaign.completed is sent with why=stopped and the totals so far. 409 wrong_status names the status it must be in; 422 not_ready says what is missing. Requires campaigns:write. - [List call detail records](https://docs.firetone.com.au/api-reference/reporting/list-call-detail-records.md): Newest first. A team_supervisor or agent is restricted to their own team regardless of filters. Sort keys: billsec, caller_number, destination_number, direction, ended_at, sell_amount, started_at. An unknown sort key is a 400. - [Export a period's calls](https://docs.firetone.com.au/api-reference/reporting/export-a-periods-calls.md): Streamed, oldest first: CSV (a header row, then one row per call) or NDJSON (one JSON object per line). At most 31 days per request. Columns: call_uuid, organisation_id, direction, caller_number, destination_number, dialled_number, started_at, answered_at, ended_at, duration_sec, billsec, hangup_cau… - [The conversation for a call](https://docs.firetone.com.au/api-reference/conversations/the-conversation-for-a-call.md): Keyed on the call rather than the conversation, for the call-detail screen. Scoped through the CDR. - [List conversations](https://docs.firetone.com.au/api-reference/conversations/list-conversations.md): One per call, whoever handled it: provider and model are null for a human-handled call, which is what keeps this from being an AI log with a general-sounding name. Read-only — a conversation is a record of what happened, and an editable transcript is not one. assembled_context is omitted here and re… - [One conversation with its transcript](https://docs.firetone.com.au/api-reference/conversations/one-conversation-with-its-transcript.md): Includes assembled_context: exactly what the agent was told before it spoke. Stored verbatim because the prompt is built at runtime from the profile, the contact, past summaries, open tickets and memory rows, and cannot be reconstructed once any of those have moved on. - [List contacts](https://docs.firetone.com.au/api-reference/contacts/list-contacts.md): Customers, one per external number per organisation. Base architecture rather than an app: a tenant who disables tickets still has customers, so there is no enablement gate. Default sort is last_seen descending. Sort keys: last_seen, first_seen, e164, name, created_at. - [Create a contact](https://docs.firetone.com.au/api-reference/contacts/create-a-contact.md): The number is normalised exactly as the call path normalises it, so a contact created here and one created by a call from the same number are the same customer. Anonymous, withheld and extension-length numbers are refused: they are not external customers, and recording them would produce one shared… - [Create or update a contact by your id](https://docs.firetone.com.au/api-reference/contacts/create-or-update-a-contact-by-your-id.md): Keyed on your own id for the contact. Found by it and updated; or, when it is new, the contact that already has the number takes the reference; or it is created (201, contact.created). attributes MERGE into the contact's. 409 when the number belongs to a contact with a different reference. Requires… - [Who is this number](https://docs.firetone.com.au/api-reference/contacts/who-is-this-number.md): For a screen-pop: the contact behind a number in any form it is typed (national or international), with its open tickets, the last five conversation summaries and the last call. 404 when nobody has the number. Requires contacts:read. - [One contact](https://docs.firetone.com.au/api-reference/contacts/one-contact.md): Includes call_count across every call tied to this customer. - [Delete a contact](https://docs.firetone.com.au/api-reference/contacts/delete-a-contact.md): CDRs survive with contact_id nulled: a CDR is a financial record of a call that happened, a contact is a customer profile, and they have different lifetimes on purpose. - [Update a contact](https://docs.firetone.com.au/api-reference/contacts/update-a-contact.md): e164 is deliberately NOT patchable: it is the identity every call, CDR and memory row was matched on, and changing it would silently reassign one customer's history to another number. - [Whether the callback secret is set](https://docs.firetone.com.au/api-reference/integrations/whether-the-callback-secret-is-set.md): Never the secret itself. Requires integrations:read. - [Create or rotate the callback secret](https://docs.firetone.com.au/api-reference/integrations/create-or-rotate-the-callback-secret.md): Returns the new secret ONCE. Every POST to a request's callback_url is signed with it (X-FireTone-Signature, exactly as webhooks). The old secret stops signing at once. Requires integrations:write. - [List webhooks](https://docs.firetone.com.au/api-reference/integrations/list-webhooks.md): Requires integrations:read. - [Create a webhook](https://docs.firetone.com.au/api-reference/integrations/create-a-webhook.md): Generates the signing secret and returns it once. Delivery: a bounded queue, three attempts over about five minutes, each recorded (GET /webhooks/{id}/deliveries). Body: WebhookEvent. Requires integrations:write. - [The events a webhook can subscribe to](https://docs.firetone.com.au/api-reference/integrations/the-events-a-webhook-can-subscribe-to.md): Each event with what it means. Requires integrations:read. - [Delete a webhook](https://docs.firetone.com.au/api-reference/integrations/delete-a-webhook.md) - [Update a webhook](https://docs.firetone.com.au/api-reference/integrations/update-a-webhook.md) - [A webhook's deliveries](https://docs.firetone.com.au/api-reference/integrations/a-webhooks-deliveries.md): Newest first, paged, kept 14 days. Every event is written here before it is sent, so this is also the outbox: status queued (waiting, or being retried at next_attempt_at), sending, delivered, failed. Retries after 30 s, 5 min, 30 min, 2 h and 12 h; a webhook whose deliveries have all failed for thre… - [One delivery, with the exact body sent](https://docs.firetone.com.au/api-reference/integrations/one-delivery-with-the-exact-body-sent.md): payload is the body byte-for-byte as signed; absent for a test ping. Requires integrations:read. - [Send a delivery again](https://docs.firetone.com.au/api-reference/integrations/send-a-delivery-again.md): Queues the same body with the same delivery id (so a receiver that de-duplicates on X-FireTone-Delivery still can) as a new row with its own attempts. 409 webhook_disabled when the webhook is switched off. Requires integrations:write. - [Send a test event](https://docs.firetone.com.au/api-reference/integrations/send-a-test-event.md): Sends a webhook.test event, signed exactly as real ones, and reports the receiver's answer. Always 200; ok says whether it worked. - [List tickets](https://docs.firetone.com.au/api-reference/tickets/list-tickets.md): Requires tickets:read AND the tickets app enabled for the organisation. A disabled app answers 403 rather than an empty list — absent, not merely hidden in the nav. Sort keys: created_at, updated_at, ref, status, priority. - [Raise a ticket](https://docs.firetone.com.au/api-reference/tickets/raise-a-ticket.md): Always recorded with source 'human'. Nothing may claim that except this path: the action handler records 'agent' or 'flow', and the distinction tells whoever picks the ticket up how much to trust the wording. A contact or team outside the caller's scope is refused — the foreign key proves the row ex… - [One ticket](https://docs.firetone.com.au/api-reference/tickets/one-ticket.md) - [Update a ticket](https://docs.firetone.com.au/api-reference/tickets/update-a-ticket.md): resolved_at follows status rather than being set by the caller: two fields that must agree, only one of which anyone remembers to update. - [Ticket history](https://docs.firetone.com.au/api-reference/tickets/ticket-history.md): Newest first. This is the record an agent reads back to the customer on their next call. - [Add a note](https://docs.firetone.com.au/api-reference/tickets/add-a-note.md): Append-only: there is no PATCH and no DELETE for an update, because an edited history is not a history. - [List voicemail messages](https://docs.firetone.com.au/api-reference/voicemail/list-voicemail-messages.md): Messages left when nobody could take the call. Recorded by FireTone rather than mod_voicemail, so a message carries the call it came from and the customer who left it. Transcription happens after the call and may lag by seconds; status is new, transcribing, ready or failed, and a failed message stil… - [Get one voicemail message](https://docs.firetone.com.au/api-reference/voicemail/get-one-voicemail-message.md): The message with its transcript and summary, if transcription has finished. - [Play a voicemail recording](https://docs.firetone.com.au/api-reference/voicemail/play-a-voicemail-recording.md): The WAV as recorded by the switch. Gated on voicemail:listen rather than voicemail:read: a transcript and a person's recorded voice are different disclosures. ## OpenAPI Specs - [openapi-public](/api-reference/openapi-public.json)