Skip to main content
Streams push updates as they happen over server-sent events (SSE), so a client does not have to poll. Every stream needs the VIEWER role.

Common behaviour

Request a stream with Accept: text/event-stream and keep the connection open. The response is a sequence of events separated by blank lines.
The data of the example above is shortened. The sections below show the full shape of each stream.
  • Event ids. Each event has an id that counts from 0 within the stream, in the order the server delivers events.
  • Resuming. After a dropped connection, reconnect with the last id you saw in the Last-Event-ID header. The server replays the stream and skips everything up to that id, so nothing arrives twice. This works for the status, log and result streams; the event feed does not support it.
  • Keep-alive. An idle stream sends a comment line, : ping, every 15 seconds so proxies do not close the connection. Ignore comment lines.
  • Ending. The status, log and result streams end when the run reaches a final state. The event feed has no end.
  • Errors. A stream that cannot start answers with an ordinary JSON error before any event, for example 404 for an unknown run or one that belongs to another session.

Stream the status of a run

GET /api/executions/{executionId}/status/stream Sends a progress snapshot every time the run or one of its nodes changes. Each event’s data is the same object that GET /api/executions/{executionId} returns, so a client can use one parser for both. The stream completes when the run ends. The deprecated path GET /api/workflow/{sessionId}/status/{executionId}/stream does the same and also checks the session.

Stream the logs of a run

GET /api/sessions/{sessionId}/executions/{executionId}/logs Sends the stored log lines of the run first, then live lines until the run reaches a final state. For a run that has already finished, it sends the stored lines and ends. The server subscribes to live lines before it reads the stored ones, so a line written while the history loads is neither lost nor sent twice. Each event’s data is one formatted line.
How long stored lines are kept depends on the log store; see Observability.

Stream structured log entries

GET /api/sessions/{sessionId}/executions/{executionId}/logs/entries The same lines as JSON objects, for clients that filter by node or level. It behaves exactly like the text stream.

Stream the results of a run

GET /api/sessions/{sessionId}/executions/{executionId}/results Sends what reaches the terminal nodes: kept events first, then new ones until the run ends. The same path returns JSON when you ask for application/json; see Read the result of a run. Each event’s data is a result event with kind (RESULT, NODE_END or EXECUTION_END), nodeId, sequence, payload (for RESULT), status (for the end events), truncated and timestamp. The stream ends after EXECUTION_END. A finished run whose results are no longer kept sends nothing and ends.

Stream events of all runs

GET /api/events/stream A live feed of what happens across the server, for monitors and external supervisors. It does not replay past events, and a reader that cannot keep up misses events. It has no Last-Event-ID support and does not end on its own. Each event’s data is an envelope with the event type, its severity and the event itself. Severity. A node or run that ends FAILURE, TIMED_OUT or ABORTED is ERROR. One that ends CANCELLED is WARN. A node that ends UPSTREAM_FAILED stays INFO, because it only reflects the node before it. A control command that was not applied is WARN. A log line is ERROR if it contains words such as error, failed, failure, exception or What went wrong, WARN if it contains warn, warning or deprecat, and INFO otherwise.