Sandboxes are paid from the same prepaid balance as servers. There's no subscription and no card on file: you top up, sandboxes draw from it, and when it's empty they stop. This page is the arithmetic behind that. For what a sandbox is, start with Sandboxes; for the code side, the SDK reference.
What you pay for
The price of a sandbox is the price of the vCPU and RAM its tariff reserves:
- $0.040 per vCPU-hour
- $0.013 per GiB of RAM per hour
| Tariff | vCPU / RAM / disk | Network | Per hour | Persistent, month max |
|---|---|---|---|---|
| micro | 0.25 / 512 MB / 3 GB | 50 Mbit/s | $0.0165 | $9.03 |
| small | 0.5 / 1 GB / 5 GB | 100 Mbit/s | $0.033 | $18.07 |
| standard | 1 / 2 GB / 10 GB | 200 Mbit/s | $0.066 | $36.14 |
| plus | 2 / 4 GB / 15 GB | 300 Mbit/s | $0.132 | $72.27 |
| pro | 4 / 8 GB / 20 GB | 400 Mbit/s | $0.264 | $144.54 |
| max | 8 / 16 GB / 40 GB | 500 Mbit/s | $0.528 | $289.08 |
You pay for the reservation, not for CPU actually burned. A sandbox that sits idle costs the same per second as one that's compiling. Outbound traffic isn't billed. Live prices, without a token: GET /sandboxes/tariffs.
Ephemeral: per second, 60 seconds minimum
An ephemeral sandbox is billed for every second it exists, from creation to deletion, with a minimum of 60 seconds per sandbox.
| What happened | Tariff | Billed time | Cost |
|---|---|---|---|
| Created, ran one script, deleted after 20 s | small | 60 s (minimum) | $0.00055 |
| Test suite, deleted after 10 min | small | 600 s | $0.0055 |
| Left alone, deleted by the 5-minute idle timeout after 2 min of work | standard | 420 s | $0.0077 |
| Background job for 3 hours | standard | 10,800 s | $0.198 |
The third row is the one people miss: the idle timeout counts. Delete the sandbox when you're done (the SDK's with block does it for you), or set idle_timeout low.
Persistent: per started hour, with a monthly cap
A persistent sandbox keeps its disk between sessions, for up to 30 days. Each started hour is billed in full: 61 minutes cost two hours. In return, a calendar month (UTC) never costs more than 730 hours minus 25%, which is the last column of the table above. A standard sandbox that runs all month costs $36.14, not $48.18.
While a persistent sandbox is paused (see below), it isn't billed.
When the balance runs out
- New sandboxes are refused with
402 insufficient_balance. - Ephemeral sandboxes already running finish as usual, at their idle timeout or TTL.
- Persistent sandboxes are paused after 24 hours if you haven't topped up. Pausing saves the sandbox to a snapshot on disk; a paused sandbox costs nothing.
- Top up and they resume on their own, usually within a minute. Commands sent to a paused sandbox get
409 sandbox_pausedmeanwhile. - Paused snapshots are kept for 14 days. After that the sandbox is deleted and its id returns
410 sandbox_deleted.
The balance never goes below zero.
Spending caps
By default there is no cap. You can set a daily and a monthly limit, in dollars, in the dashboard or over the API:
curl -X PUT https://api.eqvps.com/api/v1/eqvps/sandboxes/budget \
-H "Authorization: Bearer $EQVPS_API_KEY" -H "Content-Type: application/json" \
-d '{"daily_usd": 2, "monthly_usd": 20}'
Both fields are required; null means no limit. Days and months are counted in UTC. When a cap is reached, new sandboxes get 429 budget_exceeded (with limit_usd, spent_usd and resets_at in the response), running ephemeral sandboxes are deleted and persistent ones are paused with their disk kept. They resume when the period resets or you raise the cap. Unlike pauses for an empty balance, a budget pause isn't deleted after 14 days.
If an AI agent creates sandboxes on its own, set a cap. It's the difference between a bad night and a bad month.
The $1 trial
A new account gets $1 of sandbox credit the first time it creates a sandbox without enough balance. That's about 30 hours of small or 60 hours of micro. The credit lasts 14 days, works only for sandboxes, is spent before your own money and can't be withdrawn. One trial per account.
All quotas in one place
| Limit | Value |
|---|---|
| Sandboxes per account (running + paused) | 20 |
| Commands running at the same time, per account | 2 |
| One synchronous command | 55 s |
| Background tasks per sandbox | 8 |
| Output per stream, synchronous call | 1 MiB |
| File transfer through the API | 5 MB (larger files, up to 2 GB, through one-time links) |
| Ephemeral lifetime (TTL) | up to 24 h |
| Ephemeral idle timeout | 300 s by default, up to 3600 s |
| Persistent lifetime | up to 30 days |
| Environment variables | 64 per sandbox, 32 KB per value, 64 KB total |
| Sustained CPU | above 90% for more than 15 min counts as abuse |
The CPU rule exists because sandboxes share hardware. An ephemeral sandbox that breaks it is stopped; a persistent one is slowed down. Bursty work never comes near it. Hours of full-load computation belong on a VPS, where you rent the cores for the month.
Checking what you've spent
usage() in the SDK, or GET /sandboxes/{id}/usage, shows a sandbox's running seconds, CPU seconds used, outbound bytes, billed_usd and estimated_total_usd. Charges land on the balance in hourly batches, so the dashboard can lag the live figure by up to an hour. To try the numbers on a real sandbox, the sandbox page has everything you need to start.
Comments
No comments yet. Be the first.