> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://developers.deepgram.com/changelog/2026/9/18/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.deepgram.com/_mcp/server. ## Correction: Browser Agent SDK has no client-side VAD The Browser Agent SDK never shipped client-side Silero voice activity detection. Documentation published with the SDK described it as an available feature, and that documentation was wrong. The following did not exist in any released package: - The `vad` option on `MicrophoneOptions` in `@deepgram/agents`. - The `speechThreshold` and `silenceThreshold` VAD options. - The `speech-start` and `speech-end` events on `AgentMicrophone`. - The `vad` field in `WidgetConfig` and the widget's VAD configuration section. - The `@ricky0123/vad-web` and `onnxruntime-web` peer dependencies. Uninstall them if you added them for VAD. `MicrophoneOptions` accepts `sampleRate`, `echoCancellation`, `noiseSuppression`, and `autoGainControl`. The microphone streams continuously while it is unmuted. Barge-in works, and it is driven server-side. The Voice Agent API emits `user-started-speaking`, which you pair with `player.interrupt()` to stop playback: ```javascript session.on("user-started-speaking", () => player.interrupt()); ``` `@deepgram/react` subscribes to that event and interrupts playback for you, so applications built on the provider and hooks need no change. The Browser Agent pages now reflect the shipped API. See [JavaScript SDK](/docs/browser-agent-javascript), [Widget Embedding Guide](/docs/browser-agent-widget), and [React Hooks & Provider](/docs/browser-agent-react). ## Correction: token minting uses `ttl_seconds` The server-side token-minting example on the [Browser Agent SDK overview](/docs/browser-agent-overview) posted `{"ttl": 30}` to `POST /v1/auth/grant`. The field is named `ttl_seconds`: ```javascript body: JSON.stringify({ ttl_seconds: 30 }), ``` `/v1/auth/grant` accepts unrecognized fields, returns `200`, and issues a token with the 30-second default, so a request built from the old example raised no error while ignoring the requested lifetime. If you copied that example and increased the number, your tokens expired after 30 seconds. A 30-second token is enough for a full call. The token only has to be valid at the WebSocket handshake, and the connection stays open afterward. Minting a token requires an API key with **Member** permissions or higher. See [Token-Based Authentication](/guides/fundamentals/token-based-authentication).