List a run's jobs with their step records
GET/api/workflow-runs/{run_id}/jobs
listWorkflowRunJobs
Authentication optional — this operation also accepts anonymous requests. When authenticating, use a bearer token or a session cookie.
curl
curl -X GET 'https://neosource.dev/api/workflow-runs/RUN_ID/jobs' \
-H 'Authorization: Bearer $NEOSOURCE_TOKEN'fetch
fetch("https://neosource.dev/api/workflow-runs/RUN_ID/jobs", {
method: "GET",
headers: {
Authorization: "Bearer $NEOSOURCE_TOKEN",
},
});Path parameters
run_idrequired
Responses
200Jobs with embedded steps
application/json
403Forbidden — one of: forbidden, needs_scope
application/json
Standard errors
Bodies documented once for the whole API — see standard errors.
- 400Bad Request — one of: invalid_input
- 404Not Found — one of: not_found
- 429Rate limited — retry after the `Retry-After` header
- 500Internal server error
- 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
- 504Gateway timeout — the request exceeded the server's handling budget
Schemas
Referenced above. Listed here rather than expanded inline, so the same definition is not repeated at every level.
JobCacheTransferResponse
A job's cache transfer, measured by the server as it served the job's cache requests (`workflow_run_job_cache_transfer`). Every byte figure is COMPRESSED object bytes as the server sent or stored them (the actions/cache tarball, the build-cache pool object), never the unpacked size. A download counts when the server builds a hit response, at the entry's full size, even if the client aborts mid-body; a `lookup` or HEAD never counts. An upload counts only once durably stored. Every request that reaches the server counts once (a repeated pool PUT counts each time). Telemetry, not accounting: a crashed API node loses up to 30 s of counts, and nothing is ever counted twice.
native_restored_bytesBytes those restores sent. `null` exactly when `native_restores` is.
native_restoresactions/cache restore hits served to this job. `null` = not measured: the job's row predates restore tracking, so it may have restored. A job that ran during the deploy introducing this count may under-count (a restore served by a not-yet-updated node is missed).
native_save_skippedrequiredactions/cache saves refused because the key already existed (keys are immutable); they stored nothing.
native_saved_bytesrequirednative_savesrequiredactions/cache saves that stored a new entry.
pool_bytes_downrequiredBytes the pool's hits sent.
pool_bytes_uprequiredpool_getsrequiredBuild-cache pool GETs (a miss counts with 0 bytes).
pool_hitsrequiredpool_putsrequiredBuild-cache pool PUTs that stored, and their bytes.
CarriedFromResponse
Where a carried job ([`WorkflowRunJobResponse::carried_from`]) executed.
attemptrequiredThat run's `attempt`.
job_idrequiredThe job that executed (UUID hex).
run_idrequiredIts run — an earlier attempt of this run (UUID hex).
CompileCacheResponse
A job's compile-cache result, as SERVED to a reader: the raw counters plus the two figures derived from them. The derived fields are computed at read time rather than stored, so improving the model never means a migration and the inputs stay visible beside the output. Both are `null` where they have no meaning — notably `estimated_saved_ms` on a job that hit on everything and therefore never measured a compile.
compilationsrequiredcompile_msrequiredestimated_saved_msModelled ms the cache saved: `hits × (mean compile − mean cache read)`. `null` when the terms do not exist — see `JobCompileCache`.
hit_rateHits ÷ (hits + misses), or `null` when there were no requests.
hitsrequiredmissesrequiredread_hit_msrequiredrequestsrequired
RunnerBindingKind
Which trust binding a job executed under (ADR 0056 §1/§7). Serialized on the wire and in `workflow_run_jobs.executed_on` as the `snake_case` strings `hosted` / `workspace` / `actor`.
"hosted""workspace""actor"
WorkflowRunJobStatus
Lifecycle of an individual job inside a run. Distinct from the run-level status because `needs:` ordering means some jobs are `Waiting` while others are `Running`. The serde `snake_case` strings are the wire vocabulary the API emits (pinned by the `enum_wire_consistency` tests).
"waiting""ready""running""cancelling""succeeded""failed""cancelled""skipped"
WorkflowRunStepResponse
One step of a job, reported by the executing runner. Offsets index into the job's log byte stream (`GET /api/jobs/{job_id}/logs`), so the UI can slice the job log per step. `log_end_offset` is `null` while the step is in flight.
cache- one of
finished_atlog_end_offsetlog_start_offsetrequirednamerequiredstarted_atstatusrequiredstep_indexrequired