List every workflow run for one commit (across workflows)
GET/api/repos/{owner}/{repo}/commits/{sha}/workflow-runs
listCommitWorkflowRuns
All runs whose triggering event pointed at this exact commit (push tip / PR head), newest-first, each with a compact per-job status summary — the commit-status page's actions view. Manual and scheduled runs carry no trigger commit and never appear here.
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/repos/OWNER/REPO/commits/SHA/workflow-runs' \
-H 'Authorization: Bearer $NEOSOURCE_TOKEN'fetch
fetch("https://neosource.dev/api/repos/OWNER/REPO/commits/SHA/workflow-runs", {
method: "GET",
headers: {
Authorization: "Bearer $NEOSOURCE_TOKEN",
},
});Path parameters
ownerrequiredRepository owner or organization slug.
reporequiredRepository name.
sharequiredThe 40-hex SHA-1 commit object ID.
ownerrequiredreporequiredsharequired
Responses
200Runs for the commit
application/json
Standard errors
Bodies documented once for the whole API — see standard errors.
- 400Bad Request — one of: invalid_input
- 403Forbidden — one of: forbidden
- 404Not Found — one of: not_found
- 423Locked — one of: busy
- 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.
CommitJobSummary
Compact per-job status shown in the per-commit view — enough to render a job-status badge row without fetching each run's full job list.
idrequiredjob_keyrequiredstatusrequired
WorkflowRunResponse
actor_handleHandle of the account whose action triggered the run (the pusher, the PR author, the manual dispatcher). `null` for actor-less causes (schedule) and on write receipts that skip the lookup (enqueue).
attemptrequiredRe-run attempt (GHA's `github.run_attempt`), starting at 1. A re-run creates a new run that keeps `run_number` and increments this.
branchThe bookmark (branch) a `push` or ref-aware manual run targeted; `null` for other events and legacy manual rows.
commit_summaryFirst line of the trigger commit's message, when that commit is in the metadata projection. Populated on list/detail reads; `null` on write receipts and causes without a pinned commit.
enqueued_atrequiredeventrequiredfinished_atidrequiredprevious_attempt_idThe run this one is a re-run of (UUID hex), or `null` for a first attempt. Lets the UI link to the previous attempt.
pull_request_numberThe pull request number for `pull_request` runs.
repo_idrequiredrun_numberrequiredPer-workflow monotonic ordinal (GHA's `github.run_number`). Run 1 of a workflow is 1, the next is 2, etc. Surfaced to steps and used by the runner to populate `${{ github.run_number }}`. Re-run attempts of one logical run share this number.
started_atstatusrequiredtest_summary- one of
toolchain_manifest- one of
trigger_commitExact commit (40-char git hex) the run executes: push tip, PR head, or the CAS-consistent branch target of a ref-aware manual dispatch. `null` only for legacy manual rows and causes without a commit target (such as schedules). `neo push --runner` polls on this to find a push's runs.
workflow_idrequired
ToolArtifact
Where a resolved toolchain's bytes come from.
A bare nixpkgs attribute at a pinned revision. One row serves every system; the ref may differ per version row, which is how one platform serves Node 20 and Node 26 at once (ADR 0075 dynamic routing is what makes that affordable).
attrrequiredkindrequired"nix"nixpkgs_refrequired
An upstream archive, fetched once platform-side, verified against an upstream-published checksum and stored content-addressed. The digest is the identity; the URL is provenance.
kindrequired"dist"layoutrequiredsha256requiredurlrequired
A flake ref or a bare attribute with no catalog row — ADR 0057's escape hatch. Recorded as a raw installable rather than a tool version, because that is honestly all we know about it.
installablerequiredkindrequired"passthrough"
A bare nixpkgs store path (ADR 0101 §1). Materializing it is SUBSTITUTION, not evaluation: no tree fetch, no eval, no `[refs]` entry, no fleet rollout. 289,521 pairs cost the resolver what 2 cost. A validated payload rather than three loose fields: both of its invariants are enforced by [`StorePathArtifact`], on construction and on deserialize alike. The wire form is unchanged — serde flattens an internally-tagged newtype variant — so this is still `{"kind":"store_path","store_path":…,"outputs":[…],…}`.
all ofkindrequired"store_path"