Grok Voice 3.0 is xAI's speech-to-speech model for voice agents, released on 14 October 2026. You stream speech in and the same model answers with speech, which is what phone agents, in-app voice assistants and any product where a person talks and waits for a reply need.
Below: what changed from Grok Voice 2.0, how to connect in three steps, what it costs on apimodels.app, which voices and languages it has, and how it differs from OpenAI gpt-realtime and the Gemini Live API.
xAI's announcement cites Artificial Analysis on 13 October 2026: Grok Voice 3.0 is first on the Speech-to-Speech Index with a score of 86.9. Third-party coverage compares it with Grok Voice 2.0 as in the table. The one figure that moved the other way is time to first audio, which is slightly longer.
| Metric | Grok Voice 2.0 | Grok Voice 3.0 |
|---|---|---|
| Artificial Analysis Speech-to-Speech Index | 81.3 | 86.9 |
| tau-Voice (customer-support tasks) | 56.5% | 71.6% |
| Full-duplex turn-taking | 95.1% | 97.0% |
| Time to first audio | 0.70 s | 0.81 s |
1. Get an API key. Sign up at apimodels.app, create a key on the API Keys page of the console and add balance. Connecting needs at least one minute of balance ($0.104).
2. Open the WebSocket. From your server, connect to wss://api.apimodels.app/v1/realtime?model=grok-voice-3.0 with the header Authorization: Bearer YOUR_API_KEY. For a web page, have your server call POST https://api.apimodels.app/v1/realtime/client_secrets and let the browser connect with the subprotocol xai-client-secret.<value>, so the key never reaches the browser. The endpoint is only on api.apimodels.app, not under apimodels.app/api/v1.
3. Configure the session and talk. Send session.update with a voice (default eve), your instructions and turn_detection {"type":"server_vad"}, stream microphone audio with input_audio_buffer.append, and play the response.output_audio.delta chunks that come back. Audio is 16-bit PCM at 24 kHz by default. No microphone at hand? Send one text message plus response.create, as in the Python example below, and save the reply to a WAV file.
Billed by connected session time, per second. Each minute is charged when it starts and the unused seconds are refunded when the session ends; if your balance runs out mid-session you get an insufficient_balance error and the session closes; a connection that fails to reach the model is not charged.
What you get by calling it here: one key and one balance for this and 150+ other image, video, LLM and speech models; no separate xAI account or foreign card to set up; per-second billing; and every session listed as one record in your call history with its duration and cost.
| Item | Price |
|---|---|
| Session time | $0.104 per minute, billed per second |
| Example: a 90-second call | $0.156 |
| Text message (input_text) | $0.0052 each |
| Function calling | No extra fee |
| Balance needed to connect | $0.104 (one minute) |
There are 28 built-in voices, and each one speaks every supported language. Female: ara, aurora, carina, celeste, eve (the default), iris, liora, luna, ursa. Male: altair, atlas, castor, cosmo, helios, helix, kepler, leo, lumen, lux, naksh, orion, perseus, rex, rigel, sal, sirius, zagan, zenith. Pick one with voice in session.update; audio.output.speed adjusts the speaking rate from 0.7 to 1.5.
The model covers 20+ languages with native accents and detects the language automatically, and Chinese (Simplified) is on xAI's language list. There is no special Chinese voice to choose: any of the 28 answers in Chinese when the caller speaks Chinese. If you already know the caller's language, set audio.input.transcription.language_hint to zh-CN.
All three are speech-to-speech models for voice agents with function calling and short-lived tokens for browser clients. They differ in how they bill, how long a session can run, how many voices they ship and how you connect. OpenAI and Google facts below come from their own docs, checked on 16 October 2026; for their current per-token prices see the vendors' pricing pages.
If you have already built on OpenAI Realtime, the event model is largely compatible: the main changes are the URL, authentication, voice names, cumulative input transcription (conversation.item.input_audio_transcription.updated) and a few OpenAI events that are not emitted.
| Grok Voice 3.0 (apimodels.app) | OpenAI gpt-realtime-2.1 | Google Gemini 3.8 Live | |
|---|---|---|---|
| Billing | Per minute of session, per second | Per token, audio input and output billed separately | Per token, audio input and output billed separately |
| Connection | WebSocket | WebRTC or WebSocket | WebSocket |
| Browser auth | Token from POST /v1/realtime/client_secrets | Ephemeral key from POST /v1/realtime/client_secrets | Ephemeral tokens |
| Session length | Up to 60 minutes | Up to 60 minutes | Audio-only 15 minutes without context compression; a connection lasts about 10 minutes, with session resumption |
| Built-in voices | 28, each speaks every language | 10 | 30 (shared with Gemini TTS) |
| Default audio | 16-bit PCM, 24 kHz in and out | 16-bit PCM, 24 kHz | 16-bit PCM, 16 kHz in, 24 kHz out |
| Tools | Function calling; server-side tools not available yet | Function calling | Function calling and Google Search |
| Account | apimodels.app key, also covers 150+ other models | OpenAI account | Google AI Studio or Google Cloud account |
WebSocket endpoint
wss://api.apimodels.app/v1/realtime?model=grok-voice-3.0
# server: Authorization: Bearer YOUR_API_KEY
# browser: new WebSocket(url, ["xai-client-secret." + value])cURL
# Mint a short-lived token on your server for a browser client (10 to 600 seconds, default 60)
curl -X POST https://api.apimodels.app/v1/realtime/client_secrets \
-H "Authorization: Bearer $APIMODELS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"expires_after": {"seconds": 60}}'
# { "value": "<token>", "expires_at": 1792130400 }Python
# pip install websockets (14+). Sends one text message and saves the spoken reply as reply.wav
import asyncio, base64, json, os, wave
import websockets
URL = "wss://api.apimodels.app/v1/realtime?model=grok-voice-3.0"
async def main():
pcm, asked = bytearray(), False
headers = {"Authorization": "Bearer " + os.environ["APIMODELS_API_KEY"]}
async with websockets.connect(URL, additional_headers=headers) as ws:
await ws.send(json.dumps({"type": "session.update",
"session": {"voice": "eve", "turn_detection": None}}))
async for raw in ws:
event = json.loads(raw)
if event["type"] == "session.updated" and not asked:
asked = True
await ws.send(json.dumps({"type": "conversation.item.create", "item": {
"type": "message", "role": "user",
"content": [{"type": "input_text", "text": "用一句话介绍你自己。"}]}}))
await ws.send(json.dumps({"type": "response.create"}))
elif event["type"] == "response.output_audio.delta":
pcm += base64.b64decode(event["delta"])
elif event["type"] == "error":
raise RuntimeError(event)
elif event["type"] == "response.done":
break
with wave.open("reply.wav", "wb") as wav: # 16-bit PCM, 24 kHz, mono
wav.setnchannels(1); wav.setsampwidth(2); wav.setframerate(24000)
wav.writeframes(bytes(pcm))
asyncio.run(main())On apimodels.app it is $0.104 per minute of connected session time, billed per second, so a 90-second call costs $0.156. Each text message sent with conversation.item.create costs $0.0052, and function calling is free. Unused seconds are refunded when the session ends and a failed connection is not charged.
Create an API key on apimodels.app, open a WebSocket to wss://api.apimodels.app/v1/realtime?model=grok-voice-3.0 with Authorization: Bearer YOUR_API_KEY, send session.update to pick a voice and turn detection, then stream audio with input_audio_buffer.append and play the response.output_audio.delta chunks. The docs page has complete Python, Node and browser examples.
Yes. It covers 20+ languages with automatic language detection, and Chinese (Simplified) is on xAI's language list. Every one of the 28 voices speaks Chinese, and you can set audio.input.transcription.language_hint to zh-CN when you know the caller speaks Chinese.
28 built-in voices: nine female (ara, aurora, carina, celeste, eve, iris, liora, luna, ursa) and nineteen male (altair, atlas, castor, cosmo, helios, helix, kepler, leo, lumen, lux, naksh, orion, perseus, rex, rigel, sal, sirius, zagan, zenith). The default is eve, and each voice speaks every supported language.
On the Artificial Analysis Speech-to-Speech Index cited by xAI, Grok Voice 3.0 ranked first as of 13 October 2026. In practice: Grok Voice 3.0 on apimodels.app bills one rate per minute of session while OpenAI gpt-realtime bills audio input and output tokens separately; Grok Voice ships 28 voices that each speak every language against OpenAI's 10; both cap a session at 60 minutes; OpenAI also offers WebRTC. The event models are largely compatible, so porting an OpenAI Realtime client takes small changes.
Yes, without exposing your key. Your server calls POST https://api.apimodels.app/v1/realtime/client_secrets (token valid 10 to 600 seconds, default 60) and the page connects with new WebSocket(url, ["xai-client-secret." + value]). You can also try the model with your microphone on its model page, billed at the same $0.104 per minute.
Up to 60 minutes per session, up to 5 concurrent sessions per account, and a session with no client events for 10 minutes is closed. Only function tools are available for now; web_search, x_search, file_search and mcp return an error.