Events

Last updated April 16, 2026

Webhook event payloads delivered to your registered URL. Each event is sent as a POST request with a JSON body.

# EVENT leg.ringing

SIP call ringing (inbound or outbound)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.ringing
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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
# 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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
leg_typestringoptionalLeg type (e.g. sip_outbound)
# EVENT leg.connected

Leg answered/connected

Payload

FieldTypeDescription
typeenumrequired
Values: leg.connected
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
cdrobjectoptional
reasonenumrequiredDisconnect reason. Common SIP failures are mapped to named reasons; unmapped 4xx/5xx/6xx codes appear as sip_{code}.
Values: api_hangup, remote_bye, caller_cancel, ring_timeout, max_duration, busy, unavailable, not_found, forbidden, unauthorized, timeout, cancelled, not_acceptable, service_unavailable, declined, rtp_timeout, session_expired, invite_failed, connect_failed, ice_failure
duration_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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
# EVENT leg.left_room

Leg removed from a room

Payload

FieldTypeDescription
typeenumrequired
Values: leg.left_room
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
# EVENT leg.muted

Leg muted

Payload

FieldTypeDescription
typeenumrequired
Values: leg.muted
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
# EVENT leg.unmuted

Leg unmuted

Payload

FieldTypeDescription
typeenumrequired
Values: leg.unmuted
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
# EVENT leg.hold

Leg put on hold (local or remote)

Payload

FieldTypeDescription
typeenumrequired
Values: leg.hold
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
leg_typestringoptionalHold direction: "local" or "remote"
# EVENT dtmf.received

DTMF digit received

Payload

FieldTypeDescription
typeenumrequired
Values: dtmf.received
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
digitstringoptionalDTMF digit received
# EVENT speaking.started

Participant started speaking

Payload

FieldTypeDescription
typeenumrequired
Values: speaking.started
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier (present only when the leg is in a room)
# EVENT speaking.stopped

Participant stopped speaking

Payload

FieldTypeDescription
typeenumrequired
Values: speaking.stopped
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier (present only when the leg is in a room)
# EVENT playback.started

Playback began

Payload

FieldTypeDescription
typeenumrequired
Values: playback.started
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
playback_idstringoptionalPlayback identifier
# EVENT playback.finished

Playback ended

Payload

FieldTypeDescription
typeenumrequired
Values: playback.finished
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
playback_idstringoptionalPlayback identifier
# EVENT playback.error

Playback failed

Payload

FieldTypeDescription
typeenumrequired
Values: playback.error
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
playback_idstringoptionalPlayback identifier
errorstringoptionalError message
# EVENT tts.started

TTS synthesis began playing

Payload

FieldTypeDescription
typeenumrequired
Values: tts.started
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
tts_idstringoptionalTTS playback identifier
# EVENT tts.finished

TTS synthesis finished playing

Payload

FieldTypeDescription
typeenumrequired
Values: tts.finished
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
tts_idstringoptionalTTS playback identifier
# EVENT tts.error

TTS synthesis or playback failed

Payload

FieldTypeDescription
typeenumrequired
Values: tts.error
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
tts_idstringoptionalTTS playback identifier
errorstringoptionalError message
# EVENT recording.started

Recording began

Payload

FieldTypeDescription
typeenumrequired
Values: recording.started
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
filestringoptionalRecording file path or S3 URI
# EVENT recording.finished

Recording ended

Payload

FieldTypeDescription
typeenumrequired
Values: recording.finished
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
filestringoptionalRecording file path or S3 URI
multi_channel_filestringoptional
channelsobjectoptional
# EVENT recording.paused

Recording paused (audio replaced with silence)

Payload

FieldTypeDescription
typeenumrequired
Values: recording.paused
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
filestringoptional
# EVENT recording.resumed

Recording resumed from a paused state

Payload

FieldTypeDescription
typeenumrequired
Values: recording.resumed
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_requested
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
kindstringoptionalTransfer kind: "blind" or "attended"
targetstringoptionalSIP URI requested by the peer
replaces_call_idstringoptionalCall-ID present in the Refer-To Replaces parameter (attended only)
declinedbooleanoptionalTrue when the REFER was declined (e.g. SIP_REFER_AUTO_DIAL=false)
# EVENT leg.transfer_progress

Transfer progress reported via NOTIFY sipfrag

Payload

FieldTypeDescription
typeenumrequired
Values: leg.transfer_progress
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
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
instance_idstringoptionalInstance identifier
room_idstringoptionalRoom identifier
# EVENT room.deleted

Room deleted

Payload

FieldTypeDescription
typeenumrequired
Values: room.deleted
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
room_idstringoptionalRoom identifier
# EVENT stt.text

Speech-to-text transcript

Payload

FieldTypeDescription
typeenumrequired
Values: stt.text
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
textstringoptionalTranscribed text
is_finalbooleanoptionalWhether this is a final or partial transcript
# EVENT agent.connected

Agent connected to provider

Payload

FieldTypeDescription
typeenumrequired
Values: agent.connected
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
conversation_idstringoptionalProvider-assigned conversation identifier
# EVENT agent.disconnected

Agent session ended

Payload

FieldTypeDescription
typeenumrequired
Values: agent.disconnected
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
# EVENT agent.user_transcript

User speech transcribed by agent

Payload

FieldTypeDescription
typeenumrequired
Values: agent.user_transcript
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
textstringoptionalUser speech text
# EVENT agent.agent_response

Agent generated a response

Payload

FieldTypeDescription
typeenumrequired
Values: agent.agent_response
timestampstring(date-time)required
instance_idstringoptionalInstance identifier
leg_idstringoptionalLeg identifier
room_idstringoptionalRoom identifier
textstringoptionalAgent response text