Burrowbox Docs

Warm pools

A warm pool keeps machines booted and waiting, so when a customer needs a desktop you hand one over instantly instead of waiting for a boot. Claiming a machine tags it for that customer; the pool refills itself in the background (within about a minute).

#The pool object

{
  "id": "pool_3fa91c", "name": "support-desk", "size": "tiny", "screen": "1440x900",
  "target": 3, "ready": 3, "warming": 0,
  "setup": [{ "type": "tool", "tool": "apps_install", "arguments": { "kind": "apt", "packages": ["gimp"] } }],
  "paused": false, "setupFailures": 0,
  "lastSetup": { "at": 1790797200000, "ok": true, "machineId": "7c1e40a2f9", "durationMs": 41200, "output": "### step 1/1 · tool apps_install · ok · 41s\n…" },
  "createdAt": 1790793600000
}

target is how many idle machines to keep (0–10). ready are set up and waiting; warming are booting or running the template.

#Templates

A pool can carry a template: setup steps every new pool machine runs before it counts as ready. Install your customer's apps, clone a repo, open your web app on its login page. Claiming a machine hands over a desktop that's already set up, with no install time.

Steps use the same format as scheduled job actions: shell, tool (any machine MCP tool) or http. Up to 10, run in order.

"setup": [
  { "type": "tool", "tool": "apps_install", "arguments": { "kind": "apt", "packages": ["gimp", "libreoffice"] } },
  { "type": "shell", "command": "pip install --user pandas && git clone https://github.com/acme/tools ~/tools", "timeoutSeconds": 900 },
  { "type": "tool", "tool": "browser_navigate", "arguments": { "url": "https://app.example.com/login" } }
]

In the dashboard, open Warm pools → Template. The simple form covers apt packages, a setup script and a page to open, and "Advanced" takes the raw JSON steps.

#Endpoints

Method Path
GET /api/pools List pools
POST /api/pools {"name": "support-desk", "size": "tiny", "screen": "1440x900", "target": 3, "browser": "light", "setup": [...]} — browser: "full" for WebGL
GET /api/pools/{id} One pool
PATCH /api/pools/{id} Change name, target, size, screen or setup (null removes the template). Lowering target destroys idle extras. Any update resumes a paused pool
DELETE /api/pools/{id} Delete the pool and destroy its idle machines. Claimed machines are kept
POST /api/pools/{id}/claim Take a machine (below)

#Claim a machine

POST /api/pools/{id}/claim

Body field
name Display name
externalId Your customer's id
labels e.g. {"plan": "pro"}
ttlMinutes, onExpire As for creating a machine
vpn {"type": "proxy", "country": "de"} — VPN, applied instantly
curl -X POST https://burrowbox.dev/api/pools/pool_3fa91c/claim \
  -H "Authorization: Bearer $BURROWBOX_KEY" -H "Content-Type: application/json" \
  -d '{"name": "acme", "externalId": "cus_8f2a", "ttlMinutes": 30}'

Returns the machine object with mcpToken and "fromPool": true (status 200), or "fromPool": false with status 201 when a new machine had to be booted.

A claimed machine is brand new: nothing from other customers is on it. Pool machines are never reused after being claimed.

#From an agent

Platform MCP tools: pools_list, pool_create, pool_update, pool_delete, pool_claim.