The catalog
Paid models are metered at $0.001 per minute of audio. Free means not metered
today, not a lower quality tier. See
Pricing and limits.
Live audio is a different model, not the same one faster
The most expensive mistake here is building a live experience out of the file endpoints — recording a second of microphone audio, posting it to/v1/audio/transcriptions, sending the text to a chat model, and synthesizing
the reply.
That costs three round trips per turn, and it throws away the thing that makes
conversation work: turn boundaries. Chopping a microphone into fixed slices
cuts words in half and leaves the model no way to tell whether someone has
finished speaking. nur-realtime-v1 is audio in and audio out on one socket,
and end-of-turn detection, barge-in and cancellation happen on the server.
- Audio you already have — a recording, an upload, a voicemail — is a file. Transcription is cheaper and holds no socket open.
- Audio arriving as someone speaks is a conversation. Use a live session.
Realtime: one id
nur-realtime-v1 is the realtime model, and the only one. It streams, it is
metered per minute of session time, and it leaves a
session record behind.
There used to be more than one. A full-duplex omni id sat in the registry that
no shipped environment ever served, and a separate text-interaction model ran
its own GPU pool behind POST /v1/interact/sessions. Both are gone: one
runtime answers /v1/realtime, and everything the interaction model decided —
whether to stay quiet, speak, acknowledge or call a tool — is decided there.
Transcription: one id, one model
nur-stt-v1 is MOSS-Transcribe-Diarize, for a ten-second voice note and for an
hour of meeting alike. It returns the words and who said them — diarized
segments with timings, per-segment confidence, and an audibility read on whether
a speaker was on mic, off mic or too faint to trust — and streams those segments
over SSE with stream=true.
There used to be a second id, nur-stt-v1-pro, for the diarizing long-form
tier. It resolved to this same model, so the catalog was promising a difference
it could not deliver. Requests naming it now get model_not_found: send
nur-stt-v1 instead, with the request and response shapes unchanged. Ask for
verbose_json — speakers, timings and audibility appear nowhere else. See
Audio intelligence.
Voices: pick a built-in unless you need a person
Every voice — cloned or built-in — resolves to a stored reference clip, and the samevoice_id works in synthesis and in a live session.
Prefer built-in voices. They are designed from a text vocabulary rather than
recorded from anyone, so they carry no likeness rights and no retention clock,
and they need no upload. Clone when the point is a particular person: a
founder, a presenter, a support lead customers already recognize. Cloning takes
a permission you have to actually hold — see
Voice cloning.
GET /v1/voices is where you get one. Built-in and cloned voices are listed
together and named the same way, by an id like ev_1a2b3c4d — never by the
display name beside it.
The language model is a default, not a lock
nur-llm-v1 serves POST /v1/chat/completions and is unmetered, which makes it
a reasonable default for the text side of what you are building: summarizing a
transcript, extracting fields, drafting a reply.
Nothing locks you in. The endpoint is OpenAI-shaped in both directions, so
pointing part of your system at another provider is a base URL and a key,
exactly as pointing it here was. Reach for an external model when you need a
capability this one does not have — a much longer context, a specific
tool-calling behaviour, or a model you have already evaluated on your own data.
Read the catalog, do not hardcode it
Each backend is opt-in per environment. A model with no backend configured is not listed and answers404 model_not_found, so the set of ids on your
laptop, your staging cluster and production can differ. Read the list.
GET /v1/audio/models is the speech catalog and omits nur-llm-v1.
GET /v1/models is the OpenAI-shaped list and includes every model plus every
alias, which is what makes client.models.list() and alias-probing tools work
against this API.formatsis narrower than the request schema. Theresponse_formatenum onPOST /v1/audio/speechaccepts six values;nur-tts-v1advertises three (mp3,wav,pcm) and the request is rejected if you ask for one it does not advertise.supports_cloningis what decides whether your voice is used, not whether the request succeeds. See the warning above.
Pin the version, keep the alias for exploration
Every id has an unversioned spelling —nur-tts for nur-tts-v1 — and it
resolves. It also follows whatever version is current, so an unversioned id in
production means the model under you can change without a deploy.
Send the versioned id you tested against.
OpenAI names that resolve here
That is what lets an existing OpenAI client work by changing a base URL and a
key. See OpenAI compatibility for the three
places a migrated client still needs a branch.
When a model is not there
404 covers a
misspelled id, any other model a deployment does not serve, and an id of the
wrong kind for the endpoint —
nur-tts-v1 sent to /v1/audio/transcriptions is a model_not_found, not a
validation error.
Check the id against GET /v1/audio/models for that environment before
assuming the model is down. See Errors.
Going further
Realtime interaction
Which live surface to pick, and what they share.
Pricing and limits
What each model costs and the ceilings you can hit.