v1
latestOpenAPI 3.1.0MIT2026-08-0481194343.8 KBRead what a run actually did, step by step
Scope: runs:read. Free. This is the supported way to read a finished run's full trajectory or its final answer. GET /v1/runs/{run_id}/events streams the same source over SSE, which suits watching a run live but makes inspecting a completed one awkward; result.summary on the run object is only the last 2000 characters.
Each step arrives assembled: the model's reasoning already unwrapped from its <cua-section> markup (analysis, next_action, grounded_action, action_result), then every action with its coordinates and outcome, plus what the step cost and the screenshot_index of the frame the agent saw before acting. No parsing required. Pass include_events=true to also get the raw events, nested inside the step they belong to.
Read log_complete before concluding anything from an absence. The event log is BEST EFFORT and is not written inside the run's transaction, so a step can execute and be billed while its log rows are lost. When log_complete is false, steps_completed is the authoritative count and a step missing here did not necessarily fail to happen.
Page with after_step. lifecycle is returned whole on every page because it is small and usually contains the reason the run stopped.
Errors: 404 RUN_NOT_FOUND for an unknown or cross-tenant run (ownership is checked first, so a run you do not own is never revealed as an empty log). 503 DB_UNAVAILABLE with Retry-After when the event store is failing.
Query parameters
Steps per page. Outside 1..200 returns 400 INVALID_LIMIT.
Return steps with a step number strictly greater than this. Negative values return 400 INVALID_EVENT_CURSOR.
Nest the raw events each step was folded from inside that step.
Response
A page of assembled steps, plus run-level lifecycle events.