Events & codes
Every code below is the same value everywhere. It appears on the event stream as data.reasonCode, on the Call object as reason_code, and on status-callback webhooks. One parser handles all three.
Event types
Section titled “Event types”Pushed live over the event stream.
| Code | Event | Summary |
|---|---|---|
CALL.0100 |
call.initiated | Call initiated |
CALL.0180 |
call.ringing | Ringing |
CALL.0183 |
call.progress | Call progress |
CALL.0200 |
call.answered | Answered |
CALL.0300 |
call.completed | Completed |
CALL.0400 |
call.failed | Failed |
DIAL.0200 |
dial.answered | Bridged leg answered |
DIAL.0300 |
dial.completed | Bridged leg ended |
DIAL.0403 |
dial.blocked | Dial destination blocked |
PLAY.0400 |
play.url_refused | Play URL refused |
PLAY.0404 |
play.asset_missing | Play asset not found |
REC.0100 |
recording.started | Recording started |
REC.0300 |
recording.completed | Recording completed |
TTS.0200 |
tts.generated | Speech generated |
WH.0200 |
webhook.delivered | Webhook delivered |
WH.0400 |
webhook.failed | Webhook failed |
AUTH.0200 |
phone.authorized | Phone authorized |
AUTH.0401 |
phone.rejected | Phone rejected |
BILL.0300 |
wallet.debited | Wallet debited |
BILL.0310 |
wallet.low | Wallet low |
BILL.0402 |
wallet.insufficient | Insufficient balance |
BILL.0403 |
wallet.exhausted | Balance exhausted mid-call |
BILL.0407 |
account.suspended | Account suspended |
LIMIT.0429 |
call.concurrency_exceeded | Concurrency cap reached |
LIMIT.0430 |
call.cps_exceeded | Calls-per-second limit exceeded |
END.0403 |
call.no_did | No DID to originate from |
END.0488 |
call.cross_account | Cross-account extension |
END.0410 |
call.callee_offline | Extension offline |
END.0501 |
call.no_outbound_handler | No outbound voice webhook |
PLATFORM.0001 |
platform.concurrent | Platform concurrent calls |
PLATFORM.0503 |
platform.draining | Platform paused for maintenance |
SYS.0500 |
system.error | System error |
Reason codes
Section titled “Reason codes”The terminal reason a call ended, or a request was refused. Each cause has its own code, so a refusal is never conflated with a different refusal.
| Code | HTTP | Summary |
|---|---|---|
BILL.0402 |
402 | Insufficient balance |
BILL.0403 |
402 | Balance exhausted mid-call |
BILL.0407 |
403 | Account suspended |
LIMIT.0429 |
429 | Concurrency cap reached |
LIMIT.0430 |
429 | Calls-per-second limit exceeded |
END.0200 |
200 | Normal hangup |
END.0404 |
404 | Unallocated / inactive number |
END.0408 |
408 | Maximum duration reached |
END.0480 |
480 | No answer |
END.0486 |
486 | Busy |
END.0487 |
487 | Canceled before answer |
END.0503 |
503 | Ended by a platform safety cut |
END.0504 |
504 | Reconciled from the switch |
END.0500 |
500 | Carrier / network failure |
END.0603 |
603 | Rejected |
END.0403 |
403 | No DID to originate from |
END.0488 |
488 | Cross-account extension |
END.0410 |
410 | Extension offline |
END.0501 |
501 | No outbound voice webhook |
PLATFORM.0503 |
503 | Platform paused for maintenance |
Code detail
Section titled “Code detail”CALL.0100
Section titled “CALL.0100”A call leg was created but is not yet ringing.
CALL.0180
Section titled “CALL.0180”The remote party is being alerted (ringing).
CALL.0183
Section titled “CALL.0183”Early media / “connecting…”: audio before answer, distinct from ringing.
CALL.0200
Section titled “CALL.0200”The call was answered/bridged; the leg is connected and billing has started.
CALL.0300
Section titled “CALL.0300”The call ended after connecting. Carries the terminal reasonCode + duration/cost.
CALL.0400
Section titled “CALL.0400”The call did not complete (never connected, or was refused/cut). Carries the terminal reasonCode explaining exactly why.
DIAL.0200
Section titled “DIAL.0200”A <Dial> bridged leg was answered by the far end.
DIAL.0300
Section titled “DIAL.0300”A <Dial> bridged leg ended; carries its DialCallStatus + duration.
DIAL.0403
Section titled “DIAL.0403”A <Dial> was blocked by the outbound destination allowlist, which is an anti-fraud control. The parent call continues, so this is an event on the dial attempt, not a call end.
PLAY.0400
Section titled “PLAY.0400”A <Play> held text that is not a plain http or https URL, or a URL with characters that must be percent-encoded first, such as spaces or braces. The verb was skipped and the call continues with the next verb. Use a public http(s) URL, or upload the audio and play it as an asset.
PLAY.0404
Section titled “PLAY.0404”A <Play asset="…"> named an asset that does not exist in this account, is inactive, or has no playable audio. The call continues with the next verb. This event exists because the failure is otherwise invisible: a failed playback does not end the channel, so the caller simply hears silence.
REC.0100
Section titled “REC.0100”Audio capture began for the call.
REC.0300
Section titled “REC.0300”A recording finished and its Recording row is available.
TTS.0200
Section titled “TTS.0200”A <Say> utterance was synthesised; carries seconds + tier used (billed separately).
WH.0200
Section titled “WH.0200”A status-callback / voice webhook was delivered successfully.
WH.0400
Section titled “WH.0400”A webhook delivery failed after retries.
AUTH.0200
Section titled “AUTH.0200”An end-user phone token was validated and accepted.
AUTH.0401
Section titled “AUTH.0401”An end-user phone token was expired or revoked.
BILL.0300
Section titled “BILL.0300”A usage charge was posted to the wallet after a call/segment settled.
BILL.0310
Section titled “BILL.0310”The live monitor warns the account is nearing its allowance on active calls.
BILL.0402
Section titled “BILL.0402”A new call was refused before answer because the account has no spendable allowance.
BILL.0403
Section titled “BILL.0403”The live billing monitor terminated the call because the allowance ran out mid-call.
BILL.0407
Section titled “BILL.0407”A new call was refused because the account is not active/suspended.
LIMIT.0429
Section titled “LIMIT.0429”A new call was refused: the account already has its maximum simultaneous calls.
LIMIT.0430
Section titled “LIMIT.0430”A new call was refused: the account is placing calls faster than its CPS limit.
END.0403
Section titled “END.0403”An end-user tried to place an outbound PSTN call but the account owns no active DID to present as caller ID. Acquire/activate a number first.
END.0488
Section titled “END.0488”An end-user dialled an extension belonging to a different account. On-net calls are only allowed between extensions of the same account.
END.0410
Section titled “END.0410”An end-user dialled an on-net extension whose softphone is not currently registered (offline). The callee must be online to receive the call.
END.0501
Section titled “END.0501”An end-user placed an outbound PSTN call but the account has no outbound voice webhook configured. SautiPBX never dials the PSTN on its own: call control comes from your <Response> XML, so the caller heard a short notice and the call was ended. Configure an outbound voice webhook to place the call.
PLATFORM.0001
Section titled “PLATFORM.0001”The current platform-wide active-call count (staff stream).
PLATFORM.0503
Section titled “PLATFORM.0503”The call was refused because the platform is briefly not admitting new calls. An operator closed the call gate for a deploy or maintenance window. It is not a problem with your account, your balance or your request: calls already in progress continue, and the gate reopens automatically within minutes. Retry shortly.
SYS.0500
Section titled “SYS.0500”An internal error occurred handling a call event; carries a traceId to correlate.
END.0200
Section titled “END.0200”A party hung up normally after a connected call.
END.0404
Section titled “END.0404”The dialled number is not a live DID on the platform (unknown or inactive account).
END.0408
Section titled “END.0408”The call hit the account’s absolute maximum-duration ceiling and was cut.
END.0480
Section titled “END.0480”The call rang out with no answer.
END.0486
Section titled “END.0486”The far end was busy.
END.0487
Section titled “END.0487”The caller hung up before the call was answered.
END.0503
Section titled “END.0503”SautiPBX ended the leg as a protective measure, to bound spend while a billing check could not be completed. This is a deliberate platform cut, not a carrier failure, and not a fault in your application. Retrying is safe.
END.0504
Section titled “END.0504”The call ended, but the hangup notification was lost in transit inside the platform, so the CDR was closed by a reconcile sweep against the list of calls still live on the switch. endedAt is when we detected the loss, not when the carrier released the call; the sweep runs within a minute of the gap, so it is close, but it is a detection time. Talk time is billed only when the dialled leg already reported it, never guessed.
END.0500
Section titled “END.0500”The carrier or network failed the call (temporary failure, out-of-order, bearer mismatch).
END.0603
Section titled “END.0603”The leg was rejected before answer (e.g. a malformed/unattributable outbound leg).