GET /runs
Paginated list of runs, newest first. Scoped to the caller's API key when keys are provisioned (anonymous in open mode).
Request
GET /runs?limit=50&offset=0
X-Verdifax-Key: vfx_...
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
limit | int | 50 | Max 500 |
offset | int | 0 | Pagination cursor |
Response
{
"ok": true,
"total": 1248,
"limit": 50,
"offset": 0,
"runs": [
{
"id": 63,
"created_at": "2026-04-30T03:35:04.123Z",
"program_id": "aaaa...",
"route_id": "route-test",
"manifest_hash": "6c1428f81519c5bb...",
"duration_ms": 3,
"duration_micros": 3140,
"outcome_kind": "ok",
"error_stage": ""
}
]
}
Fields:
id, Run identifiercreated_at, RFC3339 timestampprogram_id, The program that was attestedroute_id, The route identifiermanifest_hash, For OK runs only; nil for non-OK outcomesduration_ms, Wall-clock duration in millisecondsduration_micros, Sub-millisecond precision (microseconds)outcome_kind, One ofok,pepg_deny,ccv_halt,macc_halt,stage_errorerror_stage, For pipeline crashes only; one of the nine stage codes
The outcome_kind field tells you which sealed-artifact endpoint to call:
ok→/runs/{id}/allow-tokenpepg_deny→/runs/{id}/deny-receiptccv_halt→/runs/{id}/ccv-halt-receiptmacc_halt→/runs/{id}/macc-halt-receiptstage_error→ No artifact; run record only
The summary view omits the full ExecutionManifest for performance. Use GET /runs/{id} for the full record.
Example
curl -s "http://localhost:9090/runs?limit=10" \
-H "X-Verdifax-Key: vfx_..." | python3 -m json.tool
Search
For filtering by manifest hash prefix, program_id, route_id, status, or date range, use GET /runs/search, same shape, additional query params.
