# 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](/acceptable-use.html), 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:

```http
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 |
