Dialt
Get API key

Realtime API reference

Dialt Realtime API

AsyncAPI 3.1.0 · API version 1.0.0

Realtime voice or text conversations over one WebSocket. Send a JSON start frame first, then either binary microphone audio or input_text controls. Authenticate with api_key in the start frame or an Authorization: Bearer header on the WebSocket handshake.

Need exact payload schemas or validation constraints? Download the machine-readable AsyncAPI contract.

Operations

sendClientMessages

send · Send the start frame, microphone audio, and client controls

start, reset, inputText, setVoice, toolDeferred, toolResult, toolProgress, toolPartialResult, toolInteractionUpdate, toolCancelClient, ambience, playbackStopped, playbackReport, microphoneAudio, webrtcOffer, interrupt, setTools, setToolChoice, triggerReply, injectContext

receiveServerMessages

receive · Receive lifecycle events, assistant audio, transcripts, and tool calls

ready, silentMic, turn, asr, utterance, injectContextAck, done, sessionEndRequested, interrupted, canceled, toolDeferredAck, toolDeferredResume, toolCall, toolCancelServer, toolJobDeliveryFailed, toolJobNarration, working, toolInteractionUpdateAck, voiceChanged, error, assistantAudio, webrtcIce, webrtcAnswer, webrtcBye, textDelta, permissionPending, permissionApproved, permissionRefused, sessionClosingSoon, lowCreditWarning

Messages

Client and server frames

