Server Events

All Lanson → client events pushed over WebSocket.

Events the server pushes over the WebSocket connection.

Overview

typeSourceDescription
session.createdGatewaySent on connection establishment
session.updatedUpstreamConfirms session parameter update
input_audio_buffer.speech_startedUpstreamSpeech segment detected
input_audio_buffer.speech_stoppedUpstreamSpeech segment ended
conversation.item.input_audio_transcription.completedUpstreamA speech segment has been transcribed (primary output)
lanson.throttledGatewayThrottle notification (max once per second)
errorGateway / upstreamError event

session.created

Sent by the gateway immediately after connection.

{
  "type": "session.created",
  "request_id": "...",
  "session_id": "sess_...",
  "audio": { "format": "pcm_s16le", "sample_rate": 16000, "channels": 1 },
  "turn_detection": { "type": "server_vad" },
  "plan": "free",
  "limits": {
    "max_concurrent_utterances": 2,
    "max_session_seconds": 900,
    "idle_timeout_seconds": 60,
    "remaining_audio_seconds": 3600
  }
}
FieldTypeDescription
session_idstringSession identifier
audio.formatstringFixed: pcm_s16le
audio.sample_ratenumberFixed: 16000
audio.channelsnumberFixed: 1
turn_detection.typestringFixed: server_vad
planstringCurrent plan
limits.max_concurrent_utterancesnumberMax concurrent utterances
limits.max_session_secondsnumberMax session duration (seconds)
limits.idle_timeout_secondsnumberIdle timeout (seconds)
limits.remaining_audio_secondsnumber | nullRemaining audio budget (null when unlimited)

session.updated

Confirms that a session.update message has taken effect.

{
  "type": "session.updated",
  "request_id": "...",
  "language": "zh",
  "turn_detection": { "type": "server_vad" }
}

input_audio_buffer.speech_started

VAD detected the start of a speech segment.

{
  "type": "input_audio_buffer.speech_started",
  "request_id": "...",
  "utterance_index": 0
}

input_audio_buffer.speech_stopped

VAD detected the end of a speech segment.

{
  "type": "input_audio_buffer.speech_stopped",
  "request_id": "...",
  "utterance_index": 0,
  "reason": "end_of_speech",
  "audio_duration_ms": 3200,
  "speech_duration_ms": 2800
}
FieldTypeDescription
utterance_indexnumberSpeech segment number
reasonstringStop reason
audio_duration_msnumberTotal audio duration
speech_duration_msnumber?Actual speech duration
split_offset_msnumber?Split offset
split_rmsnumber?Split RMS value

conversation.item.input_audio_transcription.completed

Primary output event. A speech segment has been transcribed.

{
  "type": "conversation.item.input_audio_transcription.completed",
  "request_id": "...",
  "utterance_index": 0,
  "text": "The weather is nice today",
  "language": "zh",
  "audio_duration_ms": 3200,
  "latency_ms": 480,
  "segments": [],
  "verbose": {}
}
FieldTypeDescription
utterance_indexnumberSpeech segment number
textstringTranscribed text
languagestringDetected language
audio_duration_msnumberAudio duration
latency_msnumberProcessing latency
segmentsarraySegment details
verboseobjectUpstream additional info

lanson.throttled

Gateway throttle notification, sent at most once per second.

{
  "type": "lanson.throttled",
  "reason": "concurrent_utterance_limit",
  "dropped_audio_frames": 3,
  "in_flight_utterances": 2
}
reason valueMeaning
concurrent_utterance_limitConcurrent utterance limit exceeded
upstream_backpressureUpstream backpressure
upstream_connectingUpstream still connecting

error

Error event. Can be sent at any time during the WebSocket connection.

{
  "type": "error",
  "code": "audio_frame_too_large",
  "message": "Audio frame exceeds maximum size.",
  "request_id": "..."
}

Error codes are listed in Errors.

Event ordering

session.created
  → [audio frames...]
  → input_audio_buffer.speech_started
  → [more audio...]
  → input_audio_buffer.speech_stopped
  → conversation.item.input_audio_transcription.completed
  → [repeat...]
  → session close