Live voice
Full-duplex voice sessions with OpenAI GPT-Live over a WebSocket
openai/gpt-live-1 is a full-duplex voice model: it listens and speaks at the
same time. Gateway relays the native OpenAI Live protocol over a WebSocket at
/v1/live/sessions, using your Gateway API key and the route’s OpenAI
credential (Merge-managed or your own key). Events pass through unchanged, so
the OpenAI Live event reference
applies as written.
Connect
The model goes in session.start, not in the URL. Wait for session.started
before sending audio or context. The connection is server-side only: Gateway
authenticates the WebSocket handshake with your API key, so do not open it from
a browser.
To end a session, send {"type": "session.close"} and keep reading until
session.closed, which carries the final usage.seconds.
Delegation
Both delegation modes are relayed:
- Client delegation (
"delegation": {"type": "client"}, or omitted): your application receivessession.delegation.createdand answers withsession.commentary.appendorsession.thinking.append - Responses delegation (
"delegation": {"type": "responses", "responses": {"model": "..."}}): OpenAI runs the backend model and streams its events asresponse.event. The backend model must be one your organization and key may use, both atsession.startand on anysession.updatethat changes it.
Pricing
Voice sessions bill per second at the route’s per-second rate
(unit: per_second on GET /v1/models). OpenAI’s list price is 0.075. The billed duration is OpenAI’s reported usage.seconds from
session.closed, and it includes silence, a muted microphone, and time spent
waiting on delegated work.
If your client disconnects without session.close, Gateway closes the session
upstream and bills the final reported duration. With Responses delegation, the
backend model’s tokens bill separately at that model’s own token rates, one
usage record per backend response.
Limits
When Gateway ends a session at a limit, it asks OpenAI to finalize first, so you
still receive session.closed and the final usage, then closes the WebSocket
with code 4408.
A refused handshake (invalid key, exhausted budget, rate limit) returns the
HTTP status before the WebSocket opens. A refusal after the connection opens
(unknown or blocked model, a model that is not a Live model) arrives as a Live
error event, followed by a close code of 4000 plus the equivalent HTTP
status, for example 4403 for a blocked model.
Organizations with zero data retention must leave session.store false.
WebRTC, SIP telephony, sideband connections, session forking, and recording download are not available through Gateway.