Guide
Rate limits & quotas
Two separate mechanisms: per-route rate limits (how fast you can call an endpoint) and fair-use quotas (how much sandbox time/concurrency your account can hold at once). Both are configured by whoever runs the control-plane — the numbers below are the shipped defaults.
Rate limits (per account, token-bucket)
| Bucket | Applies to | Default |
|---|---|---|
| sandbox_ops | /exec, /files* — already-running sandboxes | 120 / minute |
| sandbox_lifecycle | create/destroy — real K8s pod create/delete calls | 20 / minute |
| signup, login | per-IP, blunts brute-force/enumeration | see control-plane config |
Rate limits key on the authenticated account.id, not IP — accounts sharing an egress IP can't starve each other, and lifecycle limits are deliberately much lower than op limits since they trigger real cluster mutations, not just a request to an already-running pod.
Every rate-limited response carries X-RateLimit-Limit and X-RateLimit-Remaining headers on success, plus Retry-After on a 429.
Fair-use quotas (free tier defaults)
- 20 sandbox-hours / month — cumulative wall-clock time across all your sessions
- 2 concurrent sandboxes — active (non-destroyed) sessions at once
- 30 minutes / session — hard cap enforced by a background reaper, independent of any single request
POST /v1/sandboxes enforces the concurrent-sandbox cap and the monthly usage cap, in that order, before any pod is created — a 429 with code concurrent_sandbox_limit_reached or monthly_usage_limit_reached means neither a pod nor any billable time was consumed.
boxkite whoami
# usage: 2.1/20.0 sandbox-hours this month
# concurrent sandboxes: 1/2