Skip to main content
Realtime APICompatibility

OpenAI Realtime compatibility updates

The Realtime API now more closely matches OpenAI’s response, conversation-item, and WebRTC signaling behavior. Existing clients should review the potentially breaking changes below.

Audio-only and cancelled response lifecycle

Affected clients: Clients that infer audio response structure or completion from text content parts and item-done events.Change: Audio-only responses no longer include a synthetic text part. The audio part is at content index 0, and no response.output_text.done event is emitted. Cancelled responses no longer emit conversation.item.done or response.output_item.done with a completed item; the stored item remains incomplete.Required action: Use response.output_audio_transcript.* for transcripts, respect event content_index, and use terminal response status rather than assuming a completed item-done event after cancellation.If you have published clients that rely on the emitted text parts, contact support so that we can enable the feature for you.

Response metadata

Affected clients: Clients that read router metadata from response objects or send arbitrary response metadata values.Change: response.created and response.done now echo the string map supplied as response.metadata on response.create. They no longer expose LLM Router metadata. Metadata is limited to 16 entries, with keys up to 64 Unicode code points and values up to 512; non-string values are rejected.Required action: Send correlation metadata explicitly in response.create, keep it within the documented limits, and use providerData.metadata separately for router-facing metadata.

Assistant item content types

Affected clients: Clients that parse assistant items in conversation.item.*, response.output_item.*, or response.done.Change: Assistant item snapshots now use output_text and output_audio. Streaming response.content_part.* events continue to use text and audio.Required action: Handle content type based on context: use output_* for assistant item snapshots and retain text/audio handling for streaming content-part events.

Conversation item insertion

Affected clients: Clients that set previous_item_id on conversation.item.create.Change: previous_item_id is now honored. "root" prepends, an existing ID inserts after that item, and an unknown ID returns item_not_found without modifying history. Previously, items were appended regardless of this field.Required action: Omit previous_item_id when appending. When inserting, reference an existing item and handle errors where error.param is "previous_item_id".

Function item validation

Affected clients: Clients that create function_call or function_call_output items.Change: A client-created function_call now requires a non-empty name, and function_call_output requires a non-empty call_id. Omitted arguments and output remain valid and normalize to empty strings.Required action: Always supply the function name and tool-call ID. Accept empty arguments for argumentless calls and empty output for tool results without content.

Conversation predecessor IDs

Affected clients: Clients that consume previous_item_id from conversation lifecycle events.Change: conversation.item.added and conversation.item.done now report each item’s actual predecessor, including appended and server-generated assistant/tool items. The first item reports null; later items may now report a string where older responses returned null.Required action: Treat previous_item_id as nullable ordering metadata and do not assume it is always null.

WebRTC signaling-time session configuration

Affected clients: Clients that include session in JSON or multipart /v1/realtime/calls requests.Change: The WebRTC proxy now sends the signaling-time session object upstream as an initial session.update before returning the SDP answer. Previously, that object was parsed but ignored. The proxy requires the send to succeed but does not wait for session.updated.Required action: Review any session object sent during signaling and remove stale or placeholder settings. Fields such as providerData.auto_tool_response now take effect during call setup. Raw application/sdp clients are unaffected.