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.

# EVENT leg.ringing

SIP call ringing (inbound or outbound)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.ringing
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
leg_typestringoptionalLeg type (e.g. sip_inbound, sip_outbound)
uristringoptionalDialed SIP URI (outbound only)
fromstringoptionalCaller URI (inbound) or From header value (outbound, if set)
tostringoptionalCallee URI (inbound only)
sip_headersobjectoptionalX-* custom SIP headers, if present
offered_codecsarray[object]optional
trunk_idstringoptional
source_addressstringoptional
authenticatedbooleanoptional
auth_usernamestringoptional
# EVENT leg.early_media

Outbound leg received 183 Session Progress with SDP; media pipeline active

Payload

FieldTypeDescription
typeenumrequired
Values: leg.early_media
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
leg_typestringoptionalLeg type (e.g. sip_outbound)
# EVENT leg.connected

Leg answered/connected

Payload

FieldTypeDescription
typeenumrequired
Values: leg.connected
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
leg_typestringoptionalLeg type (e.g. sip_inbound, sip_outbound, webrtc)
# EVENT leg.disconnected

Leg hung up (CDR-style nested structure)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.disconnected
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
cdrobjectoptional
reasonstringrequiredDisconnect 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_totalnumberrequiredSeconds from leg creation to disconnect
duration_answerednumberrequiredSeconds from answer to disconnect (0 if never answered)
qualityobjectoptionalRTP quality metrics. Omitted for WebRTC legs or unanswered legs with no media.
mos_scorenumberrequiredMean Opinion Score (1.0–5.0) estimated via simplified E-model (ITU-T G.107) from packet loss and jitter
rtp_packets_receivedintegerrequiredTotal inbound RTP audio packets received
rtp_packets_lostintegerrequiredEstimated lost packets based on sequence number gaps
rtp_jitter_msnumberrequiredInter-arrival jitter in milliseconds (RFC 3550 §A.8)
# EVENT leg.joined_room

Leg added to a room

Payload

FieldTypeDescription
typeenumrequired
Values: leg.joined_room
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
# EVENT leg.left_room

Leg removed from a room

Payload

FieldTypeDescription
typeenumrequired
Values: leg.left_room
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
# EVENT leg.muted

Leg muted

Payload

FieldTypeDescription
typeenumrequired
Values: leg.muted
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
# EVENT leg.unmuted

Leg unmuted

Payload

FieldTypeDescription
typeenumrequired
Values: leg.unmuted
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
# EVENT leg.deaf

Leg deafened (stops receiving room audio)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.deaf
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
# EVENT leg.undeaf

Leg undeafened (resumes receiving room audio)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.undeaf
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
# EVENT leg.hold

Leg put on hold (local or remote)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.hold
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
leg_typestringoptionalHold direction: "local" (we put them on hold) or "remote" (they put us on hold)
# EVENT leg.unhold

Leg taken off hold (local or remote)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.unhold
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
leg_typestringoptionalHold direction: "local" or "remote"
# EVENT leg.command_failed

An asynchronous leg command (202 Accepted) failed during execution

Payload

FieldTypeDescription
typeenumrequired
Values: leg.command_failed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
commandstringoptional
errorstringoptional
# EVENT leg.stream_added

An additional m=audio stream was negotiated on a live dialog

Payload

FieldTypeDescription
typeenumrequired
Values: leg.stream_added
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
stream_idstringoptional
midstringoptional
directionstringoptional
langstringoptional
room_idstringoptional
rolestringoptional
reasonstringoptional
# EVENT leg.stream_removed

An audio stream was disabled with a port-0 re-INVITE; its m-line slot survives as a tombstone

Payload

FieldTypeDescription
typeenumrequired
Values: leg.stream_removed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
stream_idstringoptional
midstringoptional
directionstringoptional
langstringoptional
room_idstringoptional
rolestringoptional
reasonstringoptional
# EVENT leg.stream_rejected

The peer refused an additional audio stream, or it could not be negotiated; the call is unaffected

Payload

FieldTypeDescription
typeenumrequired
Values: leg.stream_rejected
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
stream_idstringoptional
midstringoptional
directionstringoptional
langstringoptional
room_idstringoptional
rolestringoptional
reasonstringoptional
# EVENT leg.stream_failed

