Skip to content
Obsevo
Skip to docs navigation

Docs

Query grammar & pagination

The same filter syntax the runs explorer uses, so a filter you built in the UI lifts straight into a script.

The API and the runs explorer parse the same query string. That is the point: a filter you built by clicking around can be copied out of the browser's address bar and used verbatim in a script.

Time range

GET /api/v1/runs?range=24h
GET /api/v1/runs?range=custom&from=2026-07-01T00:00:00Z&to=2026-07-08T00:00:00Z

range accepts 15m, 1h, 4h, 24h (default), 7d, 30d or custom. With custom, supply from and to as ISO timestamps.

Facets

Include with f.<dim>, exclude with x.<dim>. Both repeat. Values within one dimension are OR-ed; separate dimensions are AND-ed.

GET /api/v1/runs?f.status=error&f.status=crashed&x.workflowId=wf_noisy

Available dimensions:

status · mode · instanceId · workflowId · hasAi · model · provider · errorClass · env · tags

Free text

q accepts free text plus Datadog-style key:value tokens.

GET /api/v1/runs?q=timeout+workflow:wf_sync+trigger:schedule

Aliases: triggermode, workflowworkflowId, instanceinstanceId, aihasAi, error / errorclasserrorClass, tag / tagstags.

Sorting

GET /api/v1/runs?sort=durationMs:desc

Sortable keys: finishedAt (default, descending), workflowName, instanceName, status, mode, durationMs, totalItemsOut, nodeCount.

Pagination

Keyset, not offset. Responses carry nextCursor, which is null once exhausted:

{
  "runs": [],
  "nextCursor": "eyJ2IjoiMjAyNi0wNy0yOFQyMzo1OTowMFoiLCJpZCI6IjlmMmMifQ",
  "range": { "from": "2026-07-28T02:47:00Z", "to": "2026-07-29T02:47:00Z" }
}

Pass it back as cursor to get the next page.

limit defaults to 100 and is capped at 500, except on /api/v1/runs/export, where it defaults to 1000 and is capped at 5000.

CSV export

/api/v1/runs/export takes the same filters and returns CSV with a content-disposition attachment header. Columns: executionId, workflowName, status, mode, durationMs, totalItemsOut, nodeCount, finishedAt.

Values beginning =, +, - or @ are prefixed with an apostrophe, so a workflow named =cmd|… cannot become a formula when the file is opened in a spreadsheet.

Documentation