Skip to main content
Set stream: true on POST /v1/responses and the reply arrives as standard OpenAI Responses response.* SSE events — every frame is event: <type> + data: <json>, with a monotonic sequence_number. Official SDK stream loops consume it as-is.

Event table

Items stream strictly one at a time: reasoning first (when the tier emits it), then the message, then any function_call handoffs — output_index increments per item, and the indexes match the final output array on response.completed.

Server-tool side-channel

Built-in server tools (data search, literature, …) are not output items — official SDKs would mis-parse unknown item types, so their trace rides a dedicated event that standard stream loops safely ignore:
It fires when the tool is called; it does not open an output item or advance output_index. Render it if you want an activity feed (“Searching your records…”); skip it and nothing breaks. response.mirobody_tool_result is its pair, pushed when that tool’s result lands — the other half of the side-channel, equally ignorable:
Match a result to its call by id / call_id. The streamed result is truncated to 4096 characters (truncated: true when clipped); the full value is always on the final response object (response.completed) under tool_steps[].result.

Failure events

On an upstream error the stream ends with response.failed (not a broken pipe):
For the Answers API’s simpler chat.completion.chunk streaming, see Answers API → Streaming.

See also