An audio stream's media loop failed and the stream was torn down; the call continues on its remaining streams

Payload

FieldTypeDescription
typeenumrequired
Values: leg.stream_failed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
stream_idstringoptional
midstringoptional
directionstringoptional
langstringoptional
room_idstringoptional
rolestringoptional
reasonstringoptional
# EVENT leg.stream_room_changed

An audio stream was attached to or detached from a room (an empty room_id means detached)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.stream_room_changed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
stream_idstringoptional
midstringoptional
directionstringoptional
langstringoptional
room_idstringoptional
rolestringoptional
reasonstringoptional
# EVENT leg.stream_role_changed

An audio stream's routing role changed; the room's allow-sets were recomputed atomically

Payload

FieldTypeDescription
typeenumrequired
Values: leg.stream_role_changed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
stream_idstringoptional
midstringoptional
directionstringoptional
langstringoptional
room_idstringoptional
rolestringoptional
reasonstringoptional
# EVENT siprec.session_started

An inbound SIPREC recording session was accepted; carries the participants and the stream-to-participant bindings

Payload

FieldTypeDescription
typeenumrequired
Values: siprec.session_started
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
session_idstringoptional
data_modestringoptional
participantsarray[object]optional
streamsarray[object]optional
# EVENT siprec.session_ended

A SIPREC recording session ended

Payload

FieldTypeDescription
typeenumrequired
Values: siprec.session_ended
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
session_idstringoptional
reasonstringoptional
# EVENT siprec.metadata_updated

A SIPREC recording session's metadata document was updated on a re-INVITE

Payload

FieldTypeDescription
typeenumrequired
Values: siprec.metadata_updated
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
session_idstringoptional
data_modestringoptional
participants_joinedarray[string]optional
participants_leftarray[string]optional
streams_addedarray[string]optional
streams_removedarray[string]optional
streamsarray[object]optional
# EVENT siprec.participant_joined

A party joined the call being recorded by a SIPREC session

Payload

FieldTypeDescription
typeenumrequired
Values: siprec.participant_joined
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
session_idstringoptional
labelstringoptional
leg_stream_idstringoptional
participant_idstringoptional
participant_aorstringoptional
participant_namestringoptional
# EVENT siprec.participant_left

A party left the call being recorded by a SIPREC session

Payload

FieldTypeDescription
typeenumrequired
Values: siprec.participant_left
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
session_idstringoptional
labelstringoptional
leg_stream_idstringoptional
participant_idstringoptional
participant_aorstringoptional
participant_namestringoptional
# EVENT dtmf.received

DTMF digit received

Payload

FieldTypeDescription
typeenumrequired
Values: dtmf.received
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
digitstringoptionalDTMF digit received
seqintegeroptional
# EVENT rtt.received

Real-Time Text (T.140 / RFC 4103) chunk received from the remote

Payload

FieldTypeDescription
typeenumrequired
Values: rtt.received
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
textstringoptionalUTF-8 text chunk received from the remote
seqintegeroptionalPer-leg monotonic sequence (independent of RTP sequence numbers)
loss_markerbooleanoptionalTrue when a U+FFFD has been prepended to indicate text was lost beyond what RFC 2198 redundancy could recover
# EVENT speaking.started

Participant started speaking

Payload

FieldTypeDescription
typeenumrequired
Values: speaking.started
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier (present only when the leg is in a room)
app_idstringoptional
# EVENT speaking.stopped

Participant stopped speaking

Payload

FieldTypeDescription
typeenumrequired
Values: speaking.stopped
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier (present only when the leg is in a room)
app_idstringoptional
# EVENT playback.started

Playback began

Payload

FieldTypeDescription
typeenumrequired
Values: playback.started
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
playback_idstringoptionalPlayback identifier
# EVENT playback.finished

Playback ended

Payload

FieldTypeDescription
typeenumrequired
Values: playback.finished
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
playback_idstringoptionalPlayback identifier
reasonstringoptionalWhy playback ended: 'completed' (reached the end of the audio) or 'stopped' (did not reach the end, for any reason)
played_msintegeroptionalMilliseconds of audio actually played, accumulated across repeat iterations
# EVENT playback.error

Playback failed

Payload

