List a workflow run's CI annotations
GET/api/runs/{run_id}/annotations
listRunAnnotations
SARIF/coverage findings (file+line, severity) attached to a workflow run by the P1.1 ingest path (plans/ci-merge-gating-polish-2026-07.md). Informational — annotations never affect mergeability on their own. Returns at most `TOTAL_ANNOTATIONS_MAX` findings; `truncated` is true only when more existed at ingest (detected by a cap+1 extra-row probe, so a run with exactly the cap is not flagged).
Authentication is not described for this operation in the spec — that does not mean it is public. Check tokens and scopes.
curl
curl -X GET 'https://neosource.dev/api/runs/RUN_ID/annotations'fetch
fetch("https://neosource.dev/api/runs/RUN_ID/annotations", {
method: "GET",
});Path parameters
run_idrequired
Responses
200Annotations
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.
AnnotationLevel
Severity of one CI annotation (SARIF/coverage finding). Wire vocabulary mirrors GitHub Actions' annotation levels. Informational — annotations never affect mergeability by themselves.
"failure""warning""notice"
AnnotationSource
What produced a [`CiAnnotation`]. Both sources ride the existing artifact-upload convention (no new workflow-YAML key) — the ingest path tells them apart by artifact name (`is_sarif_artifact`/`is_coverage_artifact`, P1.1/P2.1).
"sarif""coverage"