v1

latestOpenAPI 3.1.0MIT2026-08-0481194343.8 KB
runs

Read 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.

get/v1/runs/{run_id}/log

Query parameters

limitinteger

Steps per page. Outside 1..200 returns 400 INVALID_LIMIT.

after_stepinteger

Return steps with a step number strictly greater than this. Negative values return 400 INVALID_EVENT_CURSOR.

include_eventsboolean

Nest the raw events each step was folded from inside that step.

Response

A page of assembled steps, plus run-level lifecycle events.

object'list' required
has_moreboolean
next_after_stepinteger nullable

Cursor: pass as after_step to continue. null when the log is complete.

liveboolean

True when the run is still going, so the log will grow.

steps_completedinteger

Authoritative count from the run record: how many steps actually ran. Trust this over the length of data.

steps_loggedinteger

How many steps this log could reconstruct any evidence for.

log_completeboolean

False when the log is missing steps the run is known to have executed. The event log is BEST EFFORT: appends are not part of the run's transaction, so a step can execute and be billed while its log rows are lost. When this is false, steps_completed is authoritative and the absence of a step here is NOT evidence that it did not happen.

request_idstring