> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.getdial.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.getdial.ai/_mcp/server.

# July 9, 2026

## Added

### Self-Hosted audio mode — bring your whole voice stack

[Self-Hosted mode](/documentation/platform/self-hosted) gains a second variant: **audio** (`"type": "audio"`). Dial pipes the raw call audio to your WebSocket server, full duplex, over the new [Self-hosted audio protocol](/api-reference/self-hosted-audio-protocol/overview) — you bring the entire voice pipeline: a speech-to-speech model (OpenAI Realtime, Gemini Live, …) or your own STT → LLM → TTS chain. The existing bring-your-own-LLM variant is unchanged and now documented as the [Self-hosted LLM protocol](/api-reference/self-hosted-protocol/overview).

The protocol is a small JSON-over-WebSocket contract: `media` frames both ways (base64 audio, \~20 ms inbound cadence), `mark`/`clear` for playback checkpoints and barge-in, `dtmf` digits, a `duration_warning` before the max-duration cap, `end_call`/`call_ended`, keepalive, and mid-call reconnection with state restore. Audio formats are configurable per direction — G.711 (μ-law/A-law) or linear PCM at 8, 16, or 24 kHz — chosen to hit the zero-transcode path of common realtime voice APIs.

## Changed

### Per-mode Self-Hosted configuration

Each variant now keeps its **own** configuration — URL, signing secret, and (for audio) formats — so you can stage one mode while the other drives calls, and switch without re-entering anything. `GET /api/v1/self-hosted` returns both configs alongside `enabled` and `activeMode`; changes are made with a single action-based `POST /api/v1/self-hosted` — `save` (persist a mode's config), `activate` (save it *and* route calls through it), or `disable`. The signing-secret reveal endpoint takes a `mode` query parameter.