The config frame
Your first message after connecting must be a single JSON text frame withtype: "config". It declares your audio format, an optional language hint, how speech should be chunked, and whether to separate speakers. Send it immediately on open — the server waits about 10 seconds for it.
Fields
type
Must be the literal string
"config".audio
Audio wire format. One of
"pcm_s16le" (raw 16-bit little-endian PCM — preferred) or "wav".Sample rate in Hz. Accepted range 8000–48000.
16000 is recommended.Channel count.
1 (mono, recommended) or 2.language
Optional ISO 639-1 language hint (for example
"de", "en", "fr"). Case-insensitive. The service auto-detects language regardless, and the detected code is returned on each transcript as language_detected. An unrecognized code is tolerated as a soft hint (a warning is surfaced in session_ready). See supported languages.chunk
Controls how the incoming stream is cut into finalized segments. Pick a strategy to trade latency against accuracy and density; you rarely need the explicit overrides.One of:
"low_latency"— shortest segments, fastest captions."balanced"— the default; a good compromise of latency and accuracy."high_throughput"— longest segments, highest accuracy and text density (most context per segment).
Optional explicit target segment length, in seconds. Overrides the strategy’s target. Server-clamped to [0.5, 25].
Optional hard cap on segment length, in seconds. Overrides the strategy’s cap. Server-clamped to [target, 25].
Silence is trimmed and segments are cut on natural pauses automatically. You do not need to align your binary frames to any boundary — send audio in whatever size is convenient and the server re-frames it internally.
diarization
Turn speaker separation on or off. When on, transcript frames include a
speakers array of per-speaker turns. Off by default.A hint for how many distinct speakers to expect (range 1–20). For a clinician/patient conversation,
2 is typical.timeline_offset_seconds
A constant (seconds,
>= 0) added to every emitted segment, word, and speaker timestamp for this session. Leave it at 0 for a normal session. On a reconnect mid-recording, set it to the last processed_until you received so all transcripts stay on one continuous absolute timeline with no client-side re-anchoring. See Reconnection.Strategy behavior
low_latency
Emits short segments for the fastest possible captions. Best for live on-screen dictation where responsiveness matters most.
balanced
The default. Segments are long enough for strong accuracy while still feeling live. A good starting point for most integrations.
high_throughput
Emits longer segments with the most context, maximizing accuracy and text density. Best when a small extra delay is acceptable.
Defaults & clamping
If you omit a field, its default is applied. Numeric segment lengths are then clamped to server-safe bounds, and any adjustment is reported back insession_ready.warnings.
| Field | Default | Notes |
|---|---|---|
audio.encoding | pcm_s16le | wav also accepted |
audio.sample_rate | 16000 | clamped to 8000–48000 |
audio.channels | 1 | 1 or 2 |
language | (none) | auto-detect; hint only |
chunk.strategy | balanced | |
chunk.target_seconds | (from strategy) | clamped to [0.5, 25] |
chunk.max_seconds | (from strategy) | clamped to [target, 25] |
diarization.enabled | false | |
diarization.max_speakers | 2 | 1–20 |
timeline_offset_seconds | 0 | >= 0 |
session_ready
Once your config is validated, the server replies withsession_ready, echoing the effective (validated and clamped) configuration and any warnings. This is your signal to start streaming audio.
Unique identifier for this session.
The configuration the server actually applied, after defaults and clamping.
Server-side limits and metadata:
max_segment_seconds (the hard maximum segment length) and protocol_version (currently "2.0").Human-readable notes about adjustments the server made — for example a clamped segment length, or an unrecognized language hint. Empty when nothing was changed.
The
effective object may include additional server-selected fields beyond those listed here. Treat any field you do not recognize as opaque and ignore it — your integration should key only on the documented fields.Example: a clamped config
If you requestchunk.target_seconds: 40, the server clamps it and tells you:
Supported languages
Language is auto-detected; thelanguage field is only a hint. The following European languages are recognized (ISO 639-1). Mid-conversation language switches are handled automatically.
| Language | Code | Language | Code | Language | Code |
|---|---|---|---|---|---|
| Bulgarian | bg | Greek | el | Portuguese | pt |
| Croatian | hr | Hungarian | hu | Romanian | ro |
| Czech | cs | Italian | it | Russian | ru |
| Danish | da | Latvian | lv | Slovak | sk |
| Dutch | nl | Lithuanian | lt | Slovenian | sl |
| English | en | Maltese | mt | Spanish | es |
| Estonian | et | Polish | pl | Swedish | sv |
| Finnish | fi | German | de | Ukrainian | uk |
| French | fr |
Passing a code outside this set is not an error — it is accepted as a soft hint (with a warning in
session_ready), and detection still runs.Next steps
Messages
Stream audio and read transcript, ack, backpressure, and status frames.
Reconnection
Use
timeline_offset_seconds to resume on one continuous timeline.