SynapseWire

Grok Voice 3.0's Socket Uses an Alias. The Card Says 3.0.

The realtime URL in the speech-to-speech doc asks for grok-voice-latest. The model card's name is grok-voice-3.0, and the two sample-rate examples do not match.

Published on:
A closed laptop, a coiled headset cable, and a blank index card on a wooden desk under a warm lamp.
FIG. 01 // A closed laptop, a coiled headset cable, and a blank index card on a wooden desk under a warm lamp.

The model card and the socket example are not using the same string. The Grok Voice 3.0 card names the model grok-voice-3.0 and describes a speech-to-speech model for realtime voice agents. The speech-to-speech page builds the WebSocket as wss://api.x.ai/v1/realtime?model=grok-voice-latest. If you copy the card into the query string, you are not copying the example. If you copy the example, you are not copying the card.

We already had a local-model flag that was not an offline mode. Copilot’s /model can find Ollama. It does not go offline. We already had a knowledge API that wants a search before a dump. Search the chunks first. We already had a price that was a sticker, not a bill. Haiku 5.5 lists at $0.10. Grok Voice 3.0 is the same shape of mistake: three official views, two sample rates, and a price that lives on a different page from the card.

The query parameter is an alias, if the secondary page is right

grok-voice-latest is the string in the official socket example. grok-voice-3.0 is the string on the model card, in both the markdown view and the HTML card. kie.ai’s October 16 writeup says the alias grok-voice-latest now points at grok-voice-3.0, and that the model has been generally available since October 14, 2026. The card pages I retrieved do not print that date, and they do not print the sentence “latest points at 3.0.” The alias claim is kie.ai’s. The two strings are the docs’.

A setup that hardcodes grok-voice-3.0 because the card said so is defensible. A setup that hardcodes grok-voice-latest because the socket example said so is also defensible. A setup that treats them as proven synonyms is borrowing kie.ai. Aliases move. latest is a name that is allowed to change without the card you bookmarked changing on the same day. If you need a frozen id for a test fixture, the card’s grok-voice-3.0 is the frozen-looking one. If you need the id the socket doc actually demonstrates, it is grok-voice-latest. Write down which page you copied. The next person to debug a 400 will need that sentence.

kie.ai also calls the company SpaceXSI, formerly xAI. The socket host in the official example is still api.x.ai. A client pointed at a new host because a blog renamed the lab will fail for a reason that has nothing to do with sample rate.

Authentication in the speech-to-speech doc is an ephemeral token or an API key, passed as a WebSocket subprotocol of the form xai-client-secret plus the token. That is a header-shaped secret, not a query parameter. Do not put the token in the model query string next to grok-voice-latest because both happen at connect time. The doc’s own order is: start opening the socket early, and start the microphone before the socket’s open event. Those are two clocks. The token belongs to the socket clock.

24000 and 16000 are both in the doc, on different examples

The speech-to-speech page does not have one sample rate. The microphone example constructs an AudioContext at 24000 Hz. The session-update example, further down, sets input and output format to audio/pcm at a rate of 16000, and it says that rate applies only to audio/pcm. It also names audio/pcmu and audio/pcma as other format types. A reader who implements the first block and then pastes the second block has two rates in one program unless they notice they overwrote the assumption.

The page printed both, in examples that do different jobs. The AudioContext rate is the capture clock in that snippet. The session rate is what the session config claims to send and receive, and only for PCM. If your capture clock and your session rate differ, you own the resample, or you own the garbled audio. The doc does not, in the section I used, say “resample 24000 to 16000” or “ignore the AudioContext rate.” It shows both numbers. A tutorial that collapses them into “Grok Voice uses 16 kHz” has deleted the 24000 example. A tutorial that says “use 24 kHz end to end” has deleted the session example and the note that the rate field is PCM-only.

The practical order on that page is the part worth copying as a sequence, not as a rate. Request the microphone and start buffering samples before the WebSocket open event. Do not wait for open to begin collecting. The reason is latency, and the doc says the socket connect can take time. Buffering early audio is the documented workaround. It is also a privacy switch: you are capturing before you know the socket succeeded. If connect fails, that buffer is still audio you took. Drop it. The doc is about not losing the start of the utterance. It is not a reason to keep a failed session’s samples.

format and transport are different fields. The page says format selects the codec and transport selects how the bytes move on the socket. If your client needs the transport enum, that heading is the place to read it, not a blog recap of the heading.

There is a session field named instructions. The example fills it with a generic assistant line. That line is a placeholder in a snippet. It is not a evaluated prompt, and it is not a reason to ship “You are a helpful assistant” into a support bot. Replace it with the task you actually have, or leave the field out until you know the product wants it. I am not reprinting the snippet. The field name is the fact.

The markdown card says text to text. The HTML card says text and audio

Same model id, two at-a-glance lines. The markdown view’s modalities line is text → text. The HTML card prints Text, Audio on the way in and Text, Audio on the way out. The H1 on both is a speech-to-speech model. The socket page is a microphone and a PCM session. A developer who scaffolds a client from the markdown at-a-glance will build a text model and then wonder why the socket example is about getUserMedia.

I do not know whether the markdown exporter dropped the audio modality or the HTML card added it. Both pages were retrieved on the same day, and they disagree. Until one of them changes, the socket page is the one that tells you this call is audio. The markdown at-a-glance is the one that will mislead a quickstart generator. If you are writing a wrapper, do not trust a one-line modality field that conflicts with the H1 on the same card. Read the socket page before you lock the type signature.

