Speech, transcription and the Realtime API follow the OpenAI wire format, including the error envelope. An existing integration usually moves with two lines.

Endpoints

OpenAI’s model names still resolve to Nur, so a ported app runs before you touch it. Switch to nur-v1 before you ship, so a future model change is your decision.

Three differences to handle

Voices are ids. OpenAI has a fixed set of named voices. Here every voice, built-in or cloned, has an id like ev_d116d96b; list them with GET /v1/voices. OpenAI names such as alloy still work and map to the default voice, so they do not pick different voices. An unknown name is a 400, never audio in the wrong voice. Audio formats. nur-v1 returns mp3 (the default), wav or pcm. Other formats are a 400 that lists the ones you can use. Realtime events. The server sends the current OpenAI event names, such as response.output_audio.delta. It also sends a few eesi.* events (a session id for reconnecting, a synthetic-audio notice, a recording disclosure). An OpenAI client can ignore them safely.

What EESI adds

Extra fields on the same requests, ignored by clients that don’t send them: Every audio response carries an X-Synthetic-Audio header declaring it machine-generated. Some features have no OpenAI equivalent, so you call them directly with the same key: voice cloning, Live translation and Audio intelligence.