Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/trycua/cua/llms.txt

Use this file to discover all available pages before exploring further.

The Lume HTTP API is a REST server for managing macOS and Linux virtual machines programmatically. Any HTTP client — curl, Python, TypeScript, or your CI system — can call these endpoints. Documented against Lume 0.5.3.

Starting the server

lume serve              # Default port 7777
lume serve --port 8080  # Custom port

Base URL

http://localhost:7777
The Lume HTTP API has no authentication by default. It listens on localhost only. Exposing it on a public interface is not recommended without additional network-level controls.

VM Management

List all VMs

List all virtual machines managed by the local Lume instance. GET /lume/vms Query parameters:
storage
string
Filter results by named storage location.
curl "http://localhost:7777/lume/vms"
Response codes: 200 Success — 400 Bad request

Get a VM

Get detailed information about a specific virtual machine. GET /lume/vms/:name Path parameters:
name
string
required
Name of the virtual machine.
Query parameters:
storage
string
VM storage location to use.
curl "http://localhost:7777/lume/vms/my-vm"
Response codes: 200 Success — 400 VM not found or invalid request

Create a VM

Create a new virtual machine. POST /lume/vms Request body:
name
string
required
Name for the new virtual machine.
os
string
required
Operating system: macOS or linux.
cpu
integer
required
Number of CPU cores.
memory
string
required
Memory size, e.g. 8GB.
diskSize
string
required
Disk size, e.g. 50GB.
display
string
required
Display resolution, e.g. 1024x768.
ipsw
string
Path to IPSW file or 'latest' (macOS VMs only).
storage
string
VM storage location to use.
curl -X POST "http://localhost:7777/lume/vms" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-vm",
    "os": "macOS",
    "cpu": 4,
    "memory": "8GB",
    "diskSize": "100GB",
    "display": "1024x768"
  }'
Response codes: 200 Created — 400 Invalid request or creation failed

Update a VM

Update CPU, memory, disk size, or display resolution for a stopped VM. PATCH /lume/vms/:name Path parameters:
name
string
required
Name of the VM to update.
Request body (all optional):
cpu
integer
New CPU core count.
memory
string
New memory size, e.g. 16GB.
diskSize
string
New total disk size (increase only).
display
string
New display resolution.
storage
string
VM storage location.
noBackup
boolean
Skip the macOS rollback backup. Default: false.
keepBackup
boolean
Keep rollback files after success. Default: false.
dryRun
boolean
Validate resize plan without modifying the disk. Default: false.
curl -X PATCH "http://localhost:7777/lume/vms/my-vm" \
  -H "Content-Type: application/json" \
  -d '{"cpu": 8, "memory": "16GB"}'
Response codes: 200 Updated — 400 Invalid settings or update failed

Delete a VM

Delete a virtual machine and all associated files. DELETE /lume/vms/:name Path parameters:
name
string
required
Name of the VM to delete.
Query parameters:
storage
string
VM storage location.
curl -X DELETE "http://localhost:7777/lume/vms/my-vm"
Response codes: 200 Deleted — 400 Not found or deletion failed

Clone a VM

Create a copy of an existing virtual machine. POST /lume/vms/clone
name
string
required
Name of the source VM.
newName
string
required
Name for the cloned VM.
sourceLocation
string
Source VM storage location.
destLocation
string
Destination VM storage location.
curl -X POST "http://localhost:7777/lume/vms/clone" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-vm", "newName": "my-vm-clone"}'
Response codes: 200 Cloned — 400 Clone failed

Start a VM

Start (boot) a virtual machine. POST /lume/vms/:name/run
name
string
required
Name of the VM to start.
Request body (all optional):
noDisplay
boolean
Run without opening a display. Default: false.
sharedDirectories
array
Directories to share with the VM.
recoveryMode
boolean
Boot in macOS recovery mode. Default: false.
storage
string
VM storage location.
clipboard
boolean
Enable bidirectional clipboard sync via SSH. Default: false.
curl -X POST "http://localhost:7777/lume/vms/my-vm/run" \
  -H "Content-Type: application/json" \
  -d '{"noDisplay": true}'
Response codes: 202 Start initiated (async) — 400 Invalid request or VM not found

Stop a VM

Stop a running virtual machine. POST /lume/vms/:name/stop
name
string
required
Name of the VM to stop.
Request body (all optional):
storage
string
VM storage location.
curl -X POST "http://localhost:7777/lume/vms/my-vm/stop" \
  -H "Content-Type: application/json" \
  -d '{}'
Response codes: 200 Stopped — 400 Stop failed

Image Management

List cached images

List available VM images from the local cache. GET /lume/images
organization
string
default:"trycua"
Organization to list images for.
curl "http://localhost:7777/lume/images"
Response codes: 200 Success — 400 Failed to list images

Get IPSW URL

Get the latest macOS restore image (IPSW) URL for the current hardware. GET /lume/ipsw
curl "http://localhost:7777/lume/ipsw"
Response codes: 200 Success — 400 Failed to get IPSW URL

Pull an image

Pull a VM image from an OCI-compatible container registry. POST /lume/pull
image
string
required
Image reference in name:tag format.
name
string
Name for the resulting VM.
registry
string
default:"ghcr.io"
Container registry URL.
organization
string
default:"trycua"
Organization to pull from.
storage
string
VM storage location.
curl -X POST "http://localhost:7777/lume/pull" \
  -H "Content-Type: application/json" \
  -d '{"image": "macos-tahoe-vanilla:latest"}'
Response codes: 200 Pulled — 400 Pull failed

Push an image

Push a local VM image to a container registry. POST /lume/vms/push
name
string
required
Name of the local VM to push.
imageName
string
required
Base name for the image in the registry.
tags
array
required
List of tags to push, e.g. ["latest", "v1.0"].
registry
string
default:"ghcr.io"
Container registry URL.
organization
string
default:"trycua"
Registry organization.
storage
string
VM storage location.
chunkSizeMb
integer
default:"512"
Upload chunk size in MB.
Response codes: 202 Push initiated (async) — 400 Invalid request

Prune cached images

Remove cached images to free up disk space. POST /lume/prune
curl -X POST "http://localhost:7777/lume/prune"
Response codes: 200 Pruned — 400 Prune failed

Configuration

Get configuration

Get current Lume configuration. GET /lume/config
curl "http://localhost:7777/lume/config"
Response codes: 200 Success — 400 Failed to get config

Update configuration

Update Lume configuration settings. POST /lume/config
homeDirectory
string
VM home directory path.
cacheDirectory
string
Cache directory path.
cachingEnabled
boolean
Enable or disable image caching.
Response codes: 200 Updated — 400 Invalid request

Storage Locations

List storage locations

GET /lume/config/locations Response codes: 200 Success — 400 Failed

Add a storage location

POST /lume/config/locations
name
string
required
Storage location name.
path
string
required
Path to the storage directory.
Response codes: 200 Added — 400 Already exists or invalid

Remove a storage location

DELETE /lume/config/locations/:name
name
string
required
Name of the storage location to remove.
Response codes: 200 Removed — 400 Not found or cannot remove

Set default storage location

POST /lume/config/locations/default/:name
name
string
required
Name of the location to set as default.
Response codes: 200 Set — 400 Not found

Logs

Retrieve server logs

GET /lume/logs
type
string
default:"all"
Log type: info, error, or all.
lines
integer
Number of lines to return from the end of the log file.
curl "http://localhost:7777/lume/logs?type=error&lines=50"
Response codes: 200 Success — 400 Failed to read logs

Build docs developers (and LLMs) love