Skip to main content

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

callStatusMeaning
WAITING_FOR_CACHEGenerating cache data such as speech audio for the call
PENDINGDial request accepted, waiting to be dialed
REQUESTEDDial instruction issued to the telephony provider
CALLINGRinging the recipient / call being established
CLOSINGPost-call wrap-up after disconnection
COMPLETEDCall finished (if errors is non-empty, completed with errors)
EXPIREDThe allowed dialing period passed without the call being placed
NO_RESPONSEThe recipient did not answer
CANCELEDCall canceled by a user action
BUSYThe recipient's line was busy
UNREACHABLECould not reach the recipient (out of service area, powered off, etc.)
MAX_ATTEMPTS_REACHEDRedial attempt count, including retries, hit its upper limit
ERRORAn error occurred
VOICEMAIL_REACHEDReached voicemail
HEALTHCHECK_FAILEDThe health check against the URL specified in the call request failed, so the call was not placed
LIMIT_REACHEDVarious internal limit reached
CONNECTINGInternal connecting state
CONCURRENCY_LIMIT_EXCEEDEDInternal 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

callStatusMeaning
CONNECTINGInbound call received, internal processing started
CALLINGCall established, conversation in progress
CLOSINGPost-call wrap-up after disconnection
COMPLETEDCall completed
CONCURRENCY_LIMIT_EXCEEDEDConcurrent-call limit reached
ERRORAn 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
  • COMPLETED does 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 as COMPLETED ("completed with errors") with a non-empty body.errors. Use body.errors, not COMPLETED, to judge success.
  • ERROR is an "effective status" independent of the lifecycle. Whenever body.errors is populated in any phase, the call is effectively treated as ERROR (*_CALL_ERROR).
  • LIMIT_REACHED / CONNECTING / CONCURRENCY_LIMIT_EXCEEDED (internal OUTBOUND states) do not fire dedicated events and are consolidated into OUTBOUND_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).