All docs
On this page

Envelope

Every endpoint shares one response envelope:

CaseHTTPBody
Sync success200{ "success": true, "data": …, "credit_cost": 1 }
Async accepted202{ "success": true, "data": { "job_id": "…", "status_url": "…" } }
Error4xx/5xx{ "success": false, "error": { "code": "…", "message": "…" } }

Error codes

CodeHTTPMeaning / what to do
INVALID_REQUEST400Schema/validation failure — message names the field.
UNAUTHORIZED401Missing, malformed, or revoked key.
INSUFFICIENT_CREDITS402Not enough credits — call was not billed. Top up or reduce limit.
FORBIDDEN403e.g. playground key used externally, protected resource.
JOB_NOT_FOUND / NOT_FOUND404Job/monitor/key not found (or belongs to another team).
TARGET_TIMEOUT408Target page didn't render in time — not billed; retry with larger timeout/wait_for.
RATE_LIMITED429Per-plan rate cap — honor Retry-After, back off.
TARGET_BLOCKED403Target refused the request (bot protection) — we don't bypass it.
TARGET_UNREACHABLE502DNS/TLS/unreachable target.
PROVIDER_ERROR502Upstream capture provider failed — not billed; retry with backoff (honor Retry-After when present).
INTERNAL_ERROR500Our bug — not billed; retry with backoff.
Whether a call was billed is always visible via credit_cost in the envelope and in GET /v1/account/activity.