API reference
Every endpoint the Bitsmith API serves, grouped by domain. Each entry shows the HTTP method and path, the scope a token needs, the endpoint’s hints, and the JSON schema of its arguments. Path parameters are part of the path; the rest of the arguments go in the request body (POST, PATCH, PUT) or the query string (GET, DELETE).
The same operations are also exposed to MCP clients as tools, so an access token works on both transports. See the MCP docs.
The page is generated from the server source, so it matches this release; for a given server, GET /api/v1/catalog is the live catalog.
128 endpoints across 8 domains.
Virtual machines
Section titled “Virtual machines”38 endpoints · scopes sandbox.manage, sandbox.read, vm.exec, vm.manage, vm.read
GET /api/v1/vms List virtual machines.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms Create a VM from an image or a captured template.
Arguments
{ "type": "object", "properties": { "name": { "type": "string", "description": "Name for the new virtual machine." }, "image_id": { "type": "string", "description": "ID of the VM image to clone, such as debian-13-genericcloud-amd64." }, "cpu_cores": { "type": "integer", "description": "Number of virtual CPU cores. Server applies image minimum when omitted.", "minimum": 0, "maximum": 4294967295 }, "memory_mb": { "type": "integer", "description": "Memory in MiB. Server applies image minimum when omitted.", "minimum": 0, "maximum": 4294967295 }, "disk_size_gb": { "type": "integer", "description": "Target VM disk size in GiB. Server applies image minimum when omitted.", "minimum": 0, "maximum": 4294967295 }, "username": { "type": "string", "description": "Cloud-init username. Defaults to the image default user when omitted." }, "ssh_public_key": { "type": "string", "description": "SSH public key to install with cloud-init. Install your own key here to SSH into the VM after it boots; the cloud-init user has passwordless sudo." }, "storage_id": { "type": "string", "description": "Storage pool ID for the VM disk." }, "vmid": { "type": "integer", "description": "Numeric VM ID. Automatically assigned when omitted." }, "package_upgrade": { "type": "boolean", "description": "Run package upgrades during cloud-init." }, "ssh_password_auth": { "type": "boolean", "description": "Enable SSH password authentication in cloud-init." }, "dns_servers": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "Cloud-init DNS servers." }, "ip_address": { "type": "string", "description": "Static cloud-init IP address, optionally with CIDR." }, "gateway": { "type": "string", "description": "Static cloud-init gateway." }, "autostart": { "type": "boolean", "description": "Start the VM on host boot." }, "linked_clone": { "type": "boolean", "description": "Provision the disk as a copy-on-write overlay on the image instead of copying it. Creation becomes near-instant regardless of image size, but the image can no longer be deleted or moved while this VM exists." }, "seed_data": { "type": "string", "description": "Data written into the guest at /etc/bitsmith/seed before its first boot, for per-VM identity such as an enrollment token." }, "skip_rekey": { "type": "boolean", "description": "Skip clearing the source image's machine-id and SSH host keys. The seed is still written. This is not a speed option: creation takes about the same time either way, because the cost is the offline image pass that writes the seed, not the re-key. Use it when the VM's identity has to survive creation, which means the source VM of a warm state, or a guest image that re-keys itself on first boot. A VM re-keyed by neither side shares its source's identity and can register itself as its source, so leave it off otherwise." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "name", "image_id" ], "additionalProperties": false}GET /api/v1/vms/images List VM images and templates stored on this server.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/vms/images/catalog List VM images available for download.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/vms/images/{image_id} Delete a VM image or captured template.
Arguments
{ "type": "object", "properties": { "storage_id": { "type": "string", "description": "Storage pool holding the template. Empty means the system drive." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/images/{image_id}/move Move a VM image to another storage pool.
Arguments
{ "type": "object", "properties": { "source_storage_id": { "type": "string", "description": "Current storage pool of the image." }, "target_storage_id": { "type": "string", "description": "Destination storage pool for the image." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "source_storage_id", "target_storage_id" ], "additionalProperties": false}GET /api/v1/vms/isos List installer ISOs stored on this server.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/isos/{iso_id}/move Move an installer ISO to another storage pool.
Arguments
{ "type": "object", "properties": { "source_storage_id": { "type": "string", "description": "Current storage pool of the ISO." }, "target_storage_id": { "type": "string", "description": "Destination storage pool for the ISO." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "source_storage_id", "target_storage_id" ], "additionalProperties": false}GET /api/v1/vms/warm-states List saved VM warm states.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/warm-states/{id} Create a VM that resumes from a saved warm state.
Arguments
{ "type": "object", "properties": { "name": { "type": "string", "description": "Name for the new virtual machine." }, "vmid": { "type": "integer", "description": "Numeric VM ID for the new VM. Automatically assigned when omitted." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "name" ], "additionalProperties": false}DELETE /api/v1/vms/warm-states/{id} Delete a saved warm state.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/vms/capacity Report whether the host can run another VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/vms/host-status Return VM host runtime checks.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/vms/{id} Get a VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PATCH /api/v1/vms/{id} Update a stopped VM's CPU and memory.
Arguments
{ "type": "object", "properties": { "cpu_cores": { "type": [ "null", "integer" ], "description": "Number of virtual CPU cores. Omit to keep unchanged.", "minimum": 0, "maximum": 4294967295 }, "memory_mb": { "type": [ "null", "integer" ], "description": "Memory in MiB. Omit to keep unchanged.", "minimum": 0, "maximum": 4294967295 }, "autostart": { "type": [ "null", "boolean" ], "description": "Start the VM on host boot. Omit to keep unchanged." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/vms/{id} Delete a VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/start Start a VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/stop Shut a VM down, hard-stopping it if it ignores the graceful request.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/suspend Suspend a VM: save its guest memory to disk and stop it.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/resume Resume a suspended VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/clone Clone a stopped VM's disk into a new VM.
Arguments
{ "type": "object", "properties": { "source_vmid": { "type": "integer", "description": "Numeric VM ID of the source virtual machine to clone." }, "name": { "type": "string", "description": "Name for the cloned virtual machine." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "source_vmid", "name" ], "additionalProperties": false}POST /api/v1/vms/{id}/cloud-init Update a VM's cloud-init settings.
Arguments
{ "type": "object", "properties": { "cloud_init_enabled": { "type": [ "null", "boolean" ], "description": "Enable or disable cloud-init for the VM." }, "username": { "type": [ "null", "string" ], "description": "Cloud-init username." }, "ssh_public_key": { "type": [ "null", "string" ], "description": "SSH public key to install with cloud-init. Empty disables key-based SSH unless ssh_enabled is set." }, "password": { "type": [ "null", "string" ], "description": "Cloud-init password to set for the user." }, "clear_password": { "type": [ "null", "boolean" ], "description": "Clear the stored cloud-init password." }, "ssh_enabled": { "type": [ "null", "boolean" ], "description": "Enable SSH setup in cloud-init." }, "ssh_password_auth": { "type": [ "null", "boolean" ], "description": "Enable SSH password authentication in cloud-init." }, "dns_servers": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "Cloud-init DNS servers. Provide an empty array to clear." }, "ip_address": { "type": [ "null", "string" ], "description": "Static cloud-init IP address, optionally with CIDR. Empty clears it." }, "gateway": { "type": [ "null", "string" ], "description": "Static cloud-init gateway. Empty clears it." }, "package_upgrade": { "type": [ "null", "boolean" ], "description": "Run package upgrades during cloud-init." }, "network_type": { "type": [ "null", "string" ], "description": "Network type: bridged or none." }, "network_bridge": { "type": [ "null", "string" ], "description": "Bridge name when network_type is bridged." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/exec Run a shell command inside a VM through its guest agent.
Arguments
{ "type": "object", "properties": { "command": { "type": "string", "description": "Shell command to run inside the guest via /bin/sh -c." }, "timeout_seconds": { "type": "integer", "description": "Maximum seconds to wait for the command. Defaults to 60." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "command" ], "additionalProperties": false}POST /api/v1/vms/{id}/wait-ready Wait until a VM is running and reachable.
Arguments
{ "type": "object", "properties": { "timeout_seconds": { "type": "integer", "description": "Maximum seconds to wait. Defaults to 60." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/wait-ip Wait until a VM has an IP address.
Arguments
{ "type": "object", "properties": { "timeout_seconds": { "type": "integer", "description": "Maximum seconds to wait. Defaults to 60." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/vms/{id}/connection Get SSH connection details for a VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/disks Attach a new empty disk to a VM.
Arguments
{ "type": "object", "properties": { "size_gb": { "type": "integer", "description": "Size of the new disk in GiB (must be \u003e= 1).", "minimum": 0, "maximum": 4294967295 }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "size_gb" ], "additionalProperties": false}DELETE /api/v1/vms/{id}/disks/{disk_id} Detach and delete an additional disk from a VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PATCH /api/v1/vms/{id}/disks/{disk_id} Grow an additional disk on a VM.
Arguments
{ "type": "object", "properties": { "size_gb": { "type": "integer", "description": "Target size of the disk in GiB (must be at least 1; server enforces grow-only).", "minimum": 0, "maximum": 4294967295 }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "size_gb" ], "additionalProperties": false}POST /api/v1/vms/{id}/template Capture a VM's disk as a reusable template.
Arguments
{ "type": "object", "properties": { "template_name": { "type": "string", "description": "Optional name for the captured template image. Defaults to the VM name." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/vms/{id}/warm-states Save a running VM as a warm state.
Arguments
{ "type": "object", "properties": { "name": { "type": "string", "description": "Label for the warm state. Defaults to the VM name when omitted." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/vms/{id}/docs Get the documentation stored for a VM.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PUT /api/v1/vms/{id}/docs Set or append to a VM's documentation.
Arguments
{ "type": "object", "properties": { "content": { "type": "string", "description": "Markdown documentation content. Replaces the docs when append_entry is false; the text of one new entry when append_entry is true." }, "append_entry": { "type": "boolean", "description": "Append content as a timestamped entry below the existing docs instead of replacing them." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "content" ], "additionalProperties": false}GET /api/v1/tasks List queued and running background tasks.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/tasks/{task_id} Get a background task.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/tasks/{task_id}/logs Get the log lines a background task produced.
Arguments
{ "type": "object", "properties": { "after_line": { "type": "integer", "description": "Only return log lines after this line number, for incremental polling. Defaults to 0 (from the start)." }, "limit": { "type": "integer", "description": "Maximum log lines to return (1-500). Defaults to 200." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/templates Build a reusable VM template from a base image and a cloud-init script.
Arguments
{ "type": "object", "properties": { "base_image_id": { "type": "string", "description": "ID of the image the build machine boots from, such as debian-13-genericcloud-amd64. It is downloaded first if this host does not have it yet." }, "name": { "type": "string", "description": "Name for the template this build produces." }, "user_data": { "type": "string", "description": "Cloud-init user-data the build machine boots with, used verbatim. End it by powering the machine off: that is how the build says it is finished." }, "labels": { "type": "object", "description": "Labels stored verbatim on the resulting image and returned by list_virtual_machine_images.", "additionalProperties": { "type": "string" } }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "base_image_id", "name" ], "additionalProperties": false}GET /api/v1/templates/{task_id} Report how a template build is going.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}System
Section titled “System”4 endpoints · scopes system.read
GET /api/v1/system/health Return host CPU, memory, and overall health.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/system/allocation Summarize CPU and memory allocation against host capacity.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/activity Search the activity log.
Arguments
{ "type": "object", "properties": { "category": { "type": "string", "description": "Filter by category: auth, user, share, file, storage, backup, app, update, license, system, or agent. Omit for all." }, "severity": { "type": "string", "description": "Filter by severity: info, warning, or critical. Omit for all." }, "search": { "type": "string", "description": "Substring matched against the event summary and target label." }, "since": { "type": "string", "description": "Only events at or after this RFC3339 timestamp." }, "until": { "type": "string", "description": "Only events at or before this RFC3339 timestamp." }, "limit": { "type": "integer", "description": "Maximum events to return (1-200). Defaults to 50." }, "cursor": { "type": "string", "description": "Pagination cursor from a previous call's next_cursor." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/peers List the paired servers in the cluster.
Arguments
No arguments.
13 endpoints · scopes apps.manage, apps.read
GET /api/v1/apps List installed apps.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/apps Install an app.
Arguments
{ "type": "object", "properties": { "template_id": { "type": "string", "description": "Template ID to install from catalog." }, "name": { "type": "string", "description": "Optional custom name for the app." }, "storage_id": { "type": "string", "description": "Storage pool ID for app data." }, "folder_assignments": { "type": [ "null", "array" ], "items": { "type": "object", "properties": { "folder_id": { "type": "string", "description": "Folder ID to mount." }, "sub_path": { "type": "string", "description": "Sub-path within the folder." }, "container_path": { "type": "string", "description": "Mount point path inside the container." }, "mount_point_id": { "type": "string", "description": "Optional mount point ID." }, "read_only": { "type": "boolean", "description": "Mount as read-only." } }, "required": [ "folder_id", "container_path" ], "additionalProperties": false }, "description": "Folder mount assignments." }, "compose_content": { "type": "string", "description": "Custom compose content (for custom apps)." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "template_id" ], "additionalProperties": false}GET /api/v1/apps/templates List apps available to install.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/apps/discovered List unmanaged containers found on the host.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/apps/{app_id} Uninstall an app.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/apps/{app_id}/actions Start, stop, or restart an app.
Arguments
{ "type": "object", "properties": { "action": { "type": "string", "description": "One of start, stop, or restart." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "action" ], "additionalProperties": false}GET /api/v1/apps/{app_id}/logs Get an app's container logs.
Arguments
{ "type": "object", "properties": { "tail": { "type": "integer", "description": "Number of trailing log lines to return. Defaults to the server default.", "minimum": 0, "maximum": 4294967295 }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/apps/{app_id}/stats Get an app's resource usage.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PATCH /api/v1/apps/{app_id}/compose Update an app's compose file.
Arguments
{ "type": "object", "properties": { "compose_content": { "type": "string", "description": "New compose YAML content." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "compose_content" ], "additionalProperties": false}PATCH /api/v1/apps/{app_id}/folders Update an app's folder mounts.
Arguments
{ "type": "object", "properties": { "folder_assignments": { "type": [ "null", "array" ], "items": { "type": "object", "properties": { "folder_id": { "type": "string", "description": "Folder ID to mount." }, "sub_path": { "type": "string", "description": "Sub-path within the folder." }, "container_path": { "type": "string", "description": "Mount point path inside the container." }, "mount_point_id": { "type": "string", "description": "Optional mount point ID." }, "read_only": { "type": "boolean", "description": "Mount as read-only." } }, "required": [ "folder_id", "container_path" ], "additionalProperties": false }, "description": "New folder assignments." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/apps/{app_id}/move Move an app's data to another storage pool.
Arguments
{ "type": "object", "properties": { "storage_id": { "type": "string", "description": "Target storage pool ID." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "storage_id" ], "additionalProperties": false}GET /api/v1/apps/{app_id}/docs Get the documentation stored for an app.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PUT /api/v1/apps/{app_id}/docs Set or append to an app's documentation.
Arguments
{ "type": "object", "properties": { "content": { "type": "string", "description": "Markdown documentation content. Replaces the docs when append_entry is false; the text of one new entry when append_entry is true." }, "append_entry": { "type": "boolean", "description": "Append content as a timestamped entry below the existing docs instead of replacing them." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "content" ], "additionalProperties": false}LXC containers
Section titled “LXC containers”24 endpoints · scopes lxc.exec, lxc.manage, lxc.read
GET /api/v1/lxc List LXC containers.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc Create an LXC container from a template image.
Arguments
{ "type": "object", "properties": { "name": { "type": "string", "description": "Name for the new LXC container." }, "template": { "type": "string", "description": "Image ID from the LXC image catalog (e.g. debian-13-generic)." }, "cpu_cores": { "type": "integer", "description": "Number of virtual CPU cores. Defaults to the image minimum when omitted.", "minimum": 0, "maximum": 4294967295 }, "memory_mb": { "type": "integer", "description": "Memory in MiB. Defaults to the image minimum when omitted.", "minimum": 0, "maximum": 4294967295 }, "storage_id": { "type": "string", "description": "Storage pool ID for the container rootfs." }, "lxcid": { "type": "integer", "description": "Numeric LXC ID. Automatically assigned when omitted." }, "network_type": { "type": "string", "description": "Network type (e.g. 'bridged', 'none')." }, "dns_servers": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "DNS servers for the container." }, "ip_address": { "type": "string", "description": "Static IP address, optionally with CIDR." }, "gateway": { "type": "string", "description": "Gateway IP address." }, "autostart": { "type": "boolean", "description": "Start the container on host boot." }, "privileged": { "type": "boolean", "description": "Run fully privileged. When false (default), apply idmap + capability dropping + seccomp confinement." }, "nesting": { "type": "boolean", "description": "Enable nested containers (kernel-level mount and seccomp nesting). Mutable via Update at any time." }, "environment": { "type": "object", "description": "Environment variables for the container.", "additionalProperties": { "type": "string" } }, "disk_size_bytes": { "type": "integer", "description": "Root disk size in bytes. Zero uses the template default.", "minimum": 0 }, "template_storage_id": { "type": "string", "description": "Storage pool where the template image resides." }, "mount_points": { "type": [ "null", "array" ], "items": { "type": "object", "properties": { "host_path": { "type": "string" }, "container_path": { "type": "string" }, "read_only": { "type": "boolean" } }, "required": [ "host_path", "container_path", "read_only" ], "additionalProperties": false }, "description": "Additional mount points to bind into the container." }, "network_bridge": { "type": "string", "description": "Bridge for bridged containers. Empty uses the global default." }, "linked_clone": { "type": "boolean", "description": "Provision the rootfs as a copy-on-write ZFS clone of the image's base dataset instead of a full extract. Requires storage_id to be a ZFS pool; near-instant create with a minimal footprint, but the image cannot be deleted or moved while this container exists." }, "seed_data": { "type": "string", "description": "Data written into the guest at /etc/bitsmith/seed before its first boot, for per-container identity such as an enrollment token." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "name", "template" ], "additionalProperties": false}GET /api/v1/lxc/images List cached LXC template images.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/lxc/images/catalog List LXC template images available for download.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/images/{image_id} Download an LXC template image into a storage pool.
Arguments
{ "type": "object", "properties": { "storage_id": { "type": "string", "description": "Storage pool to download the image into. Defaults to the default cache storage." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/template Capture an LXC container's rootfs as a reusable template image.
Arguments
{ "type": "object", "properties": { "image_id": { "type": "string", "description": "Optional ID for the new template image. Defaults to the container name, sanitized. Fails if an image with this ID already exists on the storage." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/lxc/images/{image_id} Delete a cached LXC template image.
Arguments
{ "type": "object", "properties": { "storage_id": { "type": "string", "description": "Storage pool where the image is cached." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "storage_id" ], "additionalProperties": false}POST /api/v1/lxc/images/{image_id}/move Move a cached LXC template image to another storage pool.
Arguments
{ "type": "object", "properties": { "source_storage_id": { "type": "string", "description": "Current storage pool of the image." }, "target_storage_id": { "type": "string", "description": "Destination storage pool for the image." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "source_storage_id", "target_storage_id" ], "additionalProperties": false}GET /api/v1/lxc/host-status Return LXC host runtime checks.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/lxc/{id} Get an LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PATCH /api/v1/lxc/{id} Update an LXC container's name, CPU, memory, or network settings.
Arguments
{ "type": "object", "properties": { "cpu_cores": { "type": "integer", "description": "Number of CPU cores. 0 leaves unchanged.", "minimum": 0, "maximum": 4294967295 }, "memory_mb": { "type": "integer", "description": "Memory in MiB. 0 leaves unchanged.", "minimum": 0, "maximum": 4294967295 }, "nesting": { "type": "boolean", "description": "Enable nested containers. Changes native config only; no rootfs change needed." }, "new_name": { "type": [ "null", "string" ], "description": "New display name for the container. Omit to keep the current name. Must pass backend validation (no slashes, newlines, null bytes, path traversal, or the 'bitsmith-lxc-' prefix; max 128 chars; spaces and uppercase allowed)." }, "ip_address": { "type": [ "null", "string" ], "description": "Static IP address, optionally with CIDR. Omit to keep current; pass an empty string to clear (revert to DHCP)." }, "gateway": { "type": [ "null", "string" ], "description": "Static gateway. Omit to keep current; pass an empty string to clear." }, "dns_servers": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "DNS servers. Omit to keep current; pass an empty array to clear." }, "network_type": { "type": "string", "description": "Network type (e.g. 'bridged', 'none')." }, "network_bridge": { "type": "string", "description": "Bridge name for bridged containers. Empty uses the global default." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/lxc/{id} Delete an LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/start Start an LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/stop Stop an LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/restart Restart an LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/freeze Freeze an LXC container, pausing all its processes.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/unfreeze Unfreeze a frozen LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/lxc/{id}/clone Clone an LXC container to a new name.
Arguments
{ "type": "object", "properties": { "source_lxcid": { "type": "integer", "description": "Numeric LXC ID of the source container to clone." }, "name": { "type": "string", "description": "Name for the cloned LXC container." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "source_lxcid", "name" ], "additionalProperties": false}POST /api/v1/lxc/{id}/exec Run a shell command inside an LXC container.
Arguments
{ "type": "object", "properties": { "command": { "type": "string", "description": "Shell command to run inside the container via /bin/sh -c." }, "timeout_seconds": { "type": "integer", "description": "Maximum seconds to wait for the command. Defaults to 60." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "command" ], "additionalProperties": false}GET /api/v1/lxc/{id}/stats Get an LXC container's resource usage.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PATCH /api/v1/lxc/{id}/disk Set an LXC container's disk limit.
Arguments
{ "type": "object", "properties": { "disk_size_bytes": { "type": "integer", "description": "Maximum disk usage in bytes. Zero removes the limit.", "minimum": 0 }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "disk_size_bytes" ], "additionalProperties": false}POST /api/v1/lxc/{id}/move Move an LXC container's rootfs to another storage pool.
Arguments
{ "type": "object", "properties": { "storage_id": { "type": "string", "description": "Target storage pool to move the container rootfs into." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "storage_id" ], "additionalProperties": false}GET /api/v1/lxc/{id}/docs Get the documentation stored for an LXC container.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PUT /api/v1/lxc/{id}/docs Set or append to an LXC container's documentation.
Arguments
{ "type": "object", "properties": { "content": { "type": "string", "description": "Markdown documentation content. Replaces the docs when append_entry is false; the text of one new entry when append_entry is true." }, "append_entry": { "type": "boolean", "description": "Append content as a timestamped entry below the existing docs instead of replacing them." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "content" ], "additionalProperties": false}Files and folders
Section titled “Files and folders”12 endpoints · scopes files.manage, files.read
GET /api/v1/folders List managed folders.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/folders Create a folder in a storage pool.
Arguments
{ "type": "object", "properties": { "storage_id": { "type": "string", "description": "Storage pool ID." }, "name": { "type": "string", "description": "Folder name." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "storage_id", "name" ], "additionalProperties": false}PATCH /api/v1/folders/{folder_id} Rename a folder.
Arguments
{ "type": "object", "properties": { "new_name": { "type": "string", "description": "New folder name." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "new_name" ], "additionalProperties": false}DELETE /api/v1/folders/{folder_id} Delete a folder.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/folders/{folder_id}/contents List the entries at a path.
Arguments
{ "type": "object", "properties": { "sub_path": { "type": "string", "description": "Optional sub-path inside the folder." }, "target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Target to list: {kind: folder | connection, id, path}. Overrides the folder_id and sub_path pair when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/folders/{folder_id}/subfolders Create a subfolder.
Arguments
{ "type": "object", "properties": { "sub_path": { "type": "string", "description": "Sub-path within the folder." }, "name": { "type": "string", "description": "Subfolder name." }, "target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Parent to create in: {kind: folder | connection, id, path}. Overrides the folder_id and sub_path pair when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "name" ], "additionalProperties": false}POST /api/v1/folders/{folder_id}/subfolders/batch Create several subfolders at once.
Arguments
{ "type": "object", "properties": { "sub_path": { "type": "string", "description": "Sub-path within the folder." }, "names": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "Folder names to create." }, "target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Parent to create in: {kind: folder | connection, id, path}. Overrides the folder_id and sub_path pair when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "names" ], "additionalProperties": false}PATCH /api/v1/folders/{folder_id}/entries/{src_sub_path} Move or rename a file or folder.
Arguments
{ "type": "object", "properties": { "dst_sub_path": { "type": "string", "description": "Destination sub-path inside the folder." }, "src_target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Source {kind: folder | connection, id, path}. Pair with dst_target; overrides folder_id and the sub paths.", "required": [ "kind", "id" ], "additionalProperties": false }, "dst_target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Destination in the same folder or connection as src_target.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/folders/{src_folder_id}/entries/{src_sub_path}/copy Copy a file or folder.
Arguments
{ "type": "object", "properties": { "dst_folder_id": { "type": "string", "description": "Destination folder ID." }, "dst_sub_path": { "type": "string", "description": "Destination sub-path inside the folder." }, "src_target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Source {kind: folder | connection, id, path}. Overrides src_folder_id and src_sub_path when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "dst_target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Destination {kind: folder | connection, id, path}. Overrides dst_folder_id and dst_sub_path when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/folders/{folder_id}/entries/{sub_path} Delete a file or folder.
Arguments
{ "type": "object", "properties": { "target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Entry to delete: {kind: folder | connection, id, path}. Overrides the folder_id and sub_path pair when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/folders/{folder_id}/search Search files and folders by name.
Arguments
{ "type": "object", "properties": { "pattern": { "type": "string", "description": "Name pattern to match (substring, case-insensitive). Use * for glob-style wildcards." }, "sub_path": { "type": "string", "description": "Optional sub-path to start search from." }, "target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Where to search: {kind: folder | connection, id, path}. Overrides the folder_id and sub_path pair when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "pattern" ], "additionalProperties": false}POST /api/v1/folders/{folder_id}/entries/batch Move several files or folders at once.
Arguments
{ "type": "object", "properties": { "moves": { "type": [ "null", "array" ], "items": { "type": "object", "properties": { "src_sub_path": { "type": "string", "description": "Source sub-path inside the folder." }, "dst_sub_path": { "type": "string", "description": "Destination sub-path inside the folder." } }, "required": [ "src_sub_path", "dst_sub_path" ], "additionalProperties": false }, "description": "Array of source and destination path pairs, relative to the folder or connection root." }, "target": { "type": [ "null", "object" ], "properties": { "kind": { "type": "string", "description": "folder for a managed folder, connection for a connected location." }, "id": { "type": "string", "description": "Folder ID or connected location ID." }, "path": { "type": "string", "description": "Path inside it, relative to its root. Empty is the root." } }, "description": "Container the moves happen in: {kind: folder | connection, id}. Overrides folder_id when set.", "required": [ "kind", "id" ], "additionalProperties": false }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "moves" ], "additionalProperties": false}Connected storage
Section titled “Connected storage”7 endpoints · scopes connections.manage, connections.read
GET /api/v1/locations List connected network shares.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/locations Connect a network share and mount it.
Arguments
{ "type": "object", "properties": { "name": { "type": "string", "description": "Display name for the connected location." }, "type": { "type": "string", "description": "Connection type. Defaults to smb, the only type this server mounts today." }, "remote": { "type": "string", "description": "Share address, for example //nas.local/media or nas.local/media." }, "username": { "type": "string", "description": "Optional SMB username. Omit together with password for guest access." }, "password": { "type": "string", "description": "Optional SMB password. Stored in the secret store, never echoed back." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "name", "remote" ], "additionalProperties": false}POST /api/v1/locations/discover Discover SMB hosts on the network, or list one host's shares.
Arguments
{ "type": "object", "properties": { "host": { "type": "string", "description": "SMB host name or address. Omit to discover hosts on the local network; set it to list that host's shares." }, "ip": { "type": "string", "description": "Optional resolved IP for host, used when the name does not resolve." }, "username": { "type": "string", "description": "Optional SMB username for listing shares. Omit for guest access." }, "password": { "type": "string", "description": "Optional SMB password for listing shares. Used for the probe only, never stored or echoed." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/locations/{location_id} Get a connected location.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/locations/{location_id}/disconnect Unmount a connected location.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/locations/{location_id}/reconnect Mount a connected location again.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/locations/{location_id} Remove a connected location and its stored credentials.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}Reverse proxy
Section titled “Reverse proxy”22 endpoints · scopes proxy.manage, proxy.read
GET /api/v1/proxy/config Get the reverse proxy configuration.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PATCH /api/v1/proxy Enable or disable the reverse proxy.
Arguments
{ "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Whether the reverse proxy should be enabled." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "enabled" ], "additionalProperties": false}POST /api/v1/proxy/move Move the reverse proxy to another cluster node.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Peer to make the cluster proxy holder. Omit to take over the proxy on this node when the recorded holder is unreachable." } }, "additionalProperties": false}GET /api/v1/proxy/upstreams List targets the proxy can route to.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/proxy/providers List the DNS providers supported for public certificates.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/proxy/host-status Return reverse proxy host status.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PUT /api/v1/proxy/acme/credentials Store DNS provider credentials for public certificates.
Arguments
{ "type": "object", "properties": { "provider": { "type": "string", "description": "The DNS provider name (e.g. cloudflare)." }, "credentials": { "type": "object", "description": "The provider credential key/value pairs.", "additionalProperties": { "type": "string" } }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "provider", "credentials" ], "additionalProperties": false}PUT /api/v1/proxy/acme/config Set the ACME account email and directory URL.
Arguments
{ "type": "object", "properties": { "email": { "type": "string", "description": "The ACME account email." }, "dir_url": { "type": "string", "description": "The ACME directory URL. Empty uses the Let's Encrypt production directory." }, "dns_resolvers": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "Recursive resolvers the DNS-01 propagation precheck queries. Empty uses the public defaults (1.1.1.1, 8.8.8.8)." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "email" ], "additionalProperties": false}PUT /api/v1/proxy/vip Set the reverse proxy's floating addresses.
Arguments
{ "type": "object", "properties": { "vip": { "type": "string", "description": "The IPv4 floating address the proxy binds." }, "vip_iface": { "type": "string", "description": "The network interface the VIPs are bound to. Required when a vip is set." }, "vip_prefix": { "type": "integer", "description": "The IPv4 VIP prefix length (1-32)." }, "vip6": { "type": "string", "description": "The optional IPv6 floating address the proxy binds." }, "vip6_prefix": { "type": "integer", "description": "The IPv6 VIP prefix length (1-128)." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}PUT /api/v1/proxy/dns Set the DNS resolvers the built-in responder forwards to.
Arguments
{ "type": "object", "properties": { "dns_upstreams": { "type": [ "null", "array" ], "items": { "type": "string" }, "description": "The recursive resolvers the built-in DNS responder forwards non-zone queries to." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "dns_upstreams" ], "additionalProperties": false}PATCH /api/v1/proxy/http3 Turn HTTP/3 serving on or off.
Arguments
{ "type": "object", "properties": { "enabled": { "type": "boolean", "description": "Whether the proxy serves HTTP/3 (QUIC) in addition to h1/h2; false pins Caddy to h1/h2 (the default)." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "enabled" ], "additionalProperties": false}GET /api/v1/proxy/certs Get TLS certificate status per base domain.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/proxy/diagnostics Collect reverse proxy diagnostics from the cluster node holding the proxy.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/proxy/incidents List captured reverse proxy incident bundles.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/proxy/incidents/{incident_id} Get one captured incident bundle.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/proxy/domains Add a base domain the proxy serves.
Arguments
{ "type": "object", "properties": { "name": { "type": "string", "description": "Base domain the proxy serves (e.g. bitsmith.home.arpa)." }, "cert_source": { "type": "string", "description": "Certificate source for the domain: \"internal\" for the internal CA, or a DNS provider name (e.g. cloudflare) for a public ACME cert." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "name", "cert_source" ], "additionalProperties": false}PATCH /api/v1/proxy/domains/{domain} Rename a base domain or change its certificate source.
Arguments
{ "type": "object", "properties": { "new_name": { "type": "string", "description": "New base domain name." }, "cert_source": { "type": "string", "description": "Certificate source for the domain: \"internal\" or a DNS provider name (e.g. cloudflare)." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "new_name", "cert_source" ], "additionalProperties": false}DELETE /api/v1/proxy/domains/{domain} Remove a base domain.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/proxy/domains/{domain}/entries Map a subdomain to an upstream host and port.
Arguments
{ "type": "object", "properties": { "subdomain": { "type": "string", "description": "Subdomain of the proxy entry (the left-most label of the proxied hostname)." }, "host": { "type": "string", "description": "Upstream IP or hostname to forward to. Required when no target_id is set." }, "port": { "type": "integer", "description": "Upstream host port to forward to (1-65535)." }, "listen_port": { "type": "integer", "description": "VIP/listen port the entry serves on; 0/omitted = default 443. Two entries may share a subdomain only on different listen ports." }, "target_id": { "type": "string", "description": "Optional app, VM, or LXC target to link the entry to." }, "upstream_scheme": { "type": "string", "description": "Explicit upstream scheme. \"http\", \"https\", or empty (omit) to auto-detect from the port (443 -\u003e https, else http)." }, "tls_skip_verify": { "type": [ "null", "boolean" ], "description": "Optional. When omitted, legacy auto-detection applies (skips verify on port 443); when set, it is authoritative. Only emitted when the effective upstream scheme is https. Must be true/false/omitted." }, "header_up": { "type": "object", "description": "Optional. Map of upstream header overrides. Keys must be valid HTTP tokens (RFC 7230). Values are passed through as Caddyfile tokens, so Caddy placeholders like {host} or {remote_host} work at request time. Empty string values clear a header.", "additionalProperties": { "type": "string" } }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "subdomain", "port" ], "additionalProperties": false}PATCH /api/v1/proxy/domains/{domain}/entries/{subdomain} Update a reverse proxy entry.
Arguments
{ "type": "object", "properties": { "listen_port": { "type": "integer", "description": "Current VIP/listen port of the entry; 0/omitted = default 443." }, "new_domain": { "type": "string", "description": "New base domain (must be a configured domain); omitted keeps the current one." }, "new_subdomain": { "type": "string", "description": "New subdomain for the entry; omitted keeps the current one." }, "new_listen_port": { "type": "integer", "description": "New VIP/listen port the entry serves on; 0/omitted keeps the current one." }, "host": { "type": "string", "description": "Upstream IP or hostname to forward to. Required when no target_id is set." }, "port": { "type": "integer", "description": "Upstream host port to forward to (1-65535)." }, "target_id": { "type": "string", "description": "Optional app, VM, or LXC target to link the entry to." }, "upstream_scheme": { "type": "string", "description": "Explicit upstream scheme. \"http\", \"https\", or empty (omit) to auto-detect from the port (443 -\u003e https, else http)." }, "tls_skip_verify": { "type": [ "null", "boolean" ], "description": "Optional. When omitted, legacy auto-detection applies (skips verify on port 443); when set, it is authoritative. Only emitted when the effective upstream scheme is https. Must be true/false/omitted." }, "header_up": { "type": "object", "description": "Optional. Map of upstream header overrides. Keys must be valid HTTP tokens (RFC 7230). Values are passed through as Caddyfile tokens, so Caddy placeholders like {host} or {remote_host} work at request time. Empty string values clear a header.", "additionalProperties": { "type": "string" } }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "port" ], "additionalProperties": false}DELETE /api/v1/proxy/domains/{domain}/entries/{subdomain} Delete a reverse proxy entry.
Arguments
{ "type": "object", "properties": { "listen_port": { "type": "integer", "description": "VIP/listen port of the proxy entry to delete; 0/omitted = default 443." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/proxy/domains/{domain}/certs/renew Force a TLS certificate renewal for a base domain.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}Sandboxes
Section titled “Sandboxes”8 endpoints · scopes sandbox.manage, sandbox.read
GET /api/v1/sandboxes List this token's sandboxes.
Arguments
{ "type": "object", "properties": { "labels": { "type": "object", "description": "Only return sandboxes carrying every one of these label key/value pairs.", "additionalProperties": { "type": "string" } }, "include_destroyed": { "type": "boolean", "description": "Include destroyed sandboxes, which are tombstones and hidden by default." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/sandboxes Create a sandbox owned by this token.
Arguments
{ "type": "object", "properties": { "image_id": { "type": "string", "description": "ID of the VM image the sandbox boots from, such as debian-13-genericcloud-amd64." }, "name": { "type": "string", "description": "Name for the sandbox. A friendly two-word name when omitted." }, "seed_data": { "type": "string", "description": "Data written into the guest at /etc/bitsmith/seed before its first boot, for per-sandbox identity such as an enrollment token." }, "resources": { "type": [ "null", "object" ], "properties": { "cpu_cores": { "type": "integer", "description": "Virtual CPU cores. Host default applies when omitted.", "minimum": 0, "maximum": 4294967295 }, "memory_mb": { "type": "integer", "description": "Memory in MiB. Host default applies when omitted.", "minimum": 0, "maximum": 4294967295 }, "disk_gb": { "type": "integer", "description": "Disk size in GiB. Host default applies when omitted.", "minimum": 0, "maximum": 4294967295 } }, "description": "CPU, memory, and disk the sandbox is admitted with.", "additionalProperties": false }, "labels": { "type": "object", "description": "Arbitrary key/value labels stored with the sandbox and matchable by list_sandboxes.", "additionalProperties": { "type": "string" } }, "idempotency_key": { "type": "string", "description": "Replaying a create with this same key returns the sandbox the first call made instead of a twin." }, "autostart": { "type": "boolean", "description": "Start the sandbox again when the host boots. Off by default: a throwaway sandbox should not outlive a reboot; a client's long-lived machine should." }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "required": [ "image_id" ], "additionalProperties": false}GET /api/v1/sandboxes/images List images a sandbox can boot from.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}GET /api/v1/sandboxes/{id} Get one of this token's sandboxes.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/sandboxes/{id}/suspend Suspend a sandbox.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/sandboxes/{id}/resume Resume a suspended sandbox.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}DELETE /api/v1/sandboxes/{id} Destroy a sandbox.
Arguments
{ "type": "object", "properties": { "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}POST /api/v1/sandboxes/{id}/wait Wait until a sandbox is running.
Arguments
{ "type": "object", "properties": { "timeout_seconds": { "type": "integer", "description": "Maximum seconds to wait. Defaults to 120.", "minimum": 0, "maximum": 4294967295 }, "peer_id": { "type": "string", "description": "Optional. Run this tool on the paired server with this peer_id instead of on this server; discover ids with list_peers. Background tasks a forwarded call starts live on that server too, so pass the same peer_id to get_background_task." } }, "additionalProperties": false}