Skip to main content

callStatus Reference

body.data.callStatus carries the snapshot of the call's state at the moment of notification. This page lists all possible values, what they mean, and how they relate to eventType.

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

callStatusMeaningCorresponding eventType
PENDINGJust queued for outbound dialingOUTBOUND_CALL_PENDING
REQUESTEDDial instruction issued to the telephony providerOUTBOUND_CALL_REQUESTED
CALLINGRinging the recipient / call being establishedOUTBOUND_CALL_CALLING
CLOSINGPost-call wrap-up after disconnectionOUTBOUND_CALL_CLOSING
COMPLETEDCall completed normally (if errors is non-empty, completed with errors)OUTBOUND_CALL_COMPLETED
EXPIREDScheduled outbound dial window exceededOUTBOUND_CALL_EXPIRED
NO_RESPONSEThe recipient did not answerOUTBOUND_CALL_NO_RESPONSE
CANCELEDCanceled from PENDING by a user actionOUTBOUND_CALL_CANCELED
BUSYThe recipient's line was busyOUTBOUND_CALL_BUSY
UNREACHABLECould not reach the recipient (out of service area, powered off, etc.)OUTBOUND_CALL_UNREACHABLE
MAX_ATTEMPTS_REACHEDRedial attempt count, including retries, hit its upper limitOUTBOUND_CALL_MAX_ATTEMPTS_REACHED
ERRORAn error occurredOUTBOUND_CALL_ERROR
VOICEMAIL_REACHEDReached voicemailOUTBOUND_CALL_ERROR family (internal categorization)
HEALTHCHECK_FAILEDHealthcheck failedOUTBOUND_CALL_ERROR family (internal categorization)
LIMIT_REACHEDVarious internal limit reachedConsolidated into OUTBOUND_CALL_ERROR
CONNECTINGInternal connecting stateConsolidated into OUTBOUND_CALL_ERROR
CONCURRENCY_LIMIT_EXCEEDEDInternal concurrency limit exceededConsolidated into OUTBOUND_CALL_ERROR
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

callStatusMeaningCorresponding eventType
CONNECTINGInbound call received, internal processing startedINBOUND_CALL_CONNECTING
CALLINGCall established, conversation in progressINBOUND_CALL_CALLING
CLOSINGPost-call wrap-up after disconnectionINBOUND_CALL_CLOSING
COMPLETEDCall completedINBOUND_CALL_COMPLETED
CONCURRENCY_LIMIT_EXCEEDEDConcurrent-call limit reachedINBOUND_CALL_CONCURRENCY_LIMIT_EXCEEDED
ERRORAn error occurredINBOUND_CALL_ERROR

Relationship between eventType and callStatus

The two are related but distinct:

  • eventType = the Webhook delivery trigger name (the publicly exposed signal)
  • callStatus = the internal state of the call (a data field within the payload)

They map almost one-to-one, but several internal statuses are consolidated into one externally exposed event (e.g. LIMIT_REACHEDOUTBOUND_CALL_ERROR as shown above).

We recommend using eventType as the primary switch key on the receiver side. callStatus is better suited to supplementary logic, logging, and statistics.

State transitions (conceptual)

OUTBOUND

PENDING → REQUESTED → CALLING → CLOSING → COMPLETED
↘ NO_RESPONSE / BUSY / UNREACHABLE / EXPIRED / ...
↘ ERROR
CANCELED ← (user action from PENDING)

INBOUND

CONNECTING → CALLING → CLOSING → COMPLETED
↘ CONCURRENCY_LIMIT_EXCEEDED
↘ 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).