Most of the choosing is done by one question: is a person waiting? A live conversation and a file are different models, not the same model at different speeds. Everything else on this page is the smaller forks that follow.

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.
Cloned voices reach nur-realtime-v1 and nur-tts-v1.

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 same voice_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.
Sending the display name is the failure to expect here. "voice": "nur", for the built-in the library shows as “Nur”, is rejected by POST /v1/audio/speech with a 400 and unknown_voice. That check exists because the synthesis backend has none: it conditions the speaker on reference audio, so a name it cannot resolve is dropped and the audio comes back in a different voice with a 200 and nothing on the wire saying so. auto and the OpenAI voice names (alloy, nova and the rest) also resolve, to the model’s own default.

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 answers 404 model_not_found, so the set of ids on your laptop, your staging cluster and production can differ. Read the list.
Each entry carries the flags that decide whether a model can do what you are about to ask of it:
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.
Two flags are worth checking rather than assuming:
  • formats is narrower than the request schema. The response_format enum on POST /v1/audio/speech accepts six values; nur-tts-v1 advertises three (mp3, wav, pcm) and the request is rejected if you ask for one it does not advertise.
  • supports_cloning is 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

That is the live response for any retired id, and the same 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.