Reference

Errors

Every error_class, its HTTP status, and whether retrying helps.

A failed run returns ok: false and names what happened:

{
  "ok": false,
  "error_class": "timeout",
  "error_detail": "timed out after 15000ms",
  "retryable": true,
  "url": "https://example.com/orders",
  "elapsed_ms": 15002
}

Branch on error_class. It is a stable identifier. error_detail is a human-readable message meant for your logs and your on-call, and its wording can change — do not match on it.

retryable says whether the same request could succeed later. It is not a promise, it is a signal: retry the retryable ones with backoff, and surface the rest.

API errors

Raised before or around the scrape itself.

error_classHTTPWhat it means
auth_failed401Missing or wrong credential. Check you sent the right one — Authentication.
forbidden403Authenticated, but not allowed to do this.
bad_request400The body broke a rule: mutually exclusive fields, a malformed id, proxy_session_lifetime without proxy_session.
not_found404No such job, schedule, account or session.
unknown_provider400No proxy provider serves that type, country, or stacking combination.
insufficient_credits402Out of credits. Not retryable — top up first.
concurrency_limit_exceeded429At your plan’s in-flight cap. Retryable after a wait.
queue_timeout504No browser context came free in time, or no engine is live.
queue_unavailable503The control plane is unreachable.
engine_unavailable503No engine could take the request.
session_busy409That session_id is already in flight.
account_unavailable409The account has no healthy logged-in session.
account_busy409All of the account’s healthy sessions are in use.

Engine errors

Raised while fetching the page.

error_classHTTPRetryableWhat it means
timeout502yesThe target did not answer in time.
navigation_timeout502yesThe browser never reached a loaded state.
proxy_error502yesThe proxy hop failed.
network / network_error502yesConnection failed.
pool_exhausted429yesThe engine is at capacity.
browser_crash502yesThe browser died mid-page.
shutting_down503yesThe engine is draining. Retry lands elsewhere.
tls_error502noTLS negotiation failed.
redirect_error502noA redirect chain was invalid or too long.
decoding_error502noThe body could not be decoded.
unknown500noUnclassified. Tell us — this one is a bug.

Things that are not errors

A 404 from the target is a success. ok: true, status: 404. We reached the site and it told us the page is gone. Check ok and status separately, or you will treat working runs as failures.

blocked: true means the response looks like an anti-bot challenge rather than your page. ok is still true, block_reason says which rule matched, and the run is charged — we did the work. Usually the fix is proxy_type: "premium" or a different country, not a retry.

Retrying

Retry retryable classes with exponential backoff and a cap. Do not retry insufficient_credits, bad_request, auth_failed or the non-retryable engine errors — the same request will fail the same way.

Failed runs on our side cost nothing, so a retry loop is not a billing risk. Credits sets out exactly what is charged.