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.