Events
eventType has 18 possible values in total (12 outbound + 6 inbound). This page is the reference for when each eventType fires.
info
All events share the same payload structure (see Payload Spec). The only differences are the eventType value and the presence/absence of body.errors[] on error.
Outbound events (OUTBOUND, 12 types)
| eventType | Label | When it fires |
|---|---|---|
OUTBOUND_CALL_PENDING | Pending | Immediately after an outbound call is queued |
OUTBOUND_CALL_REQUESTED | Requested | A call request was accepted and the dial instruction was issued to the telephony provider |
OUTBOUND_CALL_CALLING | Outbound Calling | Ringing the recipient, or the call is being connected |
OUTBOUND_CALL_CLOSING | Outbound Closing | Post-call wrap-up phase after disconnection |
OUTBOUND_CALL_COMPLETED | Outbound Completed | Call completed normally. If errors is non-empty, it completed with errors |
OUTBOUND_CALL_EXPIRED | Expired | The scheduled outbound dial window was exceeded |
OUTBOUND_CALL_NO_RESPONSE | No Response | The recipient did not answer the ringing call |
OUTBOUND_CALL_CANCELED | Canceled | Canceled from the PENDING state by a user action |
OUTBOUND_CALL_BUSY | Busy | The recipient's line was busy |
OUTBOUND_CALL_UNREACHABLE | Unreachable | The recipient could not be reached (out of service area, powered off, etc.) |
OUTBOUND_CALL_MAX_ATTEMPTS_REACHED | Max Attempts Reached | The redial attempt count, including retries, reached its upper limit |
OUTBOUND_CALL_ERROR | Outbound Error | An error occurred during an outbound call (details in body.errors[]) |
Inbound events (INBOUND, 6 types)
| eventType | Label | When it fires |
|---|---|---|
INBOUND_CALL_CONNECTING | Connecting | An incoming call was received and internal processing started |
INBOUND_CALL_CALLING | Inbound Calling | The inbound call was established and conversation is in progress |
INBOUND_CALL_CLOSING | Inbound Closing | Post-call wrap-up phase after disconnection |
INBOUND_CALL_COMPLETED | Inbound Completed | The inbound call completed normally |
INBOUND_CALL_CONCURRENCY_LIMIT_EXCEEDED | Concurrency Limit Exceeded | The project's concurrent-call limit was reached |
INBOUND_CALL_ERROR | Inbound Error | An error occurred during an inbound call (details in body.errors[]) |
Whether an event is delivered
Toggle individual events on/off in the Notification Triggers section of the dashboard. Events turned off are not delivered at all.
Receiver-side implementation pattern
function onWebhook(payload: WebhookPayload) {
const { eventType, body } = payload;
// 1. Detect errors via body.errors
if (body.errors?.length) {
handleError(eventType, body);
return;
}
// 2. Branch on eventType
switch (eventType) {
case 'OUTBOUND_CALL_COMPLETED':
case 'INBOUND_CALL_COMPLETED':
onCompleted(body);
break;
case 'OUTBOUND_CALL_NO_RESPONSE':
case 'OUTBOUND_CALL_BUSY':
case 'OUTBOUND_CALL_UNREACHABLE':
onUnreachable(body);
break;
// ... handle other eventTypes similarly
default:
// Don't crash on unknown eventType values
console.log(`Unknown eventType: ${eventType}`);
}
}
For full implementations see Sample Receivers.
Related
- Payload Spec — the JSON shape shared by every event
- callStatus Reference — possible values of
body.data.callStatusand their relationship with eventType - Retry Policy — retry behavior on delivery failure