FieldTypeDescription
typeenumrequired
Values: playback.error
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
playback_idstringoptionalPlayback identifier
errorstringoptionalError message
# EVENT tts.started

TTS synthesis began playing

Payload

FieldTypeDescription
typeenumrequired
Values: tts.started
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
tts_idstringoptionalTTS playback identifier
# EVENT tts.finished

TTS synthesis finished playing

Payload

FieldTypeDescription
typeenumrequired
Values: tts.finished
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
tts_idstringoptionalTTS playback identifier
reasonstringoptionalWhy the utterance ended: 'completed' (reached the end of the audio) or 'stopped' (did not reach the end, for any reason)
played_msintegeroptionalMilliseconds of audio actually played
# EVENT tts.error

TTS synthesis or playback failed

Payload

FieldTypeDescription
typeenumrequired
Values: tts.error
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
tts_idstringoptionalTTS playback identifier
errorstringoptionalError message
categorystringoptionalFailure 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
# EVENT tts.staged

Preflight TTS finished synthesizing and is ready to commit

Payload

FieldTypeDescription
typeenumrequired
Values: tts.staged
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptional
app_idstringoptional
tts_idstringoptionalTTS playback identifier, to commit or discard
bytesintegeroptionalSize of the buffered audio
duration_msintegeroptionalHow long the buffered audio will play for. 0 when the duration is not derivable from the audio format
# EVENT tts.discarded

Staged TTS was dropped without being played

Payload

FieldTypeDescription
typeenumrequired
Values: tts.discarded
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptional
app_idstringoptional
tts_idstringoptionalTTS playback identifier
reasonstringoptionalWhy the staged utterance was dropped: 'app' (explicitly discarded), 'expired' (TTS_PREFLIGHT_TTL elapsed) or 'leg_gone' (the leg ended while it was staged)
# EVENT recording.started

Recording began

Payload

FieldTypeDescription
typeenumrequired
Values: recording.started
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
filestringoptionalRecording file path or S3 URI — does not exist yet; the path only appears when the recording stops
# EVENT recording.finished

Recording ended

Payload

FieldTypeDescription
typeenumrequired
Values: recording.finished
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
filestringoptionalRecording file path or S3 URI
multi_channel_filestringoptional
channelsobjectoptional
omitted_legsarray[string]optionalParticipants whose audio is missing from multi_channel_file because their capture failed. Absent when the recording is complete
# EVENT recording.paused

Recording paused (audio replaced with silence)

Payload

FieldTypeDescription
typeenumrequired
Values: recording.paused
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
filestringoptional
# EVENT recording.resumed

Recording resumed from a paused state

Payload

FieldTypeDescription
typeenumrequired
Values: recording.resumed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
filestringoptional
# EVENT leg.transfer_initiated

We sent a SIP REFER (transfer initiated by the operator)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_initiated
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
kindstringoptionalTransfer kind: "blind" or "attended"
targetstringoptionalSIP URI to which the leg is being transferred
replaces_leg_idstringoptionalLeg whose dialog is replaced (attended transfer only)
# EVENT leg.transfer_requested

We received a SIP REFER from the peer; decide via accept_transfer/decline_transfer (unless SIP_REFER_AUTO_DIAL=true)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_requested
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
kindstringoptionalTransfer kind: "blind" or "attended"
targetstringoptionalSIP URI requested by the peer
replaces_call_idstringoptionalCall-ID present in the Refer-To Replaces parameter (attended only)
declinedbooleanoptionalVestigial (always false); retained for wire compatibility. The outcome now flows via leg.transfer_completed / leg.transfer_failed after the app decides
# EVENT leg.transfer_progress

Transfer progress reported via NOTIFY sipfrag

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_progress
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
status_codeintegeroptionalProvisional SIP status from the NOTIFY sipfrag
reasonstringoptionalReason phrase
# EVENT leg.transfer_completed

Transfer reached terminal 2xx

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_completed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
status_codeintegeroptionalFinal 2xx SIP status from the NOTIFY sipfrag
reasonstringoptionalReason phrase
# EVENT leg.transfer_failed

Transfer failed (REFER rejected, sipfrag non-2xx, or local error)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_failed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
status_codeintegeroptionalFinal non-2xx SIP status (when applicable)
reasonstringoptionalReason phrase
errorstringoptionalLocal error message (when no SIP status applies)
# EVENT room.created

