Skip to content
Select themeSelect language

`GET /api/settings/credentials/board` — one server-paginated, filtered + sorted page of the unified credentials board plus the total + the facet chips.

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

Free-text search over the provider, label or connected account.

scope
string

scope filter chip (personal | workspace | organization).

kind
string

kind filter chip (api_key | oauth_token) — the ART facet.

sort
string

Whitelisted sort column: provider | kind | account | scope | created_at. 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).

One page of credentials (api keys + OAuth connections).

Media typeapplication/json

GET /api/settings/credentials/board body — one page + total + facet chips.

object
facets
One of:
null
items
required
Array<object>

One row of the unified credentials board. NOTE what is absent: no key_data, no access_token — the board never carries (nor decrypts) a secret.

object
account_email

The connected account e-mail or provider handle (OAuth rows only).

string | null
consecutive_refresh_failures
required

Consecutive proactive-refresh failures (OAuth rows only; 0 for api keys) — the keepalive warning the retired OAuth card carried, preserved on the row so the merge into one table loses no information.

integer format: int32
created_at
required
string format: date-time
expires_at

Token expiry (OAuth rows only); an api-key reference does not expire.

string | null format: date-time
id
required
string format: uuid
kind
required

The ART, from the typed CredentialKind discriminant of the source table: api_key (an api_key_refs row) or oauth_token (an agent_oauth_tokens row). NEVER derived from the label — an api-key row labelled “OpenRouter (OAuth)” is still an api_key, and a token is still an oauth_token however it is labelled.

string
label

The user-given label (api-key rows only).

string | null
locked
required
boolean
organization_id
string | null format: uuid
plan_label

The subscription plan badge, when the provider exposed one (OAuth rows only).

string | null
provider
required
string
scope
required

The resolved ADR 0038 tier: personal | workspace | organization.

string
workspace_id
string | null format: uuid
total
required
integer format: int64
Examplegenerated
{
"facets": {
"by_kind": [
{
"count": 1,
"value": "example"
}
],
"by_scope": [
{
"count": 1,
"value": "example"
}
],
"total": 1
},
"items": [
{
"account_email": "example",
"consecutive_refresh_failures": 1,
"created_at": "2026-04-15T12:00:00Z",
"expires_at": "2026-04-15T12:00:00Z",
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"kind": "example",
"label": "example",
"locked": true,
"organization_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"plan_label": "example",
"provider": "example",
"scope": "example",
"workspace_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"
}
],
"total": 1
}

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

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"
}