FAQ

Are there SDKs?

Yes. Official Python and TypeScript SDKs cover streaming, Transcribe, PII redaction, and keyword boosting, with typed events and transcript assembly helpers. Clone the bw_labs_sdks repository and install from it; see SDKs for the steps. The raw WebSocket and HTTP APIs remain fully supported without them.

What chunk size should I send?

Send binary frames from 20 ms through 1000 ms; 160 ms multiples are recommended. A final complete-sample tail between 20 ms and 160 ms is valid. A smaller tail violates the public frame contract and is rejected.

Which sample rates are supported?

8000 and 16000 Hz. The rate is selected in the connection query and must match the bytes sent. Send raw samples only; strip any WAV or container header before sending.

How do I send μ-law?

Set encoding=mulaw and sample_rate=8000 (or the rate explicitly approved by your integration), then send raw one-byte-per-sample G.711 μ-law payloads. Do not send a WAV header. linear16 means little-endian signed 16-bit PCM.

What does KeepAlive do?

{"type":"KeepAlive"} holds a silent session open. It is not audio, is not included in audio_duration_seconds, and does not create a transcript event. Send it on a timer during quiet periods; a 25-second cadence keeps a session safely inside the 60-second idle deadline. KeepAlive does not extend a session that has already been closed.

What is the idle/session limit?

Per-key concurrency and connect-rate limits are set on your account; contact us for higher limits. A multichannel stereo session meters both channels even though it has one WebSocket. The current idle deadline is 60 seconds without valid audio or KeepAlive. There is no client resume after an idle close; reconnecting starts a new session.

Are results interim?

No. Every public transcript message is final. Segment events are instant-mode only. In demand mode, each delivery is one Transcript event per channel, including an empty text when no audio was finalized since the previous delivery. There are no interim results, and confidence and alternatives are omitted deliberately from the public contract.

How does demand mode differ from instant mode?

instant is the default and delivers finalized Segment events as audio is decoded. Finalize flushes buffered audio, and the resulting and subsequent finalized output continues as Segment events. demand buffers finalized results server-side and sends no Segment events. Each Finalize is answered with one Transcript event per channel covering audio finalized since the previous delivery, even when its text is empty. CloseStream delivers the remainder, then sends SessionClosed.

What changes when I enable PII redaction?

Set redact_pii=true for demand-mode listen or Transcribe. Detected spans are replaced in both the returned text and the corresponding returned words entries. Redaction currently looks for payment card numbers, Social Security numbers, phone numbers, email addresses, dates of birth, account and ticket numbers, and US ZIP codes; coverage grows during the beta. With redact_pii_sub=entity_name, a span becomes a bracketed kind token such as [CREDIT_CARD] or [SSN]. With redact_pii_sub=hash, it becomes hash:v1:<16 hex chars>; the same entity value maps to the same token within an account. The redaction summary reports applied and entities_redacted. The unredacted text is not returned in text or words. Set redact_pii_return=true to include the original spans in a redacted_entities array. This option requires hash substitution, defaults to hash when redact_pii_sub is unset, and rejects redact_pii_sub=entity_name with invalid_params. Each entry includes the matching substitution token, policy kind, original text, and start and end times in seconds. The array is empty when no entity is found, and the field is absent when redact_pii_return is not enabled.

What is the Transcribe duration limit?

Transcribe accepts up to five minutes of decoded audio. Longer recordings should be split at silence, transcribed as separate requests, and concatenated in order.

What are the keyword limits?

keywords boosts recognition of supplied phrases on both listen and Transcribe. Repeat it for each phrase. Use no more than 100 non-empty phrases, with a combined length of no more than 4096 bytes.

What does the beta cost?

Nothing. The service is free during the beta. Usage is still measured as audio-seconds on the server and echoed in SessionClosed for visibility. Mono and downmixed stereo count once; channels=2&multichannel=true counts both channels. Wall-clock time, KeepAlive messages, and a client-declared duration are not counted.

Can I resume after a network failure?

No. Resume is explicitly unsupported. Reconnecting creates a new session and a new usage boundary. Buffered audio is never replayed automatically; the application must make any retry decision.

Can I use a browser API key directly?

Native browser WebSocket clients pass ?api_key=<key> in the URL because they cannot set WebSocket headers. The header form is preferred wherever headers are possible.