Skip to main content
POST /v2/retrieve/stream takes the same request body as /v2/retrieve and returns the same payload — but as it happens, one JSON line per step that actually completed. This is what lets a UI show the real progress of a retrieval instead of a bar that invents it. An answer chains several heavy calls; a step that stays silent through them is indistinguishable from a step that is stuck.
Each line is a complete JSON object, separated by \n. There is no reconnection to handle: fetch plus a stream reader is enough.

The lines

With deliberate: true, the reflexive loop also streams each of its rounds without waiting for its verdict: Without them, the step stays silent through three heavy calls and two retrievals.
A dependency failure can no longer raise an HTTP error here: the stream has already started, so it arrives as a terminal error line. The status is 200 from the first line — read the stream’s content, not the code.

Reading the stream

Buffer the tail. A network chunk does not land on a line boundary: naively splitting on \n without keeping the remainder cuts a JSON object in half and fails the parse at the mercy of the load.