Skip to content
Select themeSelect language

`GET /api/inbox/board` — one server-paginated page of the union Posteingang plus the per-source facets and the caller-scoped actionable count (#976). The global `/api` approval layer already gates the account state.

GET
/api/inbox/board
curl --request GET \
--url https://example.com/api/inbox/board
source
string

Source filter chip: workflow | tool | skill | governor | memory | proposal | suggestion | notification. Absent = the full union.

limit
integer format: int64

Page size, clamped to [0, 100]; 0 reads counts/facets only (the badge poll). Default 25.

offset
integer format: int64

Page offset into the merged union (clamped to the 200-row union depth).

One page of the union inbox.

Media typeapplication/json

One page of the union inbox: merged newest-first rows, the depth-capped union total for the current filter (see MAX_UNION_DEPTH), and the workspace-wide facets.

object
facets
required

The per-source totals plus the two derived numbers the shell consumes.

object
actionable
required

What waits on a decision THIS caller can take: workflow/tool gates and pending proposals for every member; skill/memory/suggestion queues only for workspace admins (their decide endpoints are admin-gated); governor only for the owner. THE badge number — notifications never count here.

integer format: int64
sources
required

TRUE total rows per visible source (uncapped — the chips). A source the caller cannot see (role/entitlement) is absent — no chip, no phantom count; a transiently-errored source stays listed at 0.

object
key
additional properties
integer format: int64
unread_notifications
required

Unread notifications (display-only; read state is not actionability).

integer format: int64
items
required
Array
One of:

Workflow human gate waiting on the caller (one entry per RUN — parallel gates of the same run collapse to the oldest, matching the decide-by-run-id API).

object
item
required

Workflow human gate waiting on the caller (one entry per RUN — parallel gates of the same run collapse to the oldest, matching the decide-by-run-id API).

object
deadline_at
string | null format: date-time
instructions
required
string
title
required
string
waiting_since
required
string format: date-time
workflow_name
required
string
workflow_run_id
required
string format: uuid
source
required
string
Allowed values: workflow
total
required
integer format: int64
Example
{
"items": [
{
"source": "workflow"
}
]
}

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 license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests 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 license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests 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 (also raised when ?source= names a source this caller cannot see)

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 license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests 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 license_required license_expired bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited too_many_requests 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"
}