A machine for one task. Gone at its deadline.
Start a sandbox from the image an app of yours runs, run commands, read and write files, and let it go: by default, at its deadline Rytiv removes the machine and everything on its disk. Signed URLs by default, egress you decide, 100 at a time.
ry sandbox create app:web --ttl 30m
Sandboxes, in detail.
From your own image
app:<name> boots the image an app of yours runs right now; build:<id> boots a build of yours. Nothing else is inherited: no environment, no secrets. Pass what it needs in env.
Commands and files
Run a command and get exitCode, stdout and stderr, each cut at 1 MiB. Read and write files up to 64 MiB, list directories. A string runs through /bin/sh -c, an array without a shell.
Egress you decide
allow-all, deny-all (not even DNS), or an allowlist of up to 100 domains and 10 IPv4 ranges on ports 80 and 443. Fixed for the sandbox's lifetime.
Signed by default
The sandbox's URLs only answer requests that carry the access token from the create answer, in the x-rytiv-access header. Make it public if anyone with the URL may open it.
Ready when you say
Ready when the machine boots, or only when its port answers. The create answer carries createMs, the time from your request to the running machine.
Gone at the deadline
Ten seconds to a day. Extend it, or end it early. A sandbox can rest instead of ending, and pause and resume on request. Ended sandboxes stay listed for fourteen days with why they ended: expired, killed, failed, app-deleted or parent-deleted.
Create, run, extend, end.
From the CLI, your coding agent, or a few lines of fetch. The API is plain HTTP.
ry sandbox create app:web --ttl 30m \ --allow api.github.com --allow "*.npmjs.org" # egress allowlist ry sandbox exec sbx-1a2b3c4d5e6f -- npm test # exits with the command's code ry sandbox timeout sbx-1a2b3c4d5e6f 1h # new deadline: now plus 1h ry sandbox list --all ry sandbox destroy sbx-1a2b3c4d5e6f
curl -X POST https://api.rytiv.com/v1/sandboxes \
-H "Authorization: Bearer $RYTIV_TOKEN" \
-H "Content-Type: application/json" \
-d '{"template": "app:web", "ttlSeconds": 1800}'
# 201 when the machine runs: id, url, createMs, accessToken
curl -X POST https://api.rytiv.com/v1/sandboxes/sbx-1a2b3c4d5e6f/exec \
-H "Authorization: Bearer $RYTIV_TOKEN" \
-H "Content-Type: application/json" \
-d '{"cmd": ["npm", "test"], "timeoutMs": 600000}'
# exitCode, signal, timedOut, durationMs, stdout, stderr
curl -X DELETE https://api.rytiv.com/v1/sandboxes/sbx-1a2b3c4d5e6f \
-H "Authorization: Bearer $RYTIV_TOKEN" # once: add Rytiv to Claude Code
claude mcp add --transport http rytiv https://api.rytiv.com/v1/mcp --header "Authorization: Bearer <your key>"
> Run the tests in a clean sandbox from the image of web.
sandbox_create {"template": "app:web", "ttlSeconds": 1800}
sandbox_exec {"id": "sbx-1a2b3c4d5e6f", "cmd": ["npm", "test"]}
sandbox_delete {"id": "sbx-1a2b3c4d5e6f"} The bounds, as the platform enforces them.
Limits
- Lifetime
- 10 to 86400 s, default 300
- Memory, vCPUs
- 128 to 16384 MB, 1 to 16; default 512 MB, 1
- Running at once
- 100 per organization
- Command timeout
- API 1 to 600 s, CLI up to 290 s; default 60
- Output, stdin
- 1 MiB each
- One file
- 64 MiB
- Environment
- up to 128 variables
- Ended sandboxes listed
- 14 days
Every bound is on Limits and quotas. A request outside them answers 400 with bad-request and names the field.
Errors you will meet
| 404 | template-not-foundNo such app or build in your organization |
| 409 | template-not-runnableThe build is a static site, or the app runs no machine |
| 409 | sandbox-endedThe sandbox has ended |
| 409 | sandbox-startingThe sandbox is not running yet |
| 429 | too-many-sandboxesThe organization runs 100 already |
Every error is JSON with a sentence and a stable code. Branch on code. See the error catalog.
A default sandbox, 512 MB, alive for 30 minutes: €0.0019 of memory, plus CPU only while it computes. A paused sandbox pays €0.08 per GB-month for what it stores, first 5 GB per team free.
For businesses and freelancers. All prices excluding VAT. Prepaid credit in euros, no plans, no seats. Introductory pricing until 31 January 2027. Pricing
What developers ask about Sandboxes.
Answers from the documentation. The Sandboxes guide has the rest.
What does a sandbox boot?
A template you already have: app:<name>, the image an app of yours runs right now (the app must run a machine), or build:<id>, a build that produced a machine image.
Does it get my app's secrets?
No. Nothing is inherited from the template: no environment variables and no secrets. Pass what the sandbox needs in env, up to 128 variables.
Can I extend the deadline?
Yes. POST /v1/sandboxes/:id/timeout sets the new deadline to now plus ttlSeconds. Calling it twice does not add up.
Who can open the sandbox's URL?
With the default access signed, only requests that carry the token from the create answer. The token is valid for the lifetime the sandbox was created with, at most 24 hours. With access public, anyone with the URL.
Does an idle sandbox sleep?
Yes. After idleSeconds, 300 by default, without a request or CPU load it sleeps with its memory. The next request or exec wakes it, and the deadline keeps running.
Sandbox or computer?
A sandbox is for one task and, by default, is removed with its disk at its deadline. A computer is for work whose files must still be there tomorrow, with a home disk and a desktop.
On the same API, the same bill.
Run your first sandbox.
Deploy an app, then start sandboxes from its image.
claude mcp add --transport http rytiv https://api.rytiv.com/v1/mcp --header "Authorization: Bearer <your key>"
For businesses and freelancers, from a solo developer to a team. Pricing