Join Run Stream
Join a run stream. This endpoint streams output in real-time from a run similar to the /threads/THREAD_ID/runs/stream endpoint. The stream can be resumed from the last seen event ID, or from a checkpoint of the run with checkpoint_id. In the in-memory runtime (langgraph dev), only a run created with stream_resumable=true can be resumed. A gap event is sent, first on a resume or mid-stream, when events the client should receive may be missing. Its reason is expired when they may have aged out of the stream’s history; unknown_id when the Last-Event-ID is later than any event the thread streamed, and the stream starts over from the run’s first event; or too_large when an event was over the size limit, with that event’s stream mode in mode. expired errs on the safe side: once the stream’s history has expired, a resume gets it unless its ID is the thread’s last streamed event, which is kept for an hour after that.
Headers
Path Parameters
Query Parameters
Resume after this checkpoint of the run, such as the one the thread's state was just loaded at: events up to the checkpoint are skipped. Used when Last-Event-ID is absent, - or -1; a real Last-Event-ID takes precedence. If the run's stream has no record of the checkpoint, the stream starts from the beginning of the run, as with -1. Send it with Last-Event-ID: -1, so a server that ignores it replays the whole run instead of streaming only new events. The in-memory runtime (langgraph dev) ignores it and replays the whole run, which needs stream_resumable=true when creating the run.
Stream modes to control which of the run's events are returned. Only modes the run was created with have events. Events about the whole run, such as metadata (which starts each attempt of the run), error and feedback, always pass, except on the langgraph dev server, which passes only error. If not provided, all of the run's events are returned.
values, messages, messages-tuple, tasks, checkpoints, updates, events, debug, custom, tools, lifecycle A conversation to stream: a |-joined namespace, empty for the main agent (the root graph) or a subagent's, such as tools:<task_id>. The stream keeps that conversation's events without those of the subagents it starts (subgraphs that the tools node runs), but with the lifecycle events of every subagent below it. Repeat it to stream several conversations. Events about the whole run, such as metadata and error, always pass. Events of the events and messages modes (not messages-tuple) carry no namespace, so they stream with the main agent's conversation. Subagent events exist only on runs created with stream_subgraphs, except lifecycle events, which come either way. If not provided, all of the run's events are returned.
32Response
Success
The server will send a stream of events in SSE format. The last event is end, with data {"run_id": ..., "status": ...} giving the run's final status: success (also when the run stops at an interrupt), error, timeout, interrupted (the run was cancelled) or, for a stateless run, rollback. A run that was deleted, or rolled back on a thread, has no status left, so its stream ends with its error event instead. If a stream closes with neither, get the run to see how it ended.
Example event:
id: 1
event: message
data: {}

