Skip to content

List the secrets this deployment declares, and their state (never a value).

GET
/v1/admin/secrets
curl --request GET \
--url http://localhost:8080/v1/admin/secrets \
--header 'Authorization: Bearer <token>'

OK.

Media typeapplication/json
object
secrets
required
Array<object>

One declared secret and its current state. This schema has NO field that can hold a value, by construction - adding one would be the bug it exists to prevent.

object
name
required

Stable identifier, dotted and namespaced by feature (artwork.steamgriddb.api_key).

string
label
required

Operator-facing name.

string
description
required

What setting it enables.

string
env_var
required

The environment variable that supplies the same credential as a FALLBACK, or empty when there is none.

string
docs_url
required

Where to obtain the credential. May be empty.

string
configured
required

True when a value is stored in the database, whether or not this control plane can decrypt it.

boolean
readable
required

False when a value is stored but the master key is missing or wrong. Distinguishing this from ‘not configured’ is the point: the operator’s fix is completely different.

boolean
hint
required

Masked tail of the STORED value - last 4 characters, and EMPTY for a value short enough that 4 characters would be a meaningful fraction of it. Never a full value.

string
env_set
required

Whether the fallback environment variable is present on the server. PRESENCE only; the value is never reported.

boolean
origin
required

Which source is actually IN EFFECT. ‘database’ wins over ‘environment’ when both are present, so an admin typing a key into the UI is never silently overridden by a stale env var. A stored-but-unreadable secret reports ‘none’ rather than falling through to the environment - silently using a different credential than the one an admin configured is the surprise this facility exists to prevent.

string
Allowed values: none database environment
key_version
required

Master-key version the stored value was written under; 0 when nothing is stored.

integer
updated_by
required
string | null format: uuid
updated_at
required
string | null format: date-time
problem

Operator-facing explanation when readable is false. Never contains any part of a value.

string
master_key_configured
required

False when QUASAR_SECRET_KEY is unset. This is a SUPPORTED state, not a fault: the control plane boots normally and secret-backed features report themselves unavailable. The UI reads this to explain that storing secrets is unavailable rather than offering a field whose save always fails.

boolean
key_versions
required

Master-key versions this control plane can decrypt with, so a version mismatch is diagnosable.

Array<integer>
Example
{
"secrets": [
{
"origin": "none"
}
]
}

Missing/invalid/expired/revoked token.

Media typeapplication/json
object
error
required
object
code
required

E.g. validation_failed, unauthorized, forbidden, not_found, conflict, session_quota_exceeded, home_in_use, home_not_provisioned, parent_app_disabled, profile_ineligible, profile_not_launchable_for_app, no_host_available, capacity_exhausted, restart_required, rate_limited, internal. Open string, not an enum: new codes are additive and an unknown one falls through to a client’s generic per-status branch.

string
message
required
string
live_sessions

Present on restart_required.

integer
session_id

Steam library discovery Phase 3, ADDITIVE: present on home_in_use when the guard could name the CONFLICTING live session - the one already holding the home. It is here so the client can offer “go to your running session” with a link instead of a dead-end toast. OMITTED rather than empty when the conflict is known but the session is not, so a client branches on presence and never renders a link to nowhere. Load-bearing once derived tiles exist: the lock is held by the PARENT’s home, so a user who clicks a game tile can be refused because a DIFFERENT app (the Steam launcher, or another game from the same install) is running, and without the session id the refusal reads as a bug. See control-api.md §Derived tiles.

string format: uuid
derived_tiles

Steam library discovery Phase 3, ADDITIVE: present on the 409 conflict from DELETE /v1/apps/{id} when the app has derived tiles and ?delete_derived=true was not sent. A LIST, not a count - the point of the confirmation is that the admin sees what they are about to destroy. Capped; an empty array means the tiles could not be listed, never that there are none.

Array<object>
object
id
required
string format: uuid
name
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"live_sessions": 1,
"session_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"derived_tiles": [
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"name": "example"
}
]
}
}

Authenticated but insufficient role / not the owner (precedes resource lookup).

Media typeapplication/json
object
error
required
object
code
required

E.g. validation_failed, unauthorized, forbidden, not_found, conflict, session_quota_exceeded, home_in_use, home_not_provisioned, parent_app_disabled, profile_ineligible, profile_not_launchable_for_app, no_host_available, capacity_exhausted, restart_required, rate_limited, internal. Open string, not an enum: new codes are additive and an unknown one falls through to a client’s generic per-status branch.

string
message
required
string
live_sessions

Present on restart_required.

integer
session_id

Steam library discovery Phase 3, ADDITIVE: present on home_in_use when the guard could name the CONFLICTING live session - the one already holding the home. It is here so the client can offer “go to your running session” with a link instead of a dead-end toast. OMITTED rather than empty when the conflict is known but the session is not, so a client branches on presence and never renders a link to nowhere. Load-bearing once derived tiles exist: the lock is held by the PARENT’s home, so a user who clicks a game tile can be refused because a DIFFERENT app (the Steam launcher, or another game from the same install) is running, and without the session id the refusal reads as a bug. See control-api.md §Derived tiles.

string format: uuid
derived_tiles

Steam library discovery Phase 3, ADDITIVE: present on the 409 conflict from DELETE /v1/apps/{id} when the app has derived tiles and ?delete_derived=true was not sent. A LIST, not a count - the point of the confirmation is that the admin sees what they are about to destroy. Capped; an empty array means the tiles could not be listed, never that there are none.

Array<object>
object
id
required
string format: uuid
name
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"live_sessions": 1,
"session_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"derived_tiles": [
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"name": "example"
}
]
}
}