The Containers API lets you enumerate, inspect, create, modify, and delete your containers. You can also fetch live resource statistics and issue a signed, portable container authorization claim for offline verification by container programs.
Use these endpoints when you need to:
Discover containers across all projects or within a single project.
Read a container’s configuration, runtime state, and proxy permissions.
Provision a new container on a chosen server inside a project.
Update mutable container fields such as name, color, autostart, ramdisk settings, environment variables, SSH key, comment, and realm membership.
Tear down a container when it is no longer needed.
Mint a short-lived signed claim (container_claim) that proves authorization for a specific container without an extra API round-trip.
Filter by realm ID. Only returns containers that belong to this realm. Alternative to using a realm subdomain in the URL.
runtime
query
string
No
Include live runtime information. Accepts true, false, or a URL-encoded JSON string like {"displays":true}. An empty JSON object {} fetches all info. Results are cached for 2 seconds to prevent abuse.
include_proxy_domains
query
string
No
Include proxy domains (aliases) for each container. Allowed values: true, false.
include_proxy_permissions
query
string
No
Include the full proxy-permissions documents for each container. Allowed values: true, false. Returns authentication group configuration including credentials — request only when explicitly needed. Auth tokens additionally require the resources.proxy_aliases permission.
include_prespawn
query
string
No
Include prespawn containers in the listing. By default, prespawn containers are excluded. Allowed values: true, false.
include_expired
query
string
No
Include containers that have expired due to server termination. By default, expired containers are excluded. Allowed values: true, false.
include_deleting
query
string
No
Include containers currently being deleted. By default, deleting containers are excluded. Allowed values: true, false.
Include live runtime information. Accepts true, false, or a URL-encoded JSON string like {"displays":true}. An empty JSON object {} fetches all info. Results are cached for 2 seconds to prevent abuse.
include_proxy_domains
query
string
No
Include proxy domains (aliases) for this container. Allowed values: true, false.
include_proxy_permissions
query
string
No
Include the full proxy-permissions documents for this container. Allowed values: true, false. Auth tokens additionally require the resources.proxy_aliases permission.
Field to sort by. Allowed values: id, name, status, created_at, updated_at
sort_order
query
string
No
Sort direction. Allowed values: asc, desc
runtime
query
string
No
Include live runtime information. Accepts true, false, or a URL-encoded JSON string like {"displays":true}. An empty JSON object {} fetches all info. Results are cached for 2 seconds.
include_proxy_domains
query
string
No
Include proxy domains (aliases) for each container. Allowed values: true, false.
include_proxy_permissions
query
string
No
Include the full proxy-permissions documents for each container. Allowed values: true, false. Auth tokens additionally require the resources.proxy_aliases permission.
include_prespawn
query
string
No
Include prespawn containers in the listing. By default, prespawn containers are excluded. Allowed values: true, false.
include_deleting
query
string
No
Include containers currently being deleted. By default, deleting containers are excluded. Allowed values: true, false.
Returns real-time resource usage statistics for a container — CPU, memory, ramdisk, disk, and network interface counters. Useful for monitoring and troubleshooting.
Issues a signed, portable container authorization claim. The returned container_claim is an ED25519-signed credential that proves:
Who the user is (sub, type)
Which container they are authorized for (containerId, projectId)
When Hoody issued the authorization (iat, exp)
Container programs can verify this claim offline using Hoody’s public key at GET /api/v1/meta/public-key — no API round-trip needed during verification.
Claims expire after HOODY_CONTAINER_CLAIM_EXPIRES_IN (default 6 hours). Clients should re-call this endpoint to refresh before expiry.
The response body is also signed via the X-Hoody-Signature response header in the format t=<unix_ts>,kid=<keyId>,path=<urlPath>,sig=<128-hex> so callers can verify the body without an extra round-trip.
{
"statusCode":400,
"error":"Bad Request",
"message":"Invalid ID format"
}
Error Code
Title
Description
Resolution
INVALID_ID_FORMAT
Invalid ID format
The provided ID must be a 24-character hexadecimal string
Ensure the ID is exactly 24 characters long and contains only hexadecimal characters (0-9, a-f)
{
"statusCode":401,
"error":"Unauthorized",
"message":"Authentication token required"
}
Error Code
Title
Description
Resolution
MISSING_TOKEN
Authentication token missing
No authentication token was provided in the request
Include a valid JWT token in the Authorization header as Bearer <token>
{
"statusCode":403,
"error":"Forbidden",
"message":"Insufficient permissions"
}
Error Code
Title
Description
Resolution
INSUFFICIENT_PERMISSIONS
Insufficient permissions
You do not have the required permissions to perform this action
Contact the resource owner or administrator to request access
{
"statusCode":404,
"error":"Not Found",
"message":"Container not found"
}
Error Code
Title
Description
Resolution
CONTAINER_NOT_FOUND
Container not found
The requested container does not exist or you do not have permission to access it.
Verify the container ID is correct and that you have access to the project it belongs to.
{
"statusCode":503,
"error":"SIGNING_NOT_CONFIGURED",
"message":"Response signing is not configured on this API instance"
Container name — 3-100 characters, alphanumeric with hyphens and underscores. Omit or pass "rand" to generate a random name.
color
string
No
—
HEX color for the container (e.g. #FF0000 or FF0000). The # prefix is added if missing; the value is converted to uppercase.
container_image
string
No
—
Container image to use. If null or omitted, the default configured image is used.
ai
boolean
No
true
Whether AI features are enabled.
environment_vars
object
No
—
Environment variables as key-value pairs (max 200 keys, each value ≤ 65536 chars; keys must match ^[a-zA-Z_][a-zA-Z0-9_]*$).
ssh_public_key
string
No
—
SSH public key for container access. SSH public keys must be unique per container. If omitted, the container inherits from the project’s defaults.
comment
string
No
—
Optional comment (max 16000 characters).
hoody_kit
boolean
No
true
Enable all Hoody Kit features (extra apt sources, base packages, hoody-daemon, sudo env, remove snapd, webview, user, hoody-ai, ttyd).
dev_kit
boolean
No
—
Enable dev_kit development tools. Defaults to true when hoody_kit is true, otherwise false. Cannot be updated after creation.
autostart
boolean
No
true
Whether the container should start automatically on host boot.
ramdisk
boolean
No
true
Whether to mount a ramdisk at /ramdisk. Data persists across container restarts but is lost on a host reboot.
cache
boolean
No
true
Enable use of cached images during creation. When false, no cache options are added.
cache_image
boolean
No
false
Force the creation of a new cached image from the container image. Admins and the image owner only.
prespawn
boolean
No
false
Internal — not user-settable. Passing true is rejected (403); an explicit false is accepted.
bypass_prespawn
boolean
No
false
Bypass prespawn container claiming and create a fresh container directly.
realm_ids
array
No
—
Realm IDs to assign this container to. If creating from a realm subdomain, the subdomain realm is automatically merged with any explicit values. Containers may have different realm membership than their parent project.
"comment":"Backend API server with PostgreSQL connection",
"created_at":"2025-01-15T15:45:00.000Z",
"updated_at":"2025-01-15T15:45:00.000Z",
"realm_ids":[]
}
}
{
"statusCode":400,
"error":"Bad Request",
"message":"Validation failed"
}
Error Code
Title
Description
Resolution
VALIDATION_ERROR
Invalid input parameters
One or more request parameters failed validation
Check the error message for specific field requirements and correct your input
INVALID_ID_FORMAT
Invalid ID format
The provided ID must be a 24-character hexadecimal string
Ensure the ID is exactly 24 characters long and contains only hexadecimal characters (0-9, a-f)
INVALID_CONTAINER_NAME
Invalid container name
Container name must be 3-100 characters, alphanumeric with hyphens and underscores.
Use a valid name between 3 and 100 characters containing only a-z, A-Z, 0-9, -, and _.
SERVER_CONTAINER_LIMIT
Server container limit reached
The target server is at its maximum number of live containers (explicit max_containers, or the free-tier default).
Delete an existing container on this server, or create the container on a different server.
PROJECT_CONTAINER_LIMIT
Project container limit reached
The target project is at its owner-configured container quota (projects.max_containers). Prespawn containers are excluded from this quota.
Delete an existing container in this project, raise the project quota, or use a different project.
{
"statusCode":401,
"error":"Unauthorized",
"message":"Authentication token required"
}
Error Code
Title
Description
Resolution
MISSING_TOKEN
Authentication token missing
No authentication token was provided in the request
Include a valid JWT token in the Authorization header as Bearer <token>
INVALID_TOKEN
Invalid authentication token
The provided authentication token is malformed or invalid
Obtain a new token by logging in again or using a valid auth token
TOKEN_EXPIRED
Authentication token expired
The provided authentication token has expired
Obtain a new token by logging in again or refreshing your session
{
"statusCode":403,
"error":"Forbidden",
"message":"Insufficient permissions"
}
Error Code
Title
Description
Resolution
INSUFFICIENT_PERMISSIONS
Insufficient permissions
You do not have the required permissions to perform this action
Contact the resource owner or administrator to request access
ACCOUNT_BANNED
Account banned
Your account has been banned and cannot access this resource
Contact support for information about your account status
{
"statusCode":404,
"error":"Not Found",
"message":"Resource not found"
}
Error Code
Title
Description
Resolution
RESOURCE_NOT_FOUND
Resource not found
The requested resource does not exist or has been deleted
Verify the resource ID and ensure it exists
{
"statusCode":409,
"error":"Conflict",
"message":"Container name already in use within the project"
}
Error Code
Title
Description
Resolution
CONTAINER_NAME_IN_USE
Container name already in use
A container with this name already exists in the project.
Choose a different name for your container.
SSH_PUBLIC_KEY_IN_USE
SSH public key already in use
SSH public keys must be unique per container. A single public key cannot be assigned to multiple containers because it is used for routing SSH connections.
Generate a new SSH key pair for this container, or remove the key from the other container before reusing it.
{
"statusCode":422,
"error":"Unprocessable Entity",
"message":"Quota exceeded"
}
Error Code
Title
Description
Resolution
QUOTA_EXCEEDED
Quota exceeded
You have exceeded your quota for this resource type
Delete unused resources or upgrade your plan for higher limits
Updates mutable fields on an existing container. Omitted fields are preserved. Use null for ssh_public_key or comment to clear the value or fall back to project defaults.
Check the error message for specific field requirements and correct your input
INVALID_ID_FORMAT
Invalid ID format
The provided ID must be a 24-character hexadecimal string
Ensure the ID is exactly 24 characters long and contains only hexadecimal characters (0-9, a-f)
INVALID_CONTAINER_NAME
Invalid container name
Container name must be 3-100 characters, alphanumeric with hyphens and underscores.
Use a valid name between 3 and 100 characters containing only a-z, A-Z, 0-9, -, and _.
{
"statusCode":401,
"error":"Unauthorized",
"message":"Authentication token required"
}
Error Code
Title
Description
Resolution
MISSING_TOKEN
Authentication token missing
No authentication token was provided in the request
Include a valid JWT token in the Authorization header as Bearer <token>
INVALID_TOKEN
Invalid authentication token
The provided authentication token is malformed or invalid
Obtain a new token by logging in again or using a valid auth token
TOKEN_EXPIRED
Authentication token expired
The provided authentication token has expired
Obtain a new token by logging in again or refreshing your session
{
"statusCode":403,
"error":"Forbidden",
"message":"Insufficient permissions"
}
Error Code
Title
Description
Resolution
INSUFFICIENT_PERMISSIONS
Insufficient permissions
You do not have the required permissions to perform this action
Contact the resource owner or administrator to request access
ACCOUNT_BANNED
Account banned
Your account has been banned and cannot access this resource
Contact support for information about your account status
OPERATION_NOT_PERMITTED_ON_EXPIRED
Operation Not Permitted on Expired Container
This operation cannot be performed because the container has expired due to server termination.
The container is in a read-only state. No further operations are allowed. Please create a new container.
{
"statusCode":404,
"error":"Not Found",
"message":"Container not found"
}
Error Code
Title
Description
Resolution
CONTAINER_NOT_FOUND
Container not found
The requested container does not exist or you do not have permission to access it.
Verify the container ID is correct and that you have access to the project it belongs to.
RESOURCE_NOT_FOUND
Resource not found
The requested resource does not exist or has been deleted
Verify the resource ID and ensure it exists
{
"statusCode":409,
"error":"Conflict",
"message":"Container name already in use within the project"
}
Error Code
Title
Description
Resolution
CONTAINER_NAME_IN_USE
Container name already in use
A container with this name already exists in the project.
Choose a different name for your container.
SSH_PUBLIC_KEY_IN_USE
SSH public key already in use
SSH public keys must be unique per container. A single public key cannot be assigned to multiple containers because it is used for routing SSH connections.
Generate a new SSH key pair for this container, or remove the key from the other container before reusing it.