Skip to main content
The boxd CLI, the SDKs, and the console are all clients of one thing: the public gRPC API at boxd.sh:9443. If your language doesn’t have a boxd SDK yet, generate one from the proto file and talk to it directly.

Installation

There is nothing to install from boxd’s side. Point a gRPC client at the endpoint, and generate stubs from the proto if your toolchain wants them.

Endpoint

  • Transport: HTTP/2 cleartext (h2c). There is no TLS on this port, and auth is short-lived JWTs.
  • Reflection: gRPC server reflection (the v1 protocol) is enabled, so tools like grpcurl 1.9+ work without the proto file.
  • Service: boxd.api.v1.BoxdApi. Reflection also lists boxd.api.v1.DeviceBridge, the internal transport behind the client utilities, which is not part of the public surface.

The proto

The full service definition lives on its own page: Proto. Copy it into a local api.proto and generate stubs with protoc, buf, grpc_tools, or @grpc/proto-loader. You often don’t need the file at all. Server reflection is on, so the schema can be inferred straight from the endpoint, and grpcurl -plaintext boxd.sh:9443 describe boxd.api.v1.BoxdApi prints it on demand.

Authentication

Two steps: a long-lived API key is exchanged for a short-lived JWT, and the JWT rides as a bearer token on every gRPC call.

1. Create an API key

API keys are issued from the boxd console. Sign in at boxd.sh, open the API keys page, and create one. The raw key is shown once, so copy it immediately. The format is bxd_ followed by 43 base62 characters. You can also create them via the CLI once you’re logged in:

2. Exchange for a JWT

Send the API key to the exchange endpoint on the console host, over HTTPS:
The JWT from an API-key exchange lives for 1 hour, so re-exchange before expiry. The endpoint is rate-limited per source IP.

3. Send it on every gRPC call

Standard gRPC metadata. Most generated clients expose this as a per-call interceptor or call option.

What an API-key session can do

An API key is fenced to one org. A member key (the default) covers the machine, snapshot, checkpoint, disk, port, proxy, domain, and env/secret surface. An org key is a userless service credential that reaches only the org’s shared machines, and env/secret operations reject it too. A handful of RPCs additionally require a JWT from an interactive login (the browser or CLI device flow) and answer PERMISSION_DENIED to API-key sessions: CreateApiKey, ListApiKeys, DeleteApiKey, CreateToken, RevokeToken, LinkSshKey, CreateNetwork, ListNetworks, GetBilling, GetOrgBilling, and the checkout/portal calls. The practical consequence is that an API key can never mint more keys.

Commands

The full RPC surface is the service BoxdApi block in the proto: machines, snapshots, checkpoints, disks, ports, proxies, domains, env vars and secrets, organizations, tokens, and billing. What a given RPC expects is documented on its request message, and grpcurl describe dumps any of it on demand.

Hello world

Easiest way to verify auth and reachability, with no proto file needed since server reflection is on.
Install: brew install grpcurl or github.com/fullstorydev/grpcurl.

Errors

Standard gRPC status codes. The most common ones you’ll hit: The error message in Status.message() is human-readable and safe to surface to users.

Streaming RPCs

Two RPCs stream:
  • Exec is bidirectional. The first message must contain vm_id and command. Subsequent client messages with stdin=true pipe stdin, or window_change=true with cols/rows resize a PTY. Server messages carry data, with is_stderr set for stderr chunks on non-PTY execs (PTY-mode execs merge stderr into stdout at the kernel). The final server message has exit_code set. Closing the client’s send half signals stdin EOF to the subprocess.
  • UploadFileStream is client-streaming and lifts the 4 MiB single-message gRPC cap of UploadFile. The first UploadFileChunk carries vm_id, path, and total_size, and subsequent chunks carry bytes only. The server reads exactly total_size bytes and returns the confirmed byte count.