Events
Last updated April 16, 2026
Webhook event payloads delivered to your registered URL. Each event is sent as a POST request with a JSON body.
SIP call ringing (inbound or outbound)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.ringing |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
leg_type | string | optional | Leg type (e.g. sip_inbound, sip_outbound) |
uri | string | optional | Dialed SIP URI (outbound only) |
from | string | optional | Caller URI (inbound) or From header value (outbound, if set) |
to | string | optional | Callee URI (inbound only) |
sip_headers | object | optional | X-* custom SIP headers, if present |
Outbound leg received 183 Session Progress with SDP; media pipeline active
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.early_media |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
leg_type | string | optional | Leg type (e.g. sip_outbound) |
Leg answered/connected
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.connected |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
leg_type | string | optional | Leg type (e.g. sip_inbound, sip_outbound, webrtc) |
Leg hung up (CDR-style nested structure)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.disconnected |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
cdr | object | optional | |
reason | enum | required | Disconnect reason. Common SIP failures are mapped to named reasons; unmapped 4xx/5xx/6xx codes appear as sip_{code}. Values: api_hangup, remote_bye, caller_cancel, ring_timeout, max_duration, busy, unavailable, not_found, forbidden, unauthorized, timeout, cancelled, not_acceptable, service_unavailable, declined, rtp_timeout, session_expired, invite_failed, connect_failed, ice_failure |
duration_total | number | required | Seconds from leg creation to disconnect |
duration_answered | number | required | Seconds from answer to disconnect (0 if never answered) |
quality | object | optional | RTP quality metrics. Omitted for WebRTC legs or unanswered legs with no media. |
mos_score | number | required | Mean Opinion Score (1.0–5.0) estimated via simplified E-model (ITU-T G.107) from packet loss and jitter |
rtp_packets_received | integer | required | Total inbound RTP audio packets received |
rtp_packets_lost | integer | required | Estimated lost packets based on sequence number gaps |
rtp_jitter_ms | number | required | Inter-arrival jitter in milliseconds (RFC 3550 §A.8) |
Leg added to a room
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.joined_room |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
Leg removed from a room
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.left_room |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
Leg muted
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.muted |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
Leg unmuted
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.unmuted |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
Leg put on hold (local or remote)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.hold |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
leg_type | string | optional | Hold direction: "local" (we put them on hold) or "remote" (they put us on hold) |
Leg taken off hold (local or remote)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.unhold |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
leg_type | string | optional | Hold direction: "local" or "remote" |
DTMF digit received
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: dtmf.received |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
digit | string | optional | DTMF digit received |
Participant started speaking
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: speaking.started |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier (present only when the leg is in a room) |
Participant stopped speaking
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: speaking.stopped |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier (present only when the leg is in a room) |
Playback began
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: playback.started |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
playback_id | string | optional | Playback identifier |
Playback ended
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: playback.finished |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
playback_id | string | optional | Playback identifier |
Playback failed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: playback.error |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
playback_id | string | optional | Playback identifier |
error | string | optional | Error message |
TTS synthesis began playing
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: tts.started |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
tts_id | string | optional | TTS playback identifier |
TTS synthesis finished playing
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: tts.finished |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
tts_id | string | optional | TTS playback identifier |
TTS synthesis or playback failed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: tts.error |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
tts_id | string | optional | TTS playback identifier |
error | string | optional | Error message |
Recording began
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.started |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
file | string | optional | Recording file path or S3 URI |
Recording ended
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.finished |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
file | string | optional | Recording file path or S3 URI |
multi_channel_file | string | optional | |
channels | object | optional |
Recording paused (audio replaced with silence)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.paused |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
file | string | optional |
Recording resumed from a paused state
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.resumed |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
file | string | optional |
We sent a SIP REFER (transfer initiated by the operator)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_initiated |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
kind | string | optional | Transfer kind: "blind" or "attended" |
target | string | optional | SIP URI to which the leg is being transferred |
replaces_leg_id | string | optional | Leg whose dialog is replaced (attended transfer only) |
We received a SIP REFER from the peer
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_requested |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
kind | string | optional | Transfer kind: "blind" or "attended" |
target | string | optional | SIP URI requested by the peer |
replaces_call_id | string | optional | Call-ID present in the Refer-To Replaces parameter (attended only) |
declined | boolean | optional | True when the REFER was declined (e.g. SIP_REFER_AUTO_DIAL=false) |
Transfer progress reported via NOTIFY sipfrag
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_progress |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
status_code | integer | optional | Provisional SIP status from the NOTIFY sipfrag |
reason | string | optional | Reason phrase |
Transfer reached terminal 2xx
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_completed |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
status_code | integer | optional | Final 2xx SIP status from the NOTIFY sipfrag |
reason | string | optional | Reason phrase |
Transfer failed (REFER rejected, sipfrag non-2xx, or local error)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_failed |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
status_code | integer | optional | Final non-2xx SIP status (when applicable) |
reason | string | optional | Reason phrase |
error | string | optional | Local error message (when no SIP status applies) |
Room created
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.created |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
room_id | string | optional | Room identifier |
Room deleted
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.deleted |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
room_id | string | optional | Room identifier |
Speech-to-text transcript
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: stt.text |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
text | string | optional | Transcribed text |
is_final | boolean | optional | Whether this is a final or partial transcript |
Agent connected to provider
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: agent.connected |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
conversation_id | string | optional | Provider-assigned conversation identifier |
Agent session ended
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: agent.disconnected |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
User speech transcribed by agent
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: agent.user_transcript |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
text | string | optional | User speech text |
Agent generated a response
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: agent.agent_response |
timestamp | string(date-time) | required | |
instance_id | string | optional | Instance identifier |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
text | string | optional | Agent response text |