wss://x.kupe.in/v1/realtime.
The session always runs Kupe STT, TTS, and LLM. Voices are addressed by sanitized name (priya, not a vendor id). Tools attached to the agent run server-side. This path is web-only — it does not write telephony minutes.
Mint
POST /v1/realtime/sessions
string
required
Agent to hydrate (prompt, greeting, tools, default voice).
string
Catalog voice name. Overrides the agent’s voice for this session.
object
Values for
{{placeholders}} in the prompt and greeting.string
Optional when using an API key (
GET /v1/me already has it).string
Optional when using an API key.
client_secret.value (single-use ticket) and websocket_url.
Connect
Authorization: Bearer {secret} on the WebSocket handshake instead of the query string. ticket is an alias for client_secret.
The SDK helper does this for you:
session.created with instructions, voice, tools, and pcm16 in/out formats.
Client → server
Text-turn example (what
send_text encodes):
input_audio_buffer.append frames; server VAD emits speech start/stop and runs the turn.
Server → client
Every event hasevent_id and type. Audio deltas are base64 PCM16.
The socket may also send dashboard-shaped
{ "kind": "transcript" | "latency" | "tool_call", ... } frames on the same connection.
Close codes
LiveKit web sessions
For the in-app web tester (room + JWT, not this WS), usePOST /v1/sessions with channel: "web". That returns a LiveKit ws_url and participant token. Realtime mint + /v1/realtime is the API you want from Python, TypeScript, or cURL.
