SEC 10 / SELF-CHECK
Check your understanding
If you can answer these without looking, you have the working mental model. Each answer links back to the page that covers it.
You have the complete text of a paragraph and want audio playing as fast as possible. HTTP streaming or TTS WebSocket?
Going deeper: answer
HTTP chunked streaming. The WebSocket exists for text that arrives incrementally; when full text is known, ElevenLabs itself recommends ordinary streaming — WebSocket buffering and generation-trigger logic can add complexity and sometimes latency. See transports.
Where does the permanent API key live in a browser voice app?
Going deeper: answer
Nowhere in the browser. It stays on your backend, which issues a short-lived signed URL or conversation token after authenticating the user. See auth.
@elevenlabs/elevenlabs-js vs @elevenlabs/client — which goes where?
Going deeper: answer
elevenlabs-js is the server-side REST client; client is the browser package owning mic, WebRTC, and conversation lifecycle. They are not interchangeable. See package map.
Your app reads out account balances and you picked Flash v2.5 for latency. What breaks?
Going deeper: answer
Number normalization is off by default on Flash — “£1,250.40” may be misread. Pre-normalize numbers, dates, and phone numbers into words yourself. See models & latency.
You already run your own LLM orchestration and just want ElevenLabs to handle the voice side of a conversation. Which integration?
Going deeper: answer
Speech Engine — ElevenLabs connects to a WebSocket endpoint on YOUR server, your server streams LLM output back, ElevenLabs handles speech, interruptions, and delivery. See transports.
A 429 comes back. What do you check before retrying?
Going deeper: answer
The structured error code — a 429 can mean a request-rate limit (delay per rate policy) or a concurrency limit (reduce simultaneous generations). The treatments differ. See production.
Why wrap the SDK in an internal adapter instead of calling it directly across the codebase?
Going deeper: answer
The clients are largely generated from the API spec and regenerate often — types and method internals move. An adapter contains upgrade churn in one module and centralizes timeouts, retries, formats, and observability. See production.
A retried TTS call that timed out mid-flight — what’s the risk?
Going deeper: answer
Duplicate billable generation: the server may have already started or finished generating. Use your own operation IDs, record request state, and distinguish pre-send connection failures from post-send timeouts. See production.