Errors use a consistent JSON envelope:

json
{ "error": { "code": "invalid_params", "message": "Invalid device. Must be one of: iphone-16-pro, macbook-pro-16, ipad-pro-m4, browser-macos, browser-windows" }}

Status codes

400

Invalid request

do not retry blindly
Meaning

The API understood the request shape but rejected one or more parameters.

Common causes
  • Malformed JSON
  • Missing url
  • Invalid enum
  • Invalid project id
Retry guidance

Fix the request and send it again.

401

Invalid API key or signature

do not retry blindly
Meaning

The request did not include valid authentication.

Common causes
  • Missing Authorization header
  • Revoked key
  • Expired signed URL
Retry guidance

Refresh the key or mint a new signed URL.

402

Insufficient credits

do not retry blindly
Meaning

The render was not started because the account did not have enough credits.

Common causes
  • Capture cost is greater than credits remaining
Retry guidance

Add credits, upgrade the plan, or wait for renewal.

403

Forbidden scope

do not retry blindly
Meaning

Scoped keys can only call endpoints included in their scope list.

Common causes
  • API key is missing the required scope
Retry guidance

Use a key with the required scope.

404

Not found

do not retry blindly
Meaning

The requested resource was not found for the authenticated account.

Common causes
  • Job
  • project
  • render
  • or auth profile does not exist
Retry guidance

Check the identifier and account ownership.

429

Rate limited

retryable
Meaning

Rate limits are account-plan dependent and reset continuously.

Common causes
  • Too many requests in the current window
Retry guidance

Wait for the Retry-After value before retrying.

422

Capture failed

do not retry blindly
Meaning

The request was valid, but the capture or composition could not complete.

Common causes
  • Target page failed to load
  • Selector not found
  • Render could not complete
Retry guidance

Retry only after fixing the target page or capture parameters.

Retry strategy

FailureRetry?Guidance
429YesRespect Retry-After and use backoff.
Network interruptionYesRetry with jitter. Use idempotent request payloads.
400 validationNoFix parameters first.
401 / 403NoFix key, signature, or scope.
402NoAdd credits or reduce job cost.
Target page timeoutMaybeRetry once, then investigate page load conditions or use async.

Debug checklist

Debug checklist
Inspect resolved parameters

Add show_resolved_params: true while debugging composed requests.

Check target access

Confirm the target URL is public unless you are using an auth profile.

Prefer deterministic selectors

Use selector for deterministic element capture before trying natural-language element detection.

Queue slow pages

Use async: true for slow dashboards and long full-page captures.

Ask a question... ⌘I