---
title: "Open a realtime transcription WebSocket"
method: GET
path: "/v1/transcribe/stream"
---

# Open a realtime transcription WebSocket

`GET /v1/transcribe/stream`

Upgrade to WebSocket, then send {"type":"config","language":"en","interimResults":true} as the first text frame, within five seconds. The type field is required: without it the router answers {"type":"error","code":"INVALID_CONFIG"} and closes. interim_results is accepted as an alias. sttOptions.language, when present, overrides language. The router answers {"type":"ready","provider":"..."}, then send 16 kHz mono 16-bit signed little-endian PCM as binary frames with no WAV header, and finish with {"type":"end"}. Transcripts come back as {"type":"transcript","text":"...","isFinal":bool}; partials replace the previous partial rather than appending. Browsers offer speko.realtime.v1 and speko.ephemeral.<credential> as subprotocols.

## Response `default`

Error

- Error
  - `error` object, required
    - `code` string, required
    - `message` string, required
    - `type` string
    - `details` unknown

## Other responses

- `101` — WebSocket accepted

---

[API](https://skmtc.net/speko/apis/speko-voice-router-api.md) · [All operations](https://skmtc.net/speko/apis/speko-voice-router-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/speko/speko-voice-router-api/versions/ef3d201df72e/schema)
