Skip to main content
GET
cURL
Use this WebSocket endpoint to stream audio to an active session for real-time transcription. For the complete workflow, usage guidelines, wire format, message order, and error handling, refer to the Audio dictation and Dictation streaming guides.
  • For a single guide that compares /ws/stream and /ws/transcribe (handshake, proxy behavior, and message shapes), refer to Audio streaming guide.
  • Stream audio in chunks for the best latency and throughput.
  • For partial and final inbound transcript frames, EOF, and session state rules, refer to Dictation streaming.
If the dictation session is RUNNING, COMPLETED, or in another state, the WebSocket handshake fails with FailedPrecondition (for example transcript session is not accepting new speech sessions).

Inbound transcript messages

The server sends JSON text frames that include transcript, is_final, and transcript_id. Use is_final to identify whether the transcript is a partial result or a final result. After the audio stream ends, the server sends { "transcript": { "transcript": "EOF" } } and then closes the WebSocket connection. Refer to Dictation streaming for frame examples, words and speaker IDs on finals, and client-side filtering rules.

Authentication

Authentication is applied during the WebSocket handshake. The method depends on your client type. Use Sec-WebSocket-Protocol header for browser clients, and sdp_suki_token and transcription_session_id headers for non-browser clients.

Browser clients

If you are connecting from a browser, you must use the Sec-WebSocket-Protocol header during the WebSocket handshake. The header must specify the SukiAmbientAuth protocol, followed by the token and the transcription session ID in the following format.

Non-browser clients

If you are connecting from a non-browser client, such as a mobile or server-side application, you must provide the token and session ID as separate HTTP headers in the initial WebSocket upgrade request.
  • sdp_suki_token: Session token from login.
  • sdp_provider_id: Provider identifier. Optional for standard partners; Required for Single Auth Token authentication.
  • transcription_session_id: The ID for the current session.
Important:
  • All messages must be sent as JSON text frames over the WebSocket connection.
  • Do not send raw binary data or use HTTP endpoints for streaming audio.

Code examples

Authorizations

sdp_suki_token
string
header
required

Suki access token for the authenticated provider. Obtain this by calling Login or Register with a valid partner_token. Pass the suki_token value from the JSON response as the sdp_suki_token header on REST requests and non-browser WebSocket upgrades. Browser WebSocket clients pass the token in Sec-WebSocket-Protocol instead. Tokens expire after one hour; call Login again to refresh.

Headers

Sec-WebSocket-Protocol
string

Required FOR BROWSER CLIENTS ONLY. Sent during WebSocket handshake. Browsers must use the same subprotocol the grpc-wsproxy maps to Authorization: 'SukiAmbientAuth,<sdp_suki_token>,<transcription_session_id>' (comma-separated; token second, transcription session id third). Other names (e.g. SukiTranscriptionAuth) are not mapped and typically yield 401.

transcription_session_id
string
required

Required for non-browser clients only. UUID from Create Transcription Session.

sdp_provider_id
string

Optional - Stable identifier for the active provider. Omit for standard partners whose partner_token identifies the user. Required for Bearer partners and Single Auth Token authentication where multiple providers share one partner_token. Use the same provider_id you sent on Login or Register.

Example:

"provider-123"

Response

Switching Protocols - Indicates successful WebSocket handshake.

The response is of type string.

Last modified on June 30, 2026