Machines¶
A machine is a real Firecracker microVM. (In the SDK, a sandbox is a machine used create-run-destroy.)
Base URL: https://api.sistemo.io · all requests require authentication.
The machine object¶
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"account_id": "123e4567-e89b-12d3-a456-4266141740ac",
"name": "my-sandbox",
"state": "running",
"vcpus": 1,
"memory_mb": 1024,
"rootfs_size_gb": 10,
"stack": "base",
"private_ip": "10.200.0.2",
"created_at": "2026-06-23T17:30:39Z",
"started_at": "2026-06-23T17:30:43Z"
}
state is one of pending, provisioning, running, stopped, error, destroyed.
| Field | Always present | Notes |
|---|---|---|
id · account_id | yes | UUIDs |
name | yes | "" if you did not set one |
state | yes | See above |
vcpus · memory_mb · rootfs_size_gb | yes | The machine shape |
stack | yes | The image it booted from |
created_at · updated_at | yes | RFC 3339 UTC |
started_at · stopped_at | no | Omitted until it has started / stopped |
last_seen_at | no | Last time the host confirmed it |
private_ip | no | Appears once the machine has an address |
metadata | no | Whatever you sent at create |
git_repo | no | Omitted unless set |
error_message | no | Why a machine is in error. Read this before deleting it |
Fields marked "no" are omitted entirely rather than sent as null, so test for presence, not for an empty value.
Placement is never in the response
Which host your machine runs on, and its address on our internal network, are not fields on this object and never will be. If you are looking for them to pin a machine somewhere, that is not something the API exposes.
List machines¶
Scope: read or full.
{
"machines": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "my-sandbox",
"state": "running",
"vcpus": 1,
"memory_mb": 1024,
"rootfs_size_gb": 10,
"stack": "base",
"created_at": "2026-06-23T17:30:39Z"
}
]
}
Create a machine¶
Scope: full. Blocks until the VM boots, then returns 201.
| Field | Type | Default | Notes |
|---|---|---|---|
name | string | "" | Optional label |
vcpus | int | 1 | |
memory_mb | int | 1024 | |
rootfs_size_gb | int | 10 | |
stack | string | base | See Images |
metadata | object | {} | Arbitrary key/values |
snapshot_id | string | — | Boot from a snapshot (placement pinned to that host) |
root_volume_id | string | — | Boot an existing detached root volume |
Optional header: Idempotency-Key: <unique> — retrying with the same key returns the existing machine instead of creating a duplicate.
curl -X POST https://api.sistemo.io/v1/machines \
-H "Authorization: Bearer $SISTEMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"my-sandbox","stack":"base","vcpus":1,"memory_mb":1024}'
Returns the machine object with state: "running".
Quota
Each plan limits machines, vCPU, memory and storage independently. Exceeding any one returns 403 quota_exceeded, and the message names which limit bound — free up that resource (stop or delete a machine, delete a volume) and retry. GET /v1/quotas shows your limits and current usage. See Errors.
Get a machine¶
Scope: read or full. Returns the machine object, or 404 if it doesn't exist / isn't yours.
Stop a machine¶
Scope: full. Soft stop — preserves the disk; billing drops to storage only.
Start a machine¶
Scope: full. Boots a stopped machine from its saved spec (IP + volumes restored).
Delete a machine¶
DELETE /v1/machines/{id}
DELETE /v1/machines/{id}?preserve_storage=true
DELETE /v1/machines/{id}?delete_snapshots=true
Scope: full. Destroys the machine. By default its disk is reclaimed; pass preserve_storage=true to keep the root volume as a detached disk. A kept disk keeps billing storage until you delete the volume.
If the machine has snapshots and delete_snapshots is not true, the API returns 409 and deletes nothing. Pass delete_snapshots=true to remove snapshots first, then the machine.
Only these two parameters, and only real booleans
Both flags default to destroying, so this endpoint refuses what it does not understand instead of ignoring it. Any other query parameter — say retain_root=true — is a 400 and nothing is deleted, because a caller reaching for the wrong name is asking to keep the disk. A non-boolean value such as ?preserve_storage=yes is a 400 for the same reason: it must never quietly mean false.
curl -X DELETE "https://api.sistemo.io/v1/machines/$ID" \
-H "Authorization: Bearer $SISTEMO_API_KEY"
Run a command¶
See Exec — POST /v1/machines/{id}/execs.