Events
Last updated September 4, 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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 |
offered_codecs | array[object] | optional | |
trunk_id | string | optional | |
source_address | string | optional | |
authenticated | boolean | optional | |
auth_username | string | optional |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
cdr | object | optional | |
reason | string | required | Disconnect reason. Common SIP failures are mapped to named reasons; unmapped 4xx/5xx/6xx codes appear as sip_{code}. This is an open set — treat an unrecognized value as a new reason rather than an error. Known values: api_hangup, room_deleted, remote_bye, caller_cancel, max_duration, session_expired, rtp_timeout, busy, declined, rejected, unavailable, not_found, forbidden, server_error, ring_timeout, unauthorized, timeout, cancelled, not_acceptable, service_unavailable, invite_failed, connect_failed, challenged, transfer_completed, transfer_originate_failed, transfer_connect_failed, bad_answer, siprec_answer_failed, mixer_panic, hangup, peer_slow, connection_reset, ws_error, ws_dial_failed, moq_error, ice_failure, ice_failed, ice_disconnected, livekit_client_initiated, livekit_duplicate_identity, livekit_server_shutdown, livekit_kicked, livekit_room_deleted, livekit_state_mismatch, livekit_join_failure, livekit_migration, livekit_signal_close, livekit_room_closed, livekit_user_unavailable, livekit_user_rejected, livekit_token_expired, livekit_media_failure, livekit_disconnected, livekit_client_closed, livekit_signal_closed, livekit_signal_error, livekit_pc_setup_failed, livekit_add_track_failed, livekit_publisher_failed, livekit_subscriber_failed, livekit_signal_loop_exit, livekit_set_remote_desc_failed, livekit_create_answer_failed, livekit_set_local_desc_failed, livekit_signal_send_failed, livekit_set_publisher_remote_failed, livekit_participant_left. |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional |
Leg removed from a room
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.left_room |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional |
Leg muted
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.muted |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional |
Leg unmuted
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.unmuted |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional |
Leg deafened (stops receiving room audio)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.deaf |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional |
Leg undeafened (resumes receiving room audio)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.undeaf |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional |
Leg put on hold (local or remote)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.hold |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
leg_type | string | optional | Hold direction: "local" or "remote" |
An asynchronous leg command (202 Accepted) failed during execution
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.command_failed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
command | string | optional | |
error | string | optional |
An additional m=audio stream was negotiated on a live dialog
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.stream_added |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
stream_id | string | optional | |
mid | string | optional | |
direction | string | optional | |
lang | string | optional | |
room_id | string | optional | |
role | string | optional | |
reason | string | optional |
An audio stream was disabled with a port-0 re-INVITE; its m-line slot survives as a tombstone
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.stream_removed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
stream_id | string | optional | |
mid | string | optional | |
direction | string | optional | |
lang | string | optional | |
room_id | string | optional | |
role | string | optional | |
reason | string | optional |
The peer refused an additional audio stream, or it could not be negotiated; the call is unaffected
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.stream_rejected |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
stream_id | string | optional | |
mid | string | optional | |
direction | string | optional | |
lang | string | optional | |
room_id | string | optional | |
role | string | optional | |
reason | string | optional |
An audio stream's media loop failed and the stream was torn down; the call continues on its remaining streams
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.stream_failed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
stream_id | string | optional | |
mid | string | optional | |
direction | string | optional | |
lang | string | optional | |
room_id | string | optional | |
role | string | optional | |
reason | string | optional |
An audio stream was attached to or detached from a room (an empty room_id means detached)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.stream_room_changed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
stream_id | string | optional | |
mid | string | optional | |
direction | string | optional | |
lang | string | optional | |
room_id | string | optional | |
role | string | optional | |
reason | string | optional |
An audio stream's routing role changed; the room's allow-sets were recomputed atomically
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.stream_role_changed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
stream_id | string | optional | |
mid | string | optional | |
direction | string | optional | |
lang | string | optional | |
room_id | string | optional | |
role | string | optional | |
reason | string | optional |
An inbound SIPREC recording session was accepted; carries the participants and the stream-to-participant bindings
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: siprec.session_started |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
session_id | string | optional | |
data_mode | string | optional | |
participants | array[object] | optional | |
streams | array[object] | optional |
A SIPREC recording session ended
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: siprec.session_ended |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
session_id | string | optional | |
reason | string | optional |
A SIPREC recording session's metadata document was updated on a re-INVITE
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: siprec.metadata_updated |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
session_id | string | optional | |
data_mode | string | optional | |
participants_joined | array[string] | optional | |
participants_left | array[string] | optional | |
streams_added | array[string] | optional | |
streams_removed | array[string] | optional | |
streams | array[object] | optional |
A party joined the call being recorded by a SIPREC session
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: siprec.participant_joined |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
session_id | string | optional | |
label | string | optional | |
leg_stream_id | string | optional | |
participant_id | string | optional | |
participant_aor | string | optional | |
participant_name | string | optional |
A party left the call being recorded by a SIPREC session
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: siprec.participant_left |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
app_id | string | optional | |
session_id | string | optional | |
label | string | optional | |
leg_stream_id | string | optional | |
participant_id | string | optional | |
participant_aor | string | optional | |
participant_name | string | optional |
DTMF digit received
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: dtmf.received |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
digit | string | optional | DTMF digit received |
seq | integer | optional |
Real-Time Text (T.140 / RFC 4103) chunk received from the remote
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: rtt.received |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
text | string | optional | UTF-8 text chunk received from the remote |
seq | integer | optional | Per-leg monotonic sequence (independent of RTP sequence numbers) |
loss_marker | boolean | optional | True when a U+FFFD has been prepended to indicate text was lost beyond what RFC 2198 redundancy could recover |
Participant started speaking
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: speaking.started |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier (present only when the leg is in a room) |
app_id | string | optional |
Participant stopped speaking
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: speaking.stopped |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier (present only when the leg is in a room) |
app_id | string | optional |
Playback began
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: playback.started |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
playback_id | string | optional | Playback identifier |
Playback ended
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: playback.finished |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
playback_id | string | optional | Playback identifier |
reason | string | optional | Why playback ended: 'completed' (reached the end of the audio) or 'stopped' (did not reach the end, for any reason) |
played_ms | integer | optional | Milliseconds of audio actually played, accumulated across repeat iterations |
Playback failed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: playback.error |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
tts_id | string | optional | TTS playback identifier |
reason | string | optional | Why the utterance ended: 'completed' (reached the end of the audio) or 'stopped' (did not reach the end, for any reason) |
played_ms | integer | optional | Milliseconds of audio actually played |
TTS synthesis or playback failed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: tts.error |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
tts_id | string | optional | TTS playback identifier |
error | string | optional | Error message |
category | string | optional | Failure category: permanent_auth, permanent_input, rate_limited, service_unavailable, retryable, canceled or unknown for a synthesis failure, playback for a failure while streaming the audio. New values may be added; treat an unrecognised value as unknown |
Preflight TTS finished synthesizing and is ready to commit
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: tts.staged |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | |
app_id | string | optional | |
tts_id | string | optional | TTS playback identifier, to commit or discard |
bytes | integer | optional | Size of the buffered audio |
duration_ms | integer | optional | How long the buffered audio will play for. 0 when the duration is not derivable from the audio format |
Staged TTS was dropped without being played
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: tts.discarded |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | |
app_id | string | optional | |
tts_id | string | optional | TTS playback identifier |
reason | string | optional | Why the staged utterance was dropped: 'app' (explicitly discarded), 'expired' (TTS_PREFLIGHT_TTL elapsed) or 'leg_gone' (the leg ended while it was staged) |
Recording began
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.started |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
file | string | optional | Recording file path or S3 URI — does not exist yet; the path only appears when the recording stops |
Recording ended
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.finished |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
file | string | optional | Recording file path or S3 URI |
multi_channel_file | string | optional | |
channels | object | optional | |
omitted_legs | array[string] | optional | Participants whose audio is missing from multi_channel_file because their capture failed. Absent when the recording is complete |
Recording paused (audio replaced with silence)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.paused |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
file | string | optional |
Recording resumed from a paused state
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: recording.resumed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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; decide via accept_transfer/decline_transfer (unless SIP_REFER_AUTO_DIAL=true)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_requested |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | Vestigial (always false); retained for wire compatibility. The outcome now flows via leg.transfer_completed / leg.transfer_failed after the app decides |
Transfer progress reported via NOTIFY sipfrag
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.transfer_progress |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
room_id | string | optional | Room identifier |
app_id | string | optional |
Room deleted
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.deleted |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
room_id | string | optional | Room identifier |
app_id | string | optional |
Two rooms' mixers were joined
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.bridged |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
bridge_id | string | optional | Bridge identifier |
room_a_id | string | optional | First bridged room |
room_b_id | string | optional | Second bridged room |
app_id | string | optional | |
direction | string | optional | Canonical direction relative to room_a_id: "bidirectional", "a_to_b", "b_to_a", or "none" |
A bridge's audio flow direction changed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.bridge_updated |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
bridge_id | string | optional | Bridge identifier |
room_a_id | string | optional | First bridged room |
room_b_id | string | optional | Second bridged room |
app_id | string | optional | |
direction | string | optional | New canonical direction relative to room_a_id |
A bridge was torn down
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.unbridged |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
bridge_id | string | optional | Bridge identifier |
room_a_id | string | optional | First bridged room |
room_b_id | string | optional | Second bridged room |
app_id | string | optional | |
reason | string | optional | Empty for an explicit delete, or "room_deleted" when a bridged room was deleted |
The room's audio routing matrix changed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: room.routing_changed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
room_id | string | optional | |
app_id | string | optional | |
matrix | object | optional | |
reason | string | optional |
A leg's routing role changed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.role_changed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | |
room_id | string | optional | |
app_id | string | optional | |
old_role | string | optional | |
new_role | string | optional |
Speech-to-text transcript
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: stt.text |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
stream_id | string | optional | Which of the leg's audio streams this came from. Empty when the leg's audio is the call itself; set for a recording session, where each stream is a different party. Resolve it through GET /v1/legs/{id}/siprec |
text | string | optional | Transcribed text |
is_final | boolean | optional | Whether this is a final or partial transcript |
speech_final | boolean | optional | Whether the speaker stopped talking, as opposed to is_final's 'this segment will not change again'. Deepgram only; always false for providers that do not report it |
audio_start_ms | integer | optional | Where in the stream this was said, in milliseconds from the first audio the transcriber was given. Absent when the provider reports no timing. Not the same as the event's arrival time, which is when the provider finished rather than when the words were spoken |
audio_end_ms | integer | optional | End of the span audio_start_ms opens |
Speech-to-text turn boundary
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: stt.turn |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
stream_id | string | optional | Which of the leg's audio streams this turn belongs to. Empty when the leg's audio is the call itself. See stt.text.stream_id |
event | string | optional | Turn boundary: start_of_turn, update, eager_end_of_turn, turn_resumed or end_of_turn (Deepgram Flux), or utterance_end (Deepgram, when utterance_end_ms is set). New values may be added |
turn_index | integer | optional | Index of the turn within the session, incrementing after each end_of_turn |
text | string | optional | Transcript of the turn so far. Empty on utterance_end |
end_of_turn_confidence | number | optional | How confident the model is that the turn has ended |
audio_window_start_ms | integer | optional | Start of the audio window this transcript covers |
audio_window_end_ms | integer | optional | End of the audio window this transcript covers |
last_word_end_ms | integer | optional | When the last word ended (utterance_end only) |
words | array[object] | optional | Per-word transcript with timings and confidence, when the provider supplies it |
languages | array[string] | optional | Languages detected in the turn |
Agent connected to provider
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: agent.connected |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional |
User speech transcribed by agent
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: agent.user_transcript |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
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 | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
room_id | string | optional | Room identifier |
app_id | string | optional | |
text | string | optional | Agent response text |
Answering machine detection completed
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: amd.result |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
result | string | optional | Detection result: human, machine, no_speech, or not_sure |
initial_silence_ms | integer | optional | Milliseconds of silence before first speech |
greeting_duration_ms | integer | optional | Milliseconds of speech in the greeting |
total_analysis_ms | integer | optional | Total milliseconds of analysis before determination |
Voicemail beep tone detected after machine classification
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: amd.beep |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
leg_id | string | optional | Leg identifier |
app_id | string | optional | |
beep_ms | integer | optional | Milliseconds from machine detection to beep tone detection |
Inbound REGISTER surfaced for a challenge/accept/reject decision (auto-accepts on consult timeout)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: sip.registration_attempt |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
app_id | string | optional | |
attempt_id | string | optional | |
aor | string | optional | |
contact | string | optional | |
source_address | string | optional | |
transport | string | optional | |
user_agent | string | optional | |
call_id | string | optional | |
has_authorization | boolean | optional |
SIP AOR registration created or refreshed (one event per Contact)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: sip.registration_active |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
app_id | string | optional | |
aor | string | optional | Canonical Address of Record (e.g. sip:alice@vb.example) |
contact | string | optional | Contact URI registered by the UA |
socket | string | optional | Transport-layer socket (ip:port) the REGISTER arrived on |
transport | string | optional | Transport: udp | tcp | tls |
user_agent | string | optional | User-Agent header from the REGISTER, if present |
call_id | string | optional | Call-ID of the most recent REGISTER |
granted_expires_seconds | integer | optional | Expiry granted to the binding (clamped to SIP_REGISTRATION_MAX_EXPIRES_SECONDS) |
expires_at | string | optional | Absolute expiry time (RFC 3339) |
SIP AOR registration removed (TTL, explicit unregister, force-delete, or single-binding replacement)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: sip.registration_expired |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
app_id | string | optional | |
aor | string | optional | Canonical Address of Record |
contact | string | optional | Contact URI that was unbound |
socket | string | optional | Transport-layer socket that held the binding |
reason | string | optional | Why the binding was removed: ttl, unregistered, forced, or replaced |
Outbound SIP trunk REGISTER accepted (initial or refresh)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: sip.outbound_registration_active |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
app_id | string | optional | |
trunk_id | string | optional | |
aor | string | optional | |
registrar | string | optional | |
contact | string | optional | |
granted_expires_seconds | integer | optional | |
expires_at | string | optional | |
call_id | string | optional | |
source_address | string | optional |
Outbound SIP trunk REGISTER failed (transport error, non-2xx response, or digest auth rejected)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: sip.outbound_registration_failed |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
app_id | string | optional | |
trunk_id | string | optional | |
aor | string | optional | |
registrar | string | optional | |
status_code | integer | optional | |
reason | string | optional | |
error | string | optional |
Outbound SIP trunk removed (DELETE, shutdown, or refresh failed past granted lifetime)
Payload
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: sip.outbound_registration_expired |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |
app_id | string | optional | |
trunk_id | string | optional | |
aor | string | optional | |
registrar | string | optional | |
reason | string | optional |
Schemas
Objects carried by the event payloads above.
ChannelInfo
| Field | Type | Description | |
|---|---|---|---|
channel | integer | required | |
start_ms | integer | required | |
end_ms | integer | required |
OfferedCodec
| Field | Type | Description | |
|---|---|---|---|
name | string | required | |
payload_type | integer | required | |
clock_rate | integer | required | |
priority | integer | required |
ParticipantInfo
| Field | Type | Description | |
|---|---|---|---|
id | string | required | |
aor | string | optional | |
name | string | optional |
SIPRECStream
| Field | Type | Description | |
|---|---|---|---|
label | string | optional | |
leg_stream_id | string | optional | |
participant_id | string | optional | |
participant_aor | string | optional | |
participant_name | string | optional |
STTWord
| Field | Type | Description | |
|---|---|---|---|
word | string | required | |
confidence | number | required | |
start_ms | integer | required | |
end_ms | integer | required |
WebhookEvent
Event envelope delivered via HTTP POST to registered webhook URLs. Event-specific fields are flattened into the top-level object (no "data" wrapper). Includes X-Signature-256 header when a secret is configured, and an X-Event-Id header equal to the event_id field.
| Field | Type | Description | |
|---|---|---|---|
type | enum | required | Values: leg.ringing, leg.early_media, leg.connected, leg.disconnected, leg.joined_room, leg.left_room, leg.muted, leg.unmuted, leg.deaf, leg.undeaf, leg.hold, leg.unhold, leg.command_failed, leg.stream_added, leg.stream_removed, leg.stream_rejected, leg.stream_failed, leg.stream_room_changed, leg.stream_role_changed, siprec.session_started, siprec.session_ended, siprec.metadata_updated, siprec.participant_joined, siprec.participant_left, dtmf.received, rtt.received, speaking.started, speaking.stopped, playback.started, playback.finished, playback.error, tts.started, tts.finished, tts.error, tts.staged, tts.discarded, recording.started, recording.finished, recording.paused, recording.resumed, leg.transfer_initiated, leg.transfer_requested, leg.transfer_progress, leg.transfer_completed, leg.transfer_failed, room.created, room.deleted, room.bridged, room.bridge_updated, room.unbridged, room.routing_changed, leg.role_changed, stt.text, stt.turn, agent.connected, agent.disconnected, agent.user_transcript, agent.agent_response, amd.result, amd.beep, sip.registration_attempt, sip.registration_active, sip.registration_expired, sip.outbound_registration_active, sip.outbound_registration_failed, sip.outbound_registration_expired |
timestamp | string(date-time) | required | |
event_id | string(uuid) | optional | Stable per-event idempotency key; identical across delivery retries and across all subscribers of the event. |
instance_id | string | optional | Instance identifier |
custom_data | any | optional | Opaque application JSON attached to the event's leg via custom_data at leg creation, answer, ring or early-media. Any JSON value. Absent when the leg has none. |