Regions have a smaller version of the same split. The markdown view lists us-east-1, eu-west-1, and us-saltlake-2 on one line. The HTML details block, in the portion retrieved, printed us-east-1 and then moved on to rate limits. That does not prove the HTML page denies the other two regions. It does prove you should not quote “only us-east-1” from the details card, and you should not quote a three-region inventory as if the HTML card had repeated it. Rate-limit numbers were empty under the rate-limit heading in both views I retrieved. An empty heading is not a limit of zero. It is a missing number. Do not invent requests-per-second so a config file looks finished.

The price is not on the card you just opened

The Pricing heading on the model card had no figure under it, in the markdown view or the HTML view I retrieved. eesel AI on October 15 says the pricing page lists speech-to-speech grok-voice-3.0 at $0.08 per minute, which is $4.80 per hour, plus $0.004 per text input, the same sticker as the deprecated grok-voice-2.0. kie.ai prints the same $0.08 and the same $0.004, and also says the price did not rise from 2.0. I did not retrieve a pricing table that showed those cells myself. Two secondary pages agree with each other. They are not the model card.

That distinction matters if you are about to hardcode a cost. A card with an empty Pricing heading is not a promise that the call is free. It is a page that did not carry the number. Go to the pricing page eesel is describing, and read the row, before you put $0.08 in a comment. If the row has moved since October 15, eesel and kie.ai will not save you. They were written this week. They are already secondary.

eesel also lines up other stickers, which are easy to misuse as a ranking. GPT-Live-1 is listed at $0.05 per minute, with the backend model charged separately. Gemini 3.8 Live is listed at $0.005 per minute of audio in and $0.018 per minute of audio out. A $0.05 sticker that excludes the model is not cheaper than a $0.08 sticker that includes one, until you add the excluded line. eesel quotes Artificial Analysis on the all-in hour of input audio: Grok Voice 3.0 at $4.80, the same as Voice 2.0, above GPT-Live-1 (Sol, low) at $4.47 and Gemini 3.8 Live Extended Thinking (High) at $3.50, below GPT-Live-1 (Astra, medium) at $5.83, and about 2.2 times cheaper than GPT-Realtime-2.1 High at $10.75. Those are Artificial Analysis figures relayed by eesel, not cells on the model card. “Cheaper” depends on which GPT-Live-1 tier you put next to it. Sol-low and Astra-medium are not the same product. A sentence that says Grok Voice 3.0 is cheaper than GPT-Live-1 has picked one tier and hidden the other.

kie.ai adds a quality split that the price table does not contain. On the Artificial Analysis speech-to-speech index, it puts Grok Voice 3.0 at 86.9, ahead of GPT-Live-1 (Astra, medium) at 83.2 and Gemini 3.8 Live at 82.6. On τ-Voice, the support-call task, it puts GPT-Live-1 at 74.5 percent and Grok Voice 3.0 at 71.6 percent. It also says the lab claims 40 percent lower latency than GPT-Live-1 on that test. An index lead and a task deficit can both be printed. They are not one ranking. Latency is a third ranking. If you are choosing a model for a phone queue, the τ-Voice pair is the closer comparison, and it is still kie.ai’s table, not a number you can read off the socket page.

Language count has the same problem at a smaller scale. kie.ai says developer coverage of the docs cites more than 20 languages, and a voice landing page cites 25 or more. I am not opening a third page to crown one of those. If your product needs a specific language, the list on the page you integrate against is the list. “20+” and “25+” are both floors someone else summarized. Neither is a locale code.

What to configure, and what not to copy from a recap

Set the socket URL host to api.x.ai, path /v1/realtime, and decide explicitly whether the model query is grok-voice-latest or grok-voice-3.0. Record the choice. Pass the secret as the subprotocol the doc shows, not as a query parameter. Start microphone capture before waiting for open, and discard the buffer if the socket never opens. Pick one PCM rate and make the AudioContext and the session config agree, or resample on purpose. The doc’s two examples use 24000 and 16000. Your program should use one, and the comment should say which example you followed.

Do not take the modality from the markdown at-a-glance if you are building a voice client. That line says text to text. The socket page is audio. Do not take a price from the model card. The heading was empty. Do not take a requests-per-second figure from the rate-limit heading. It was empty too. Do not take a region list from a single details cell if the markdown line lists three ids. Check the region endpoint you will actually call.

kie.ai prints deployment figures, including millions of Tesla conversations a day, about 20,000 Starlink support calls a day, and about 70 percent of those calls resolved without a person. None of that is a configuration step. None of it is on the socket page. A capacity plan that starts from a blog’s Starlink sentence is not a capacity plan. Context window and parameter count are marked unconfirmed on that same page. Leave them unconfirmed.

The failure mode this week is copying one official page and calling it the integration. The card, the markdown export, and the socket example are three pages. They already disagree on the model string, the modality line, and the sample rate. A client that notices the disagreement before it ships is doing the only setup step that is not already written down.

Tags // #Grok Voice #xAI #WebSocket #speech-to-speech #API
Share Article //
READER LETTERS

Reader Dispatches

[ 0 Responses ]

No reader responses yet. Share your technical perspective below.

FURTHER READING

Related Posts