Room created

Payload

FieldTypeDescription
typeenumrequired
Values: room.created
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalRoom identifier
app_idstringoptional
# EVENT room.deleted

Room deleted

Payload

FieldTypeDescription
typeenumrequired
Values: room.deleted
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalRoom identifier
app_idstringoptional
# EVENT room.bridged

Two rooms' mixers were joined

Payload

FieldTypeDescription
typeenumrequired
Values: room.bridged
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalBridge identifier
room_a_idstringoptionalFirst bridged room
room_b_idstringoptionalSecond bridged room
app_idstringoptional
directionstringoptionalCanonical direction relative to room_a_id: "bidirectional", "a_to_b", "b_to_a", or "none"
# EVENT room.bridge_updated

A bridge's audio flow direction changed

Payload

FieldTypeDescription
typeenumrequired
Values: room.bridge_updated
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalBridge identifier
room_a_idstringoptionalFirst bridged room
room_b_idstringoptionalSecond bridged room
app_idstringoptional
directionstringoptionalNew canonical direction relative to room_a_id
# EVENT room.unbridged

A bridge was torn down

Payload

FieldTypeDescription
typeenumrequired
Values: room.unbridged
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalBridge identifier
room_a_idstringoptionalFirst bridged room
room_b_idstringoptionalSecond bridged room
app_idstringoptional
reasonstringoptionalEmpty for an explicit delete, or "room_deleted" when a bridged room was deleted
# EVENT room.routing_changed

The room's audio routing matrix changed

Payload

FieldTypeDescription
typeenumrequired
Values: room.routing_changed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
app_idstringoptional
matrixobjectoptional
reasonstringoptional
# EVENT leg.role_changed

A leg's routing role changed

Payload

FieldTypeDescription
typeenumrequired
Values: leg.role_changed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
room_idstringoptional
app_idstringoptional
old_rolestringoptional
new_rolestringoptional
# EVENT stt.text

Speech-to-text transcript

Payload

FieldTypeDescription
typeenumrequired
Values: stt.text
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
stream_idstringoptionalWhich 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
textstringoptionalTranscribed text
is_finalbooleanoptionalWhether this is a final or partial transcript
speech_finalbooleanoptionalWhether 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_msintegeroptionalWhere 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_msintegeroptionalEnd of the span audio_start_ms opens
# EVENT stt.turn

Speech-to-text turn boundary

Payload

FieldTypeDescription
typeenumrequired
Values: stt.turn
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
stream_idstringoptionalWhich 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
eventstringoptionalTurn 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_indexintegeroptionalIndex of the turn within the session, incrementing after each end_of_turn
textstringoptionalTranscript of the turn so far. Empty on utterance_end
end_of_turn_confidencenumberoptionalHow confident the model is that the turn has ended
audio_window_start_msintegeroptionalStart of the audio window this transcript covers
audio_window_end_msintegeroptionalEnd of the audio window this transcript covers
last_word_end_msintegeroptionalWhen the last word ended (utterance_end only)
wordsarray[object]optionalPer-word transcript with timings and confidence, when the provider supplies it
languagesarray[string]optionalLanguages detected in the turn
# EVENT agent.connected

Agent connected to provider

Payload

FieldTypeDescription
typeenumrequired
Values: agent.connected
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
conversation_idstringoptionalProvider-assigned conversation identifier
# EVENT agent.disconnected

Agent session ended

Payload

FieldTypeDescription
typeenumrequired
Values: agent.disconnected
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
# EVENT agent.user_transcript

User speech transcribed by agent

Payload

FieldTypeDescription
typeenumrequired
Values: agent.user_transcript
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
textstringoptionalUser speech text
# EVENT agent.agent_response

Agent generated a response

Payload

FieldTypeDescription
typeenumrequired
Values: agent.agent_response
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
textstringoptionalAgent response text
# EVENT amd.result

Answering machine detection completed

Payload

FieldTypeDescription
typeenumrequired
Values: amd.result
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
resultstringoptionalDetection result: human, machine, no_speech, or not_sure
initial_silence_msintegeroptionalMilliseconds of silence before first speech
greeting_duration_msintegeroptionalMilliseconds of speech in the greeting
total_analysis_msintegeroptionalTotal milliseconds of analysis before determination
# EVENT amd.beep

