Call Status Reference
body.data.callStatus carries the snapshot of the call's state at the moment of notification. This page lists all possible values and what they mean.
warning
Do not use callStatus to detect errors. Transitional statuses such as CALLING may appear even when an error occurred. Detect errors via the body.errors array (see Payload Spec > body.errors).
Outbound call status
| callStatus | Meaning |
|---|---|
WAITING_FOR_CACHE | Waiting for the pre-call cache to be generated |
PENDING | Dial request accepted, waiting to be dialed |
REQUESTED | Dial instruction issued to the telephony provider |
CALLING | Ringing the recipient / call being established |
CLOSING | Post-call wrap-up after disconnection |
COMPLETED | Call finished (if errors is non-empty, completed with errors) |
EXPIRED | The allowed dialing period passed without the call being placed |
NO_RESPONSE | The recipient did not answer |
CANCELED | Call canceled by a user action |
BUSY | The recipient's line was busy |
UNREACHABLE | Could not reach the recipient (out of service area, powered off, etc.) |
MAX_ATTEMPTS_REACHED | Redial attempt count, including retries, hit its upper limit |
ERROR | An error occurred |
VOICEMAIL_REACHED | Reached voicemail |
HEALTHCHECK_FAILED | The health check against the URL specified in the call request failed, so the call was not placed |
LIMIT_REACHED | Various internal limit reached |
CONNECTING | Internal connecting state |
CONCURRENCY_LIMIT_EXCEEDED | Internal concurrency limit exceeded |
note
LIMIT_REACHED / CONNECTING / CONCURRENCY_LIMIT_EXCEEDED may appear in callStatus as internal states, but no separate Webhook event is fired for them — they are surfaced externally as OUTBOUND_CALL_ERROR.
Inbound call status
| callStatus | Meaning |
|---|---|
CONNECTING | Inbound call received, internal processing started |
CALLING | Call established, conversation in progress |
CLOSING | Post-call wrap-up after disconnection |
COMPLETED | Call completed |
CONCURRENCY_LIMIT_EXCEEDED | Concurrent-call limit reached |
ERROR | An error occurred |
State transitions (conceptual)
OUTBOUND
Main flow
WAITING_FOR_CACHE → PENDING → REQUESTED → CALLING → CLOSING → COMPLETED
Canceled before dialing (user action)
WAITING_FOR_CACHE / PENDING → CANCELED
Pre-dial healthcheck failed
WAITING_FOR_CACHE → HEALTHCHECK_FAILED
Call did not connect (branches from REQUESTED / CALLING)
NO_RESPONSE / BUSY / UNREACHABLE / VOICEMAIL_REACHED
MAX_ATTEMPTS_REACHED / EXPIRED
INBOUND
Main flow
CONNECTING → CALLING → CLOSING → COMPLETED
Rejected on accept (concurrent-call limit reached)
CONNECTING → CONCURRENCY_LIMIT_EXCEEDED
note
COMPLETEDdoes not mean "success." It means the call processing ran to the end and the call finished; a call that hit errors along the way still ends asCOMPLETED("completed with errors") with a non-emptybody.errors. Usebody.errors, notCOMPLETED, to judge success.ERRORis an "effective status" independent of the lifecycle. Wheneverbody.errorsis populated in any phase, the call is effectively treated asERROR(*_CALL_ERROR).LIMIT_REACHED/CONNECTING/CONCURRENCY_LIMIT_EXCEEDED(internal OUTBOUND states) do not fire dedicated events and are consolidated intoOUTBOUND_CALL_ERROR.- The detailed transition specification depends on internal implementation. What is guaranteed externally is FIFO delivery of events for the same callId (see Setup Guide > Delivery behavior).