Skip to content
Select themeSelect language

`GET /api/runs/board` — one server-paginated, filtered + sorted page of the runs board plus the total + the workspace-wide facet chips.

GET
/api/runs/board
curl --request GET \
--url https://example.com/api/runs/board \
--cookie supacloud_session=<supacloud_session>
q
string

Free-text search over the run’s source-issue title + identifier.

status
string

status filter chip.

kind
string

kind filter chip.

project_id
string format: uuid

Narrow to one project.

app_id
string format: uuid

Narrow to one deployed App’s runs.

since
string format: date-time

created_at >= since lower bound.

until
string format: date-time

created_at <= until upper bound.

include_children
boolean

Include workflow node child runs (default false — top-level only).

top_level
boolean

Force parent_run_id IS NULL regardless of include_children — the V13 Agents tab keeps child agent runs of a workflow out of the top-level list.

trigger
string

#358 trigger-source filter id (manual/schedule/webhook/linear/notion) — mapped to the matching trigger_kind set server-side (mirrors /api/runs).

sort
string

Whitelisted sort column: created_at | started_at | finished_at | status | kind. Default created_at.

dir
string

asc | desc (default desc).

limit
integer format: int64
offset
integer format: int64
include_facets
boolean

Recompute the facet chips (default true). The board sends false on a page/sort change since the chip counts are workspace-wide.

One page of runs.

Media typeapplication/json

GET /api/runs/board body — one page of runs + total + facet chips.

object
facets
One of:
null
items
required
Array<object>
object
app_id
string | null format: uuid
attempt
required
integer format: int32
autonomy_policy_json
One of:
null
container_id
string | null
cost_usd

Agent cost + token usage for this run’s task (task_id), folded in by the list handler for the runs-board cost column. None for a run with no task (workflow / script / app / node runs) or no recorded outcome.

number | null format: double
created_at
required
string format: date-time
deadline_at
string | null format: date-time
error_message
string | null
finished_at
string | null format: date-time
fired_handle
string | null
git_branch
string | null
id
required
string format: uuid
input

#626 (S1 contract-request, §28 StepInspector) — this run’s input payload, projected from trigger_context.input (the raw trigger_context stays unexposed — only this declared-input sub-key is surfaced, mirroring source_issue); None when the step recorded no input.

input_tokens
integer | null format: int64
iteration_index
integer | null format: int32
kind
required

The run kind (runs.kind CHECK). Runtime stays String; the spec narrows it to the closed [RunKindSpec].

string
Allowed values: agent workflow script app gate human end code notify_telegram notify_email notify_webhook notify_discord loop db_query db_execute http_request transform wait_event llm_classify imap_ack connector
output_tokens
integer | null format: int64
parent_run_id
string | null format: uuid
project_id
string | null format: uuid
queued_at

Issue #110: when this run was parked in queued. Stays set after the run promotes to starting so the runs view can surface the wait time.

string | null format: date-time
result
required

The run’s output JSON — for a human child run this is the approval prompt ({ title, instructions }) while waiting, and the recorded decision once decided. The runs view renders the human approve/reject affordance from it.

retries

#626 (S1 contract-request, §28 StepInspector) — the per-attempt retry history of this workflow-node step (every attempt sharing this run’s workflow_node_key + iteration_index in the same run tree), sorted by attempt; None for a step that never retried (single attempt) or a non-step run. Populated by the GET /api/runs/{id} detail handler, which alone has the sibling attempt rows.

Array<object> | null

#626 (S1 contract-request, §28 StepInspector) — one attempt of a retried workflow-node step, for the inspector’s retry-history tab. Derived from the per-attempt runs rows of the same workflow_node_key + iteration_index.

object
attempt
required
integer format: int32
error_message
string | null
finished_at
string | null format: date-time
started_at
string | null format: date-time
status
required

The attempt’s run status (runs.status CHECK), spec-narrowed.

string
Allowed values: pending starting running waiting completed failed cancelled skipped queued
script_id
string | null format: uuid
source_issue
One of:
null
started_at
string | null format: date-time
status
required

The run status (runs.status CHECK). Runtime stays String; the spec narrows it to the closed [RunStatusSpec].

string
Allowed values: pending starting running waiting completed failed cancelled skipped queued
task_id
string | null format: uuid
trigger_kind
string | null
workflow_id
string | null format: uuid
workflow_node_key
string | null
workspace_id
required
string format: uuid
total
required
integer format: int64
Example
{
"items": [
{
"autonomy_policy_json": {
"ask_threshold": "always",
"merge_ceiling": "none"
},
"kind": "agent",
"retries": [
{
"status": "pending"
}
],
"status": "pending"
}
]
}

Structured client error

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Authentication required

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Permission denied

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Structured server error

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}