Skip to content

Containers

All container endpoints are under https://api.hzel.org/api/v1/containers. Mutating endpoints (POST) require an x-csrf-token header when called from a browser session. PAT and OAuth Bearer tokens are exempt from CSRF.


List containers visible to the authenticated user. Admins see all containers; regular users see only their own.

HeaderValueRequired
AuthorizationBearer <token>Yes

Success 200

{
"data": [
{
"id": "01942cf7-…",
"user_id": "01942cf6-…",
"hostname": "my-box",
"state": "running",
"cpu_cores": 1,
"memory_mb": 512,
"disk_gb": 18,
"created_at": "2026-03-28T00:00:00Z"
}
]
}

Errors

Statuserror.codeReason
401UNAUTHORIZEDMissing or invalid auth

Create a new container.

HeaderValueRequired
AuthorizationBearer <token>Yes
Content-Typeapplication/jsonYes
x-csrf-token<csrf_token>Yes, for session auth only

Request Body

FieldTypeRequiredDescription
hostnamestringYesUnique name for the container
cpu_coresintegerNoDefault: 1
memory_mbintegerNoDefault: 512
disk_gbintegerNo1832, default: 18

Success 200

{
"data": {
"id": "01942cf7-…",
"user_id": "01942cf6-…",
"hostname": "my-box",
"state": "provisioning",
"cpu_cores": 1,
"memory_mb": 512,
"disk_gb": 18,
"created_at": "2026-03-28T00:00:00Z"
}
}

Errors

Statuserror.codeReason
400BAD_REQUESTMissing or invalid fields
401UNAUTHORIZEDMissing or invalid auth
403CSRF_REJECTEDSession auth missing x-csrf-token

Fetch a single container by UUID.

HeaderValueRequired
AuthorizationBearer <token>Yes

Success 200{ "data": <ContainerRecord> }

Errors

Statuserror.codeReason
401UNAUTHORIZEDMissing or invalid auth
404NOT_FOUNDContainer not found or not owned by user

POST /api/v1/containers/{container_id}/start

Section titled “POST /api/v1/containers/{container_id}/start”

Start a stopped container. Polls until the state is confirmed running.

HeaderValueRequired
AuthorizationBearer <token>Yes
x-csrf-token<csrf_token>Yes, for session auth only

Success 200{ "data": <ContainerRecord> } with state: "running"

Errors

Statuserror.codeReason
401UNAUTHORIZEDMissing or invalid auth
403CSRF_REJECTEDSession auth missing x-csrf-token
404NOT_FOUNDContainer not found

POST /api/v1/containers/{container_id}/stop

Section titled “POST /api/v1/containers/{container_id}/stop”

Stop a running container.

HeaderValueRequired
AuthorizationBearer <token>Yes
x-csrf-token<csrf_token>Yes, for session auth only

Success 200{ "data": <ContainerRecord> } with state: "stopped"

Errors

Statuserror.codeReason
401UNAUTHORIZEDMissing or invalid auth
403CSRF_REJECTEDSession auth missing x-csrf-token
404NOT_FOUNDContainer not found

POST /api/v1/containers/{container_id}/restart

Section titled “POST /api/v1/containers/{container_id}/restart”

Restart a container.

HeaderValueRequired
AuthorizationBearer <token>Yes
x-csrf-token<csrf_token>Yes, for session auth only

Success 200{ "data": <ContainerRecord> } with state: "running"

Errors

Statuserror.codeReason
401UNAUTHORIZEDMissing or invalid auth
403CSRF_REJECTEDSession auth missing x-csrf-token
404NOT_FOUNDContainer not found

GET /api/v1/containers/{container_id}/metrics

Section titled “GET /api/v1/containers/{container_id}/metrics”

Fetch current CPU, memory, and disk utilization.

HeaderValueRequired
AuthorizationBearer <token>Yes

Success 200

{
"data": {
"cpu_percent": 12.4,
"memory_used_mb": 203,
"memory_total_mb": 512,
"disk_used_gb": 4.1,
"disk_total_gb": 18
}
}

Errors

Statuserror.codeReason
401UNAUTHORIZEDMissing or invalid auth
404NOT_FOUNDContainer not found

{
"id": "01942cf7-…",
"user_id": "01942cf6-…",
"hostname": "my-box",
"state": "running",
"cpu_cores": 1,
"memory_mb": 512,
"disk_gb": 18,
"created_at": "2026-03-28T00:00:00Z"
}

state values: "running" | "stopped" | "provisioning" | "failed"