Errors & limits
Errors are JSON: {"error": "…"}, sometimes with extra fields. Launch responses:
| Status | error | Meaning | What to do |
|---|---|---|---|
400 | invalid_json | The body isn't a JSON object. | Fix the request. |
400 | proxy_required | The launch has no proxy. Every session requires one. | Add your proxy (formats). |
400 | The browser rejected a launch option — an unparseable proxy, an unknown Camoufox config property or an unsupported os. The message says which. | Fix the option; don't retry as is. | |
401 | missing_api_key / invalid_api_key | No key, or an unknown or revoked key. | Check x-api-key. |
402 | subscription_inactive | Your account has no active plan. | Check your plan in the dashboard. |
403 | engine_not_allowed | Your plan doesn't include this browser. | Use another browser or upgrade. |
404 | not_found | Unknown endpoint, e.g. a misspelled browser. | Check the path. |
429 | rate_limited | Too many launches per second or minute for your plan. Includes rps_limit and rpm_limit. | Wait for Retry-After seconds. |
429 | threads_exceeded | This launch would exceed your threads. Includes threads, in_use and requested_weight. | Close a session or wait; Retry-After: 1. |
429 | daily_quota_exhausted | Shared threads: today's pool is used up. Includes the budget and usage. | Retry-After counts down to midnight UTC. |
429 | hourly_quota_exhausted | Shared threads: the last 60 minutes used 25% of your daily pool. Includes the budget and usage. | Wait; the window rolls forward continuously. Retry-After: 60. |
500 | The browser failed to start, e.g. the proxy is unreachable or Camoufox couldn't look up the proxy's location. | Check the proxy, then retry. | |
503 | shared_capacity_full | Shared threads: the shared fleet is full right now. Dedicated threads are never refused for this. | Retry after Retry-After (5 s). |
503 | fleet_unavailable / starting_up / route_unavailable | The fleet is momentarily full. | Retry with backoff. |
503 | version_unavailable | No server has the requested version right now. Includes available, the majors you can pick. | Pick one from available. |
Connecting
A WebSocket connect can fail with 401/403 (wrong key — only the key that launched the session may connect), 404 (the session has ended, or the 60-second connect window passed), 409 (the session already has a connection) or 502 {"error":"upstream_unreachable"} (the server running the browser didn't answer — rare). After a 502, launch a new session rather than reconnecting to the same wsUrl; the failed session isn't billed.
Limits
- Threads — concurrent sessions, weighted by type (see Sessions & billing).
- Launch rate — per second and per minute, set by your plan. Only launches that reach the fleet count; refused launches don't.
- Daily pool — shared threads only: threads × browser-minutes per day, resetting at midnight UTC.
- Rolling hour — shared threads only: 25% of the daily pool in any 60 minutes.
- Session length — 24 h at most;
overall_timeoutis capped at it. - Connect window — 60 seconds from launch.