GET /presets | {presets: [{id, name, gpu, vram_gib, ray_tracing, image, credits_per_minute, usd_per_minute, for, default}]} |
GET /gpus | GPUs you can lease: {gpus: [{gpu, vram_gib, ray_tracing, credits_per_minute, usd_per_minute, default}]} |
GET /images | {images: [{id, name, description, default, includes}]} |
POST / | Lease a machine. Body: preset (default render), name, gpu, image, idle_timeout (seconds, default 900, 30 to 604800), budget_usd, from_snapshot. Send Idempotency-Key. Returns the machine, 202. |
GET / | {machines, next_cursor}, newest first. Query: name, status (comma-separated), limit (default 50, max 200), cursor. |
GET /{id}?wait=N | The machine: {id, name, status, gpu, image, preset, created_at, ready_at, idle_timeout, cost: {credits, usd}, error, next}. wait holds up to N seconds (max 60) for it to become ready. |
POST /{id}/pause | Pause: stop GPU billing, keep the disk. |
POST /{id}/resume | Resume a paused machine (202). |
DELETE /{id} | Release: billing stops and the disk is deleted. Returns the final machine with its cost. |
POST /{id}/run | Body {command or argv, cwd, env, timeout, wait}. With wait: true: {job_id, status, exit_code, stdout, stderr, truncated, resumed, next} within about 60 s, else the running job (202). Without wait: the job (202). |
GET /jobs/{job}?wait=N | The job: {id, machine_id, status, exit_code, output_tail, started_at, ended_at, resumed, next}. |
GET /jobs/{job}/logs | {text, next_cursor, eof}. Query: cursor; follow=true streams plain text until the job ends. |
POST /jobs/{job}/cancel | Stop the job. |
POST /{id}/files/upload | Body {root, files: [{path, size, sha256, content_base64}]}. Each file comes back unchanged, written, or upload with an upload_url to PUT and an upload_id. |
POST /{id}/files/upload/complete | Body {root, files: [{path, sha256, upload_id}]}. Commits uploaded files; each comes back written or committing. |
POST /{id}/files/download | Body {root, paths: [...]}, files or folders. Each file: {path, size, sha256} plus content_base64 (small) or download_url (valid 2 hours). |
POST /{id}/ports | Body {port} → {port, url, expires_at}; url is https://<id>.run.voyager.computer/, reachable by anyone with the link. |
POST /{id}/snapshots | Optional body {name} → {id, status, created_at, next}. Lease from it with from_snapshot. |