POST /v1/instances/{id}/exec runs a shell command inside the instance, straight from your backend. It is the escape hatch for anything the API does not wrap as its own call.
The command runs through sh -c as the image’s default user, on the same box the agent works on, so it sees the agent’s files, tools, and credentials.
Request
The shell command to run inside the instance. It is passed to
sh -c, so pipes, redirects, and && chains all work.Only
running instances accept commands. Exec against any other status returns 400 invalid_request (a deleted instance returns 404 not_found), and it does not wake a sleeping instance: start it, or hit one of its URLs, first. If the platform cannot reach the instance at all, you get 502 provisioning_failed.Response
A command that runs but exits nonzero is a normal result: you get200 with its exit_code, stdout, and stderr. Errors are reserved for the platform, not your command.
The command’s exit code. Nonzero is still a
200; read this to branch.Standard output, capped at 512 KB. See
truncated.Standard error, with its own separate 512 KB cap.
true when either stream spilled past its 512 KB cap. The middle of the output is cut and a truncation marker is left in its place.exit_code values 125, 126, and 127 may come from the container runtime rather than your command, for example 127 when the binary is not found. A command runs for up to 280 seconds, after which the call fails with 502 provisioning_failed; start longer jobs in the background (nohup ... &) and poll with a second exec.Example
Build on exec
Anything the API does not wrap as its own endpoint, you build onexec. For moving files, prefer the instance’s own files endpoints at https://{instanceId}.agent37.app — PUT /v1/files/content to upload, GET /v1/files/content to download — but a quick text read works over exec too. A “Download the report” button in your product can be one exec call that reads the file the agent wrote:
curl
curl
GET /v1/files/content streams a download of any size, with no 512 KB cap — or stage them at a URL your backend controls and curl them down from inside the instance.