Voicemail beep tone detected after machine classification

Payload

FieldTypeDescription
typeenumrequired
Values: amd.beep
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptionalLeg identifier
app_idstringoptional
beep_msintegeroptionalMilliseconds from machine detection to beep tone detection
# EVENT sip.registration_attempt

Inbound REGISTER surfaced for a challenge/accept/reject decision (auto-accepts on consult timeout)

Payload

FieldTypeDescription
typeenumrequired
Values: sip.registration_attempt
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
attempt_idstringoptional
aorstringoptional
contactstringoptional
source_addressstringoptional
transportstringoptional
user_agentstringoptional
call_idstringoptional
has_authorizationbooleanoptional
# EVENT sip.registration_active

SIP AOR registration created or refreshed (one event per Contact)

Payload

FieldTypeDescription
typeenumrequired
Values: sip.registration_active
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
aorstringoptionalCanonical Address of Record (e.g. sip:alice@vb.example)
contactstringoptionalContact URI registered by the UA
socketstringoptionalTransport-layer socket (ip:port) the REGISTER arrived on
transportstringoptionalTransport: udp | tcp | tls
user_agentstringoptionalUser-Agent header from the REGISTER, if present
call_idstringoptionalCall-ID of the most recent REGISTER
granted_expires_secondsintegeroptionalExpiry granted to the binding (clamped to SIP_REGISTRATION_MAX_EXPIRES_SECONDS)
expires_atstringoptionalAbsolute expiry time (RFC 3339)
# EVENT sip.registration_expired

SIP AOR registration removed (TTL, explicit unregister, force-delete, or single-binding replacement)

Payload

FieldTypeDescription
typeenumrequired
Values: sip.registration_expired
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
aorstringoptionalCanonical Address of Record
contactstringoptionalContact URI that was unbound
socketstringoptionalTransport-layer socket that held the binding
reasonstringoptionalWhy the binding was removed: ttl, unregistered, forced, or replaced
# EVENT sip.outbound_registration_active

Outbound SIP trunk REGISTER accepted (initial or refresh)

Payload

FieldTypeDescription
typeenumrequired
Values: sip.outbound_registration_active
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
trunk_idstringoptional
aorstringoptional
registrarstringoptional
contactstringoptional
granted_expires_secondsintegeroptional
expires_atstringoptional
call_idstringoptional
source_addressstringoptional
# EVENT sip.outbound_registration_failed

Outbound SIP trunk REGISTER failed (transport error, non-2xx response, or digest auth rejected)

Payload

FieldTypeDescription
typeenumrequired
Values: sip.outbound_registration_failed
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
trunk_idstringoptional
aorstringoptional
registrarstringoptional
status_codeintegeroptional
reasonstringoptional
errorstringoptional
# EVENT sip.outbound_registration_expired

Outbound SIP trunk removed (DELETE, shutdown, or refresh failed past granted lifetime)

Payload

FieldTypeDescription
typeenumrequired
Values: sip.outbound_registration_expired
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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_idstringoptional
trunk_idstringoptional
aorstringoptional
registrarstringoptional
reasonstringoptional

Schemas

Objects carried by the event payloads above.

ChannelInfo

FieldTypeDescription
channelintegerrequired
start_msintegerrequired
end_msintegerrequired

OfferedCodec

FieldTypeDescription
namestringrequired
payload_typeintegerrequired
clock_rateintegerrequired
priorityintegerrequired

ParticipantInfo

FieldTypeDescription
idstringrequired
aorstringoptional
namestringoptional

SIPRECStream

FieldTypeDescription
labelstringoptional
leg_stream_idstringoptional
participant_idstringoptional
participant_aorstringoptional
participant_namestringoptional

STTWord

FieldTypeDescription
wordstringrequired
confidencenumberrequired
start_msintegerrequired
end_msintegerrequired

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.

FieldTypeDescription
typeenumrequired
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
timestampstring(date-time)required
event_idstring(uuid)optionalStable per-event idempotency key; identical across delivery retries and across all subscribers of the event.
instance_idstringoptionalInstance identifier
custom_dataanyoptionalOpaque 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.