Skip to content

List managed homes (storage oversight).

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

OK.

Media typeapplication/json
object
items
required
Array<object>

One managed-home row from GET /v1/admin/storage/homes (storage/handler.go homeResp).

object
id
required
string format: uuid
user_id
required

Null when the user was deleted and the row is orphaned pending GC.

string | null format: uuid
app_id
required

Null when the app was deleted and the row is orphaned pending GC.

string | null format: uuid
host_id
required
string | null format: uuid
username
required

Users.username for user_id — display only. Null when user_id is null (the home outlived its user); the row still appears so its bytes stay accounted for.

string | null
app_name
required

Apps.name for app_id — display only. Null when app_id is null (the home outlived its app); the row still appears so its bytes stay accounted for.

string | null
host_name
required

Hosts.node_name for host_id — display only. Null when host_id is null or the host row is gone.

string | null
provider
required
string
ref
required
string
bytes_used
required
integer
created_at
required
string format: date-time
last_used_at
required
string format: date-time
gc_after
required

Non-null means a GC tombstone has been set.

string | null format: date-time
next_cursor
required
string | null
Examplegenerated
{
"items": [
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"user_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"app_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"host_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"username": "example",
"app_name": "example",
"host_name": "example",
"provider": "example",
"ref": "example",
"bytes_used": 1,
"created_at": "2026-04-15T12:00:00Z",
"last_used_at": "2026-04-15T12:00:00Z",
"gc_after": "2026-04-15T12:00:00Z"
}
],
"next_cursor": "example"
}

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