Events

Last updated August 14, 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
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[any]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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
leg_idstringoptional
app_idstringoptional
session_idstringoptional
data_modestringoptional
participantsarray[any]optional
streamsarray[any]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
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
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[any]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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
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
# 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
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
app_idstringoptional
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[any]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
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
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
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
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
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
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
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
app_idstringoptional
aorstringoptionalCanonical Address of Record (e.g. sip:[email protected])
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
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
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
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
app_idstringoptional
trunk_idstringoptional
aorstringoptional
registrarstringoptional
reasonstringoptional