Create exec

Runs one command in a sandbox the caller holds and answers with its exit code, stdout and stderr.

POST /v1/sandbox/{id}/exec

Addresshttps://api.hanzo.ai/v1/sandbox/{id}/exec
MethodPOST
Operationpost_sandbox_by_id_exec
AuthAuthorization: Bearer $HANZO_API_KEY

Runs one command in a sandbox the caller holds and answers with its exit code, stdout and stderr.

Send argv — an argument vector cannot be word-split by accident — or command for a shell line, which is the only input here that ever reaches a shell. A non-zero exit is a SUCCESSFUL call carrying a failed command: the status is 200 and the exit code is in the answer, because "the command failed" and "the call failed" are different facts.

Request

7 fields, body application/json (required).

FieldInTypeRequiredDescription
idpathstringyesID is the sandbox to run in, from the path.
argvbodystring[]—Argv is the command as an argument vector, which is the honest form: it cannot be word-split by accident.
commandbodystring—Command is a shell line, for a caller that holds one.
dirbodystring—Dir is the working directory to run in.
idbodystring—ID is the sandbox to run in, from the path.
stdinbodystring—Stdin is fed to the command on its standard input.
timeoutSecbodyinteger (int64)—TimeoutSec bounds the run in seconds.

Response

StatusBodyMeaning
200sandbox.ExecResultok
defaultproblem-detailsrefused

200 body — 3 fields.

FieldInTypeAlwaysDescription
exitCodebodyinteger (int64)—ExitCode is the command's own exit status.
stderrbodystring—Stderr is everything it wrote to standard error.
stdoutbodystring—Stdout is everything the command wrote to standard output, as text.

Failure carries the platform error shape — see Errors.

Examples

hanzo sandbox exec <id>
import { Configuration, SandboxApi } from 'hanzoai';

const api = new SandboxApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postSandboxByIdExec({ id: 'id', argv: ["<argv>"], command: "<command>" });
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).post_sandbox_by_id_exec(id='id', argv=["<argv>"], command="<command>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.SandboxAPI.PostSandboxByIdExec(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::post_sandbox_by_id_exec(&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).postSandboxByIdExec();
curl -X POST https://api.hanzo.ai/v1/sandbox/<id>/exec \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "argv": [
         "<argv>"
       ],
       "command": "<command>"
     }'

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"
         }
       }
     }'

Sandbox API · All Hanzo APIs · Interactive reference

Was this page useful?