Sandbox

The ONE compute primitive: a sandbox is a gVisor pod that runs somebody else's code, and every lifetime is the same object.

Also for this capability: API · CLI · MCP · SDKs

The ONE compute primitive: a sandbox is a gVisor pod that runs somebody else's code, and every lifetime is the same object.

Base URLhttps://api.hanzo.ai
Operations23
AuthAuthorization: Bearer $HANZO_API_KEY

Specification

Specification pending — no HIP in hanzoai/hips declares capability: sandbox yet. What this capability serves is below, from the API document; what it is — the store it owns, how it meters, what it publishes — is written as a HIP under HIP-0139.

Four surfaces

SurfaceReaches this capability asCoverage
RESTsandbox at its own prefix23 operations
CLIhanzo sandbox …21 of 23 — the CLI pins the document on its own clock
SDKSandboxApi in every published client23 methods
MCPtool sandbox on https://api.hanzo.ai/v1/mcp17 operations, 7 under the document's own id — ask describe for the rest

Quickstart

export HANZO_API_KEY=sk-...   # console.hanzo.ai → API keys

Then the first call — a read that needs nothing but the key. GET /v1/sandbox, operation get_sandbox:

hanzo sandbox list
import { Configuration, SandboxApi } from 'hanzoai';

const api = new SandboxApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getSandbox();
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import SandboxApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = SandboxApi(client).get_sandbox()
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.SandboxAPI.GetSandbox(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, sandbox_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = sandbox_api::get_sandbox(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.SandboxApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new SandboxApi(client).getSandbox();
curl https://api.hanzo.ai/v1/sandbox \
  -H "Authorization: Bearer $HANZO_API_KEY"

MCP reaches sandbox through the sandbox tool, which names its 17 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_sandboxes"
         }
       }
     }'

Answers 200 with object — ok.

Endpoints

EndpointWhat it does
POST /v1/sandbox/{id}/execRuns one command in a sandbox the caller holds and answers with its exit code, stdout and stderr.
GET /v1/sandbox/{id}/fsRead a file, or list a directory
POST /v1/sandbox/{id}/fsWrite a file
POST /v1/sandbox/{id}/pauseStops the pod, keeps the row and the volume, and settles the tail: POST /v1/sandbox/:id/pause.
GET /v1/sandbox/{id}/portsLists the TCP ports something listens on in a sandbox the caller holds, each with the preview host that serves it — what the sandbox's Browser can open.
POST /v1/sandbox/{id}/previewOpens a port of a sandbox the caller holds in a browser.
POST /v1/sandbox/{id}/resumeGives a parked sandbox a pod again: POST /v1/sandbox/:id/resume.
POST /v1/sandbox/{id}/screen/ticketMints a short-lived grant to open the screen of a desktop sandbox.
GET /v1/sandbox/{id}/screen/wsThe screen, as a socket
GET /v1/sandbox/{id}/screenThe screen, as a page
POST /v1/sandbox/{id}/terminal/ticketMints a short-lived grant to open a terminal on a sandbox.
GET /v1/sandbox/{id}/terminal/wsThe terminal, as a socket
GET /v1/sandbox/{id}/terminalThe terminal, as a page
GET /v1/sandbox/{id}Returns one sandbox: its class, project, image, the runtime it was given, its status and when its lease ends.
DELETE /v1/sandbox/{id}Ends a sandbox and releases the compute behind it.
POST /v1/sandbox/endEnd a sandbox and release it
POST /v1/sandbox/leaseLease a sandbox — a real computer — or resume one you hold
POST /v1/sandbox/readRead a file from a sandbox you hold
POST /v1/sandbox/runRun a command in a sandbox you hold and read its output
POST /v1/sandbox/stopStop what a sandbox is running, and keep the sandbox
POST /v1/sandbox/writeWrite a file into a sandbox you hold
GET /v1/sandboxLists the sandboxes the caller holds, newest first.
POST /v1/sandboxLeases a sandbox — a real computer — for the caller's org.

All Hanzo APIs · Interactive reference

Was this page useful?