MessageTitleSummary
startstartOpens a conversation. api_key may be omitted when the WebSocket handshake supplied Authorization: Bearer <key>. Voice mode requires audio; text mode omits it and requires the WebSocket transport.
inputTextinputTextCommit a user turn in text mode. Dialt emits the ordinary asr, turn, text_delta, utterance, and done events without audio frames.
resetreset
setVoicesetVoice
toolResulttoolResult
toolDeferredtoolDeferredDetach an eligible call from its voice turn while preserving managed job identity.
toolProgresstoolProgress
toolPartialResulttoolPartialResultDeliver a structured segment of an in-flight tool's eventual result without resolving the call.
toolInteractionUpdatetoolInteractionUpdateHost-side close of an open interaction (docs/client-tool-protocol.md §3a): the decision was resolved out-of-band, cancelled, or superseded by newer intent -- without completing the parent call. Stops the ask's queued or actively-speaking narration and tells the model the decision is closed. Always answered by toolInteractionUpdateAck; late/duplicate/unknown updates are rejected deterministically.
toolCancelClienttoolCancelClient
playbackStoppedplaybackStopped
readyready
silentMicsilentMic
turnturn
asrasr
injectContextAckinjectContextAckAuthoritative accepted/rejected acknowledgement for a correlated inject_context request.
utteranceutterance
donedone
sessionEndRequestedsessionEndRequested
interruptedinterrupted
canceledcanceled
textDeltatextDeltaStreamed assistant text, sent as the model produces it (ahead of audio and the final utterance frame).
permissionPendingpermissionPendingA tool call declared requires_permission is held pending explicit user approval.
permissionApprovedpermissionApprovedA pending permission was approved and the held tool call ran.
permissionRefusedpermissionRefusedA pending permission was declined; the held tool call did not run.
toolCalltoolCall
toolDeferredAcktoolDeferredAck
toolDeferredResumetoolDeferredResume
toolCancelServertoolCancelServer
toolJobDeliveryFailedtoolJobDeliveryFailedA queued background-job completion voiceover could not be delivered. The turn still closes with done; job_ids lists jobs whose spoken delivery is terminally failed (their results remain in conversation context and can be asked about), requeued lists jobs re-queued for one more proactive spoken attempt (a newer user turn may supersede it, as with any queued completion).
toolJobNarrationtoolJobNarrationNarration-lifecycle ack for a queued tool_partial_result `interaction` (docs/client-tool-protocol.md §3a). Scoped to interaction-kind jobs only -- a plain completion has no such wire-visible lifecycle.
workingworkingDialt is blocking on a tool result with nothing audible (the silence after the spoken bridge, until the final reply's first audio), or that wait has ended.
toolInteractionUpdateAcktoolInteractionUpdateAckDeterministic answer to every toolInteractionUpdate. applied=false carries a stable reason: invalid_interaction_id, invalid_state, unknown_interaction (never seen, or from before a reconnect -- interaction state does not survive a resume), or already_closed (first close wins: cancel dismissed it, its call resolved, a newer ask replaced it, or a duplicate of this very frame -- a user turn superseding the ask's narration deliberately does NOT close the decision).
voiceChangedvoiceChanged
errorerror
webrtcIcewebrtcIceExperimental. Sent over the signaling WebSocket right after a start frame carrying transport.kind webrtc. Build the RTCPeerConnection with these ice_servers, then send webrtcOffer.
webrtcOfferwebrtcOfferExperimental. Client's SDP offer, sent over the signaling WebSocket once the RTCPeerConnection is built with webrtcIce's servers.
webrtcAnswerwebrtcAnswerExperimental. Server's SDP answer to webrtcOffer. The call then lives on the peer connection; the signaling socket may drop afterwards without affecting it.
webrtcByebyeSent on the webrtc "control" data channel just before the server closes the peer connection — the webrtc transport's counterpart of a WebSocket close frame/code.
microphoneAudiomicrophoneAudio
assistantAudioassistantAudio
ambienceambience
interruptinterruptHost-initiated stop (moderation, a "stop talking" button, programmatic interruption). Unlike reset, this only drops the in-flight reply — conversation context and endpointer state are left intact. No payload beyond type.
setToolssetToolsMid-session tool swap: agents that change capability by call phase no longer need a reconnect, which would destroy the conversation.
setToolChoicesetToolChoiceReplace the effective tool_choice mid-session; applies from the next reply. one_shot: true reverts to the previous choice after the next user turn consumes the new one ("the next turn must use one of these"). An invalid value is rejected with an `error` frame (code invalid_tool_choice) and changes nothing. A mid-session setTools resets tool_choice to "auto" — re-apply it after swapping tools.
triggerReplytriggerReplyClient-triggered reply. Silently ignored if a reply is already in flight — do not stack these.
injectContextinjectContextText/context injection with authoritative delivery acknowledgement. Supply message_id to correlate inject_context_ack and typed-turn asr events.
sessionClosingSoonsessionClosingSoonWarns the client shortly before the server closes the connection due to the session time limit (or scoped credential expiry) — gives the client a chance to wrap up, or to reconnect with start.resume_token once closed.
lowCreditWarninglowCreditWarningAPI-key (paid) sessions only. Warns the client once when the account's remaining balance is running low, so the call doesn't just cut off mid-conversation when credit runs out.
playbackReportplaybackReport

Payload schemas and exact constraints remain available in the machine-readable AsyncAPI contract.

Field reference

Message payloads

Expand a message to see its exact fields - name, type, whether it's required, and its description.

startstart - Opens a conversation. api_key may be omitted when the WebSocket handshake supplied Authorization: Bearer <key>. Voice mode requires audio; text mode omits it and requires the WebSocket transport.
FieldTypeRequiredDescription
type"start"Yes
session_idstringYes
api_keystringNoPersistent or scoped key. Optional when supplied in the WebSocket Authorization header.
audioAudioConfigNo
clientClientInfoNo
modeModeYes
transportTransportConfigNo
resume_tokenstringNoA token from a previous session's ready frame. When it matches a still-live, unexpired stash from that session's disconnect, this session resumes its conversation context (and voice/tools/instructions, where this start frame doesn't already override them) instead of starting empty. An expired, unknown, consumed, or cross-account token is rejected with a non-retryable resume_failed error; callers may then deliberately start fresh without the token. Single-use: each resume consumes the stash and this session's own ready frame carries a new token.
inputTextinputText - Commit a user turn in text mode. Dialt emits the ordinary asr, turn, text_delta, utterance, and done events without audio frames.
FieldTypeRequiredDescription
type"input_text"Yes
textstringYesOne committed user turn. Accepted only when mode.modality is text.
resetreset
FieldTypeRequiredDescription
type"reset"Yes
setVoicesetVoice
FieldTypeRequiredDescription
type"set_voice"Yes
voicestringYes
toolResulttoolResult
FieldTypeRequiredDescription
type"tool_result"Yes
idstringYes
contentanyYes
outcome"succeeded" | "failed" | "cancelled" | "timed_out" | "unknown"NoTerminal real-world outcome; missing or invalid values normalize to unknown.
verifiedbooleanNoMay be true only with outcome=succeeded; this pair authorizes success narration.
toolDeferredtoolDeferred - Detach an eligible call from its voice turn while preserving managed job identity.
FieldTypeRequiredDescription
type"tool_deferred"Yes
idstringYes
handlestringYes
status_labelstringNo
toolProgresstoolProgress
FieldTypeRequiredDescription
type"tool_progress"Yes
idstringYes
notestringYes
toolPartialResulttoolPartialResult - Deliver a structured segment of an in-flight tool's eventual result without resolving the call.
FieldTypeRequiredDescription
type"tool_partial_result"Yes
idstringYes
contentanyYesStructured partial result content. Capped at 2 KiB by default; at most 8 partials are accepted per call. Does not resolve the call.
replybooleanNoAsk Dialt to narrate this milestone immediately. The partial always lands in context, but the proactive reply is skipped if another reply is already in flight. Ignored when `interaction` is given.
interactionobjectNoMarks this partial as needing a user decision rather than a routine milestone. Unlike reply:true alone, never silently dropped when busy -- falls back to the same completion-job queue tool completions use, preempting them, with a far more persistent delivery retry. See tool_job_narration for its lifecycle ack.
toolInteractionUpdatetoolInteractionUpdate - Host-side close of an open interaction (docs/client-tool-protocol.md §3a): the decision was resolved out-of-band, cancelled, or superseded by newer intent -- without completing the parent call. Stops the ask's queued or actively-speaking narration and tells the model the decision is closed. Always answered by toolInteractionUpdateAck; late/duplicate/unknown updates are rejected deterministically.
FieldTypeRequiredDescription
type"tool_interaction_update"Yes
idstringYesThe parent call id (or deferred handle) the interaction was raised on.
interaction_idstringYesThe interaction's stable identity: the host-chosen interaction.id from the raising tool_partial_result, or the broker-derived id echoed in tool_job_narration's interaction_ids.
state"resolved" | "cancelled" | "superseded"Yesresolved: the decision was made out-of-band (e.g. in the host's own UI) and the tool is continuing. cancelled: the decision is no longer needed. superseded: replaced by newer intent (typically the user's latest instruction); raise a fresh interaction (new id) if a decision is still needed.
notestringNoOptional short human-readable reason, surfaced to the model as context (e.g. "approved in the IDE").
toolCancelClienttoolCancelClient
FieldTypeRequiredDescription
type"tool_cancel"Yes
idstringYes
playbackStoppedplaybackStopped
FieldTypeRequiredDescription
type"client_event"Yes
event"playback_stopped"Yes
remaining_msnumberNo
discarded_msnumberNo
barge_seqintegerNoOptional interruption sequence; the server uses the current sequence when omitted.
readyready
FieldTypeRequiredDescription
type"ready"Yes
modality"voice" | "text"No
voicestringYes
namestringYes
voicesarray<Voice>Yes
audioobjectNoThe negotiated downlink format for binary assistantAudio frames, echoing start.audio's output_encoding/output_sr (or their defaults, pcm16 at 16000, when omitted). Assert on this instead of assuming an encoding.
resume_tokenstringYesPass this back as start.resume_token on a reconnect to resume this session's conversation context if the connection drops. Short-lived (a couple of minutes) and single-process — does not survive a server restart.
silentMicsilentMic
FieldTypeRequiredDescription
type"silent_mic"Yes
reason"digital_silence" | "near_silent"Yes
duration_msnumberYes
peakintegerYesHighest absolute PCM16 sample observed in the detection window.
turnturn
FieldTypeRequiredDescription
type"turn"Yes
turn_idstringYesStable id for this assistant reply, shared by every frame that belongs to it (turn, text_delta, asr, utterance, interrupted, canceled, done).
asrasr
FieldTypeRequiredDescription
type"asr"Yes
textstringYes
turn_idstringYesId of the turn this transcript belongs to.
message_idstringNoClient-generated correlation id for an injected text turn. Omitted for voice input.
input_source"voice" | "text"NoWhether the final transcript came from microphone speech or injected text.
injectContextAckinjectContextAck - Authoritative accepted/rejected acknowledgement for a correlated inject_context request.
FieldTypeRequiredDescription
type"inject_context_ack"Yes
message_idstringYesThe client-generated id from inject_context.
acceptedbooleanYesAuthoritative broker decision. False means the injection was not delivered.
role"user" | "context"No
input_source"text" | "context"No
turn_idstringNoStable server turn id for an accepted typed user turn.
reply_startedbooleanNoFor context with reply=true, whether the requested reply also claimed the floor.
retryablebooleanNoFor a rejection, whether retrying later is safe.
detailstringNoHuman-readable rejection reason.
utteranceutterance
FieldTypeRequiredDescription
type"utterance"Yes
textstringYes
turn_idstringYesId of the turn this assistant utterance belongs to.
barge_seqintegerNo
correctedbooleanNoTrue when this frame revises the earlier interrupted utterance with the same turn_id.
donedone
FieldTypeRequiredDescription
type"done"Yes
turn_idstringYesId of the turn that just completed.
sessionEndRequestedsessionEndRequested
FieldTypeRequiredDescription
type"session_end_requested"Yes
farewellstringNoThe farewell the agent passed to end_call, already spoken as the turn's only utterance. Absent when the end was not requested through the tool.
interruptedinterrupted
FieldTypeRequiredDescription
type"interrupted"Yes
turn_idstringYesId of the barged turn.
clearbooleanNo
barge_seqintegerNo
canceledcanceled
FieldTypeRequiredDescription
type"canceled"Yes
turn_idstringYesId of the eager speculative turn that was retracted.
textDeltatextDelta - Streamed assistant text, sent as the model produces it (ahead of audio and the final utterance frame).
FieldTypeRequiredDescription
type"text_delta"Yes
turn_idstringYesId of the turn this text belongs to.
deltastringYesAn incremental slice of assistant text, as the model produces it. Concatenate deltas for a given turn_id to reconstruct the streamed text; the final text still arrives as utterance.
permissionPendingpermissionPending - A tool call declared requires_permission is held pending explicit user approval.
FieldTypeRequiredDescription
type"permission_pending"Yes
idstringYesApproval id — pass this back as confirm_tool_permission's approval_id.
toolstringYesName of the tool call awaiting explicit user approval.
argumentsobjectYesArguments the model wants to call the tool with, for display to the user.
permissionApprovedpermissionApproved - A pending permission was approved and the held tool call ran.
FieldTypeRequiredDescription
type"permission_approved"Yes
idstringYesThe approval id that was resolved.
toolstringYes
permissionRefusedpermissionRefused - A pending permission was declined; the held tool call did not run.
FieldTypeRequiredDescription
type"permission_refused"Yes
idstringYesThe approval id that was resolved.
toolstringYes
toolCalltoolCall
FieldTypeRequiredDescription
type"tool_call"Yes
idstringYes
namestringYes
argsobjectYes
toolDeferredAcktoolDeferredAck
FieldTypeRequiredDescription
type"tool_deferred_ack"Yes
acceptedbooleanYes
idstringYes
handlestringNo
job_idstringNo
status_labelstringNo
deferred_timeoutnumberNo
reasonstringNo
toolDeferredResumetoolDeferredResume
FieldTypeRequiredDescription
type"tool_deferred_resume"Yes
idstringYes
handlestringYes
namestringYes
job_idstringYes
status_labelstringYes
toolCancelServertoolCancelServer
FieldTypeRequiredDescription
type"tool_cancel"Yes
idstringYes
toolJobDeliveryFailedtoolJobDeliveryFailed - A queued background-job completion voiceover could not be delivered. The turn still closes with done; job_ids lists jobs whose spoken delivery is terminally failed (their results remain in conversation context and can be asked about), requeued lists jobs re-queued for one more proactive spoken attempt (a newer user turn may supersede it, as with any queued completion).
FieldTypeRequiredDescription
type"tool_job_delivery_failed"Yes
job_idsarray<string>YesJobs whose spoken delivery is terminally failed.
requeuedarray<string>YesJobs re-queued for one more proactive spoken attempt. A newer user turn may supersede the retry, as with any queued completion.
detailstringNoHuman-readable failure detail. May keep changing freely — do not match against it.
toolJobNarrationtoolJobNarration - Narration-lifecycle ack for a queued tool_partial_result `interaction` (docs/client-tool-protocol.md §3a). Scoped to interaction-kind jobs only -- a plain completion has no such wire-visible lifecycle.
FieldTypeRequiredDescription
type"tool_job_narration"Yes
state"queued" | "started" | "superseded" | "cancelled" | "failed" | "resolved"Yesqueued: enqueued, floor busy -- always bounded: a deadline watchdog re-attempts delivery every INTERACTION_QUEUE_DEADLINE_S (10s default, up to INTERACTION_QUEUE_DEADLINE_ROUNDS rounds per delivery cycle), and an ask whose own blocked turn holds the floor yields that turn and is voiced immediately. started: now being spoken. superseded: a real user turn or barge preempted it before anything was heard (a fresh interaction can be raised again if still needed), a newer interaction on the same call replaced it, or the host closed it as superseded via tool_interaction_update. cancelled: cancel_pending_job, the host's tool_cancel/timeout of the call behind it, or a host tool_interaction_update state=cancelled dismissed it first. failed: a terminal give-up -- retried past the delivery bound, or the queue deadline expired with the floor unclaimable; telemetry-only (nothing was spoken -- fall back to your own UI for the decision). resolved: the decision no longer awaits the voice channel -- the interaction's own call sent its terminal result, or the host closed it as resolved via tool_interaction_update. A requeued ask (claimed but unheard) emits a fresh queued, so every delivery cycle ends in an observable state change.
job_idsarray<string>YesThe interaction job(s) this state applies to. Multiple pending interactions are coalesced into one turn, so more than one id may share a `started` event.
interaction_idsarray<string>YesStable interaction identities this state applies to (host-chosen `interaction.id`, or the broker-derived "<call_id>#i<n>"), aligned with the affected subset of job_ids. How a host learns a broker-derived id: it appears on the first queued/started ack for the ask.
kindstringYesAlways "interaction" today -- present so a future kind could share this ack without a new message type.
workingworking - Dialt is blocking on a tool result with nothing audible (the silence after the spoken bridge, until the final reply's first audio), or that wait has ended.
FieldTypeRequiredDescription
type"working"Yes
activebooleanYestrue: a tool-calling turn has started waiting on its result (client tools, web_search, think_deeply) and nothing is playing - a long wait is now possible. false: that turn ended, for any reason (final reply spoken, barge, cancel, nothing to say). The final reply's own `turn` frame and first audio normally arrive before the false; a client covering the gap (the browser SDK's `ambience: 'thinking'` fades its bed in after a short threshold and out again on the reply's first audio) should end its cover on whichever comes first. Pure state signal: no audio is sent for it.
toolInteractionUpdateAcktoolInteractionUpdateAck - Deterministic answer to every toolInteractionUpdate. applied=false carries a stable reason: invalid_interaction_id, invalid_state, unknown_interaction (never seen, or from before a reconnect -- interaction state does not survive a resume), or already_closed (first close wins: cancel dismissed it, its call resolved, a newer ask replaced it, or a duplicate of this very frame -- a user turn superseding the ask's narration deliberately does NOT close the decision).
FieldTypeRequiredDescription
type"tool_interaction_update_ack"Yes
idstring | nullYesThe canonical server call id the update resolved to, or null if the call reference was unknown.
interaction_idstring | nullYes
statestring | nullYesEcho of the requested state.
appliedbooleanYes
reason"invalid_interaction_id" | "invalid_state" | "unknown_interaction" | "already_closed" | NoneYesnull when applied; otherwise the stable rejection reason.
voiceChangedvoiceChanged
FieldTypeRequiredDescription
type"voice"Yes
voicestringYes
namestringYes
errorerror
FieldTypeRequiredDescription
type"error"Yes
detailstringYesHuman-readable detail. May keep changing freely — do not match against it; use code instead.
codestringYesStable machine-readable error code (e.g. unauthorized, server_busy, invalid_tools). Safe to match on for retry/handling logic.
retryablebooleanYesWhether retrying the same request is expected to succeed. Defaults per-code (e.g. server_busy/server_restarting are retryable; unauthorized/invalid_start_frame are not) and is always present.
webrtcIcewebrtcIce - Experimental. Sent over the signaling WebSocket right after a start frame carrying transport.kind webrtc. Build the RTCPeerConnection with these ice_servers, then send webrtcOffer.
FieldTypeRequiredDescription
type"webrtc_ice"Yes
ice_serversarray<IceServer>YesSTUN plus (when configured) short-lived TURN credentials. Do not build the RTCPeerConnection until this arrives — gathering ICE earlier would miss TURN.
webrtcOfferwebrtcOffer - Experimental. Client's SDP offer, sent over the signaling WebSocket once the RTCPeerConnection is built with webrtcIce's servers.
FieldTypeRequiredDescription
type"webrtc_offer"Yes
sdpstringYesThe client peer connection's local SDP offer, created after webrtcIce's servers are configured.
webrtcAnswerwebrtcAnswer - Experimental. Server's SDP answer to webrtcOffer. The call then lives on the peer connection; the signaling socket may drop afterwards without affecting it.
FieldTypeRequiredDescription
type"webrtc_answer"Yes
sdpstringYesThe server peer connection's local SDP answer.
ice_serversarray<IceServer>No
webrtcByebye - Sent on the webrtc "control" data channel just before the server closes the peer connection — the webrtc transport's counterpart of a WebSocket close frame/code.
FieldTypeRequiredDescription
type"bye"Yes
codeintegerYesClose code from the same vocabulary as a WebSocket close code.
reasonstringNo
microphoneAudiomicrophoneAudio

PCM16 little-endian mono microphone audio at audio.sr, sent in binary WebSocket frames.

assistantAudioassistantAudio

Float32 little-endian mono assistant audio at 16 kHz, received in binary WebSocket frames.

ambienceambience
FieldTypeRequiredDescription
type"ambience"Yes
activebooleanYes
interruptinterrupt - Host-initiated stop (moderation, a "stop talking" button, programmatic interruption). Unlike reset, this only drops the in-flight reply — conversation context and endpointer state are left intact. No payload beyond type.
FieldTypeRequiredDescription
type"interrupt" | "cancel"YesEither spelling stops the in-flight reply the same way.
setToolssetTools - Mid-session tool swap: agents that change capability by call phase no longer need a reconnect, which would destroy the conversation.
FieldTypeRequiredDescription
type"set_tools"Yes
toolsarray<ToolDefinition>YesReplacement tool manifest, same shape as start's mode.tools.
setToolChoicesetToolChoice - Replace the effective tool_choice mid-session; applies from the next reply. one_shot: true reverts to the previous choice after the next user turn consumes the new one ("the next turn must use one of these"). An invalid value is rejected with an `error` frame (code invalid_tool_choice) and changes nothing. A mid-session setTools resets tool_choice to "auto" — re-apply it after swapping tools.
FieldTypeRequiredDescription
type"set_tool_choice"Yes
tool_choicetool_choiceYes
one_shotbooleanNo
triggerReplytriggerReply - Client-triggered reply. Silently ignored if a reply is already in flight — do not stack these.
FieldTypeRequiredDescription
type"trigger_reply"Yes
promptstringNoOptional nudge text for the reply. Omit to make Dialt speak first with no real user turn.
injectContextinjectContext - Text/context injection with authoritative delivery acknowledgement. Supply message_id to correlate inject_context_ack and typed-turn asr events.
FieldTypeRequiredDescription
type"inject_context"Yes
message_idstringNoClient-generated correlation id echoed by inject_context_ack and, for role=user, the canonical final asr event. New SDKs always send this field.
textstringYesThe text to inject. Required, 1–2000 characters.
role"user" | "context"Yes"user": treated exactly like a real spoken user turn arriving as text instead of voice — visible in the transcript, answered the same way a turn.end is. "context": silent background information (a CRM lookup, a RAG snippet) appended to the model's context; never shown to the client as something the user said.
replybooleanNoWhether this injection should immediately trigger a reply. With message_id, rejection is an inject_context_ack with accepted=false; legacy uncorrelated calls receive an inject_rejected error frame.
sessionClosingSoonsessionClosingSoon - Warns the client shortly before the server closes the connection due to the session time limit (or scoped credential expiry) — gives the client a chance to wrap up, or to reconnect with start.resume_token once closed.
FieldTypeRequiredDescription
type"session_closing_soon"Yes
seconds_remainingnumberYesApproximate seconds until the server closes this connection: the session hit its maximum duration, a scoped API credential is expiring, or (text sessions, reason="idle") the connection has been idle for configured text idle timeout with nothing in flight. Sent once, shortly before the close; any client frame cancels an idle close.
reason"idle"NoPresent only for a text session's idle close. Absent for the session time limit and credential expiry.
lowCreditWarninglowCreditWarning - API-key (paid) sessions only. Warns the client once when the account's remaining balance is running low, so the call doesn't just cut off mid-conversation when credit runs out.
FieldTypeRequiredDescription
type"low_credit_warning"Yes
seconds_remainingnumberYesApproximate remaining talk time at the current balance. Sent once, the first time it drops under the warning threshold — read-only, never adjusts the balance itself.
playbackReportplaybackReport
FieldTypeRequiredDescription
type"client_event"Yes
event"playback_report"Yes
underrunsintegerYesTimes this reply's audio queue drained at the speaker before the next chunk arrived.
starved_msnumberNoTotal audible starvation across those underruns.
max_gap_msnumberNo
turn_idstringNo