Overview
One handshake, one WebSocket. Audio goes in as raw PCM, JSON comes back. This page is the whole protocol.
Every session is three steps. The handshake picks a node, checks your balance and mints a short-lived token; the WebSocket carries the audio and the results; closing the socket ends the stream.
The API is a pure realtime pipe. Unless you pass store: true nothing is persisted — when the connection closes, the audio and the transcript are gone from our side.
QuickstartEverything a working stream needs: one HTTP request for a node and a token, one WebSocket, raw PCM going up and JSON coming back.AuthenticationThe handshake is authenticated with an API key created in your dashboard; the key is shown once at creation. The WebSocket itself is authenticated with the short-lived token the handshake returns, never with the key.ConnectPOST the stream configuration and receive a node URL, a session id and a token.WebSocketOpen a WebSocket to the returned url. The token travels as a subprotocol, because browsers cannot set headers on a WebSocket handshake.MessagesAfter session.ready, stream raw PCM as binary frames. Control messages are JSON text frames: finalize, stop, ping.TranscriptionLanguage hints, automatic detection and how segments settle.TranslationOne language pair per stream; direction is resolved per segment.SpeakersTurn diarization on at handshake and every settled segment comes back with a speaker label next to its timestamps.GlossaryBias recognition toward your terms and pin how names are translated.AI translation refinementA second model pass rewrites the translation with surrounding context.Live minutesMinutes are produced section by section while the session is still running.TimestampsstartMs and endMs on transcript.final and translation.final are millisecond offsets into this stream's audio, measured from the first byte you sent. With store: true they are positions in the recording you can download.RecordingsWhen a stream ran with store: true, the audio and transcript are available for 30 days behind signed URLs.DisconnectsA closed socket means the stream ended. There is no resumption: call connect again and a new stream begins. Your client already holds the text it received; the server never kept it.ErrorsHTTP errors return a JSON body with a code field. Retry only what is marked retryable.PricingOne rate for the whole API. Each stream is rounded up to whole audio minutes.