Recent analysis jobs (the runs list). `?limit=` (default 50), optionally narrowed.
const url = 'https://example.com/api/v1/analysis/jobs';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://example.com/api/v1/analysis/jobs \ --header 'Authorization: Bearer <token>'Skeleton mode has no runner, so this answers an empty list rather than a 503: the runs list is
a panel on a page that otherwise works, and an error there would break the page. The filter is
validated before that early return, so a malformed one is a 400 on every deployment rather
than an empty 200 on some — a client bug that reads as “no runs” is worse than an error.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Only runs of this analysis (e.g. anomaly).
Only runs in this state: queued | running | done | failed | cancelled.
Note done, not succeeded — that is the report-run vocabulary, not this one.
Only runs started at or after this instant (RFC 3339).
Responses
Section titled “Responses”Matching runs, newest first; empty when this deployment has no runner
A job row, as served to the API / SSE. Timestamps are epoch-millis so the WebUI formats relative times without a date dependency.
object
Where an analysis run is in its lifecycle.
A bare String until v0.2.6, and the cost of that was paid twice. The vocabulary had to be
written out by hand at the API edge to validate the runs filter, and again in the WebUI to fill
its dropdown — two lists nothing compared. Worse, state: string compares equal to any
string: the in-app “your analysis finished” notice tested state === 'succeeded', which is the
report-run vocabulary, so every successful analysis announced itself as a failure. Typing it
makes that comparison a compile error on both sides.
Example
[ { "state": "queued" }]The tool or state is outside its vocabulary, or since is not RFC 3339
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}No valid bearer token
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Role lacks the read permission
The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI
document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies
undescribed — a client that has to guess the failure shape ends up parsing the success shape and
reading undefined.
object
object
Stable machine-readable code. Clients branch on this, never on the message.
Operator-facing sentence. Safe to display; never carries an internal error’s own text.
Examplegenerated
{ "error": { "code": "example", "message": "example" }}