Limits#
Default limits during the private beta. Contact support to raise account-level limits. Values marked target are service objectives, not guarantees.
Account#
| Limit | Free | Starter | Team | Enterprise |
|---|---|---|---|---|
Concurrent sandboxes (not paused or deleted) |
2 | 10 | 1,000+ | Custom |
Bulk fork (count per call) |
2 | 10 | 50 | 100 |
| Included usage | 20 h default, one-time |
$19 credit / month (expires) | $199 credit / month (expires) | Contract |
Paused sandboxes do not count toward the concurrency limit. Exceeding it returns 409 concurrency_limit_reached. Check GET /limits (concurrent_sandboxes.used, bulk_fork.max_count, can_create) before large batches.
Admission is atomic: parallel requests of one account cannot together go over the limit, and a bulk fork either creates all count sandboxes or none.
New accounts. A Free account that is not verified yet (no card, no GitHub verification) gets stricter defaults for its first 7 days: no bulk fork (count 1) and 30 starts per minute. GET /limits shows new_account.active and new_account.until.
Account restrictions. If an account breaks the acceptable use policy, its sandboxes can be throttled or have outbound ports blocked; new sandboxes and forks of that account get the same restrictions from the start. A suspended account gets 403 with details.reason = "account_suspended" (and details.suspended_at, details.contact) on every call except reads; its sandboxes are paused and the data is kept.
API rate limits#
| Policy | Limit | Applies to |
|---|---|---|
default |
6,000 requests / 60 s per API key (requests without a valid key: per client IP) | All endpoints |
starts |
300 / 60 s per account (30 for new unverified Free accounts) | POST /sandboxes, POST /sandboxes/{id}/resume, POST /sandboxes/{id}/fork |
Every response carries the current state in IETF draft headers:
RateLimit-Policy: "default";q=6000;w=60, "starts";q=300;w=60
RateLimit: "default";r=5987;t=42
When you exceed a limit you get 429 with "code": "rate_limited", "retryable": true and a Retry-After header (seconds). An open SSE stream or WebSocket counts as one request. Implicit resumes caused by wake on request do not count toward starts.
Sandboxes#
| Resource | Limit |
|---|---|
| Sizes | small 2 vCPU / 4 GB / 20 GB, default 4 vCPU / 8 GB / 50 GB, large 8 vCPU / 16 GB / 100 GB |
disk_gb |
20–1,000 GB (above the included disk is billed) |
auto_pause.idle_timeout_seconds |
60–86,400 s, default 300 |
ttl_seconds |
≥ 60 s, or null (no expiry, default) |
| Labels | 32 per sandbox; key up to 63 chars, value up to 255 |
env at create |
100 variables, 64 KiB total |
metadata |
16 KiB |
| Name | 120 characters |
| Create from template, p95 | < 500 ms (target) |
| Resume from pause, p95 | < 800 ms (target) |
| Fork with memory, p95 | < 2 s (target) |
Bulk fork (count per call) |
up to the account's limit (Free 2, Starter 10, Team 50, Enterprise 100; up to 500 on request), all or nothing; above it 403 with details.reason = "fork_count_limit" |
Nested virtualization (/dev/kvm), GPU |
Not available (roadmap) |
Exec#
| Resource | Limit |
|---|---|
| Concurrent commands per sandbox | at least 10 |
Sync timeout_seconds |
default 60, max 600 |
| Background commands | no time limit |
| Captured output in a sync response | 8 MiB per stream (truncated: true beyond) |
| SSE stream output | unlimited |
| Replay when attaching to a command | last 8 MiB per stream |
| Command history | 7 days |
| PTY idle timeout | default 1,800 s, max 86,400 s |
| PTY connect URL validity | 60 s until first connect |
Files#
| Resource | Limit |
|---|---|
Read / write through the API (/files/content) |
1 GiB per request |
| Multipart upload | 1 GiB per request |
| Signed upload / download URLs | 10 GiB per file; valid 60–3,600 s (default 900) |
| Directory listing page size | 100 entries per page |
Networking#
| Resource | Limit |
|---|---|
| Exposed ports per sandbox | 20 |
| Protocols | HTTP/1.1, HTTP/2, WebSocket over HTTPS. Raw TCP/UDP: Coming soon |
| Access token TTL (private ports) | 60–86,400 s, default 3,600 |
| SSH access TTL | 60 s – 7 days, default 3,600 s |
| Egress allowlist | Coming soon |
| Region | EU only (eu-de, eu-fi) |
Desktop#
| Resource | Limit |
|---|---|
| Templates | desktop or a template built with desktop: true |
| Minimum size | default |
| Resolution | 1920x1080 |
| Stream URL TTL | 60–86,400 s, default 600 |
| Screenshot latency, p95 | < 300 ms (target) |
| Input actions per request | 100 |
| GPU / WebRTC 60 fps | Not available (roadmap) |
Snapshots, templates, webhooks, keys#
| Resource | Limit |
|---|---|
| Free snapshot storage | 30 days per snapshot |
| Webhook endpoints | 10 per account, HTTPS on port 443 |
| Webhook delivery | respond within 10 s; up to 8 attempts over 24 h |
| Webhook delivery history | 30 days |
| API key lifetime | default 90 days, max 365 days, or no expiry |
| Idempotency keys | 255 characters, kept 24 h |