Sandboxes

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
sbx-1a2b3c4d5e6ftemplate app:web, signed URL create ready exec +1h 30m deadline exec: exitCode, stdout, stderr deadline: machine and disk removed 100 running at once per organization
A sandbox's life: created from a template, ready, commands run, the deadline extended once, then removed with its disk.
10 s to 24 hlifetime, extendable
100running at once per organization
10 minlongest command that answers in the request
8extra ports on their own URLs
What it does

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.

CLI, API, MCP

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"}
Limits, errors and price

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

404template-not-foundNo such app or build in your organization
409template-not-runnableThe build is a static site, or the app runs no machine
409sandbox-endedThe sandbox has ended
409sandbox-startingThe sandbox is not running yet
429too-many-sandboxesThe organization runs 100 already

Every error is JSON with a sentence and a stable code. Branch on code. See the error catalog.

€0.0076per GB-hourMemory
€0.035per vCPU-hourCPU
€0.08per GB-monthSnapshots and templates

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

Questions

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.

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