Skip to the content
Docs Back to the site Dashboard

Reference

Errors

Every error has a stable code, a plain message and a retryable flag. Retry only when it says yes, and wait for the Retry-After header when there is one.

Refused before anything is captured

Nothing was tried, nothing was charged. The body is {"error": {...}}. With invalid_request, details names the parameters to fix.

CodeHTTPRetryWhat it means
invalid_request422noThe request is not valid. Check the parameters listed in "details".
unauthorized401noMissing or invalid API key. Send it in the "Authorization: Bearer" header.
account_blocked403noScreenshots are paused for this account. Contact support.
insufficient_credits402noNot enough credits for this screenshot.
rate_limited429yesToo many requests. Wait a moment and try again.
concurrency_limit429yesToo many screenshots running at once for this account. Wait for one to finish.
failure_budget_exceeded429noToo many failed screenshots today for this account. Failed screenshots are free, so their number per day is limited.
spend_limit_reached503yesScreenshots are temporarily paused. Try again later.
url_not_allowed422noThis URL cannot be captured. Only public http and https pages are allowed.
domain_blocked403noThis website cannot be captured with this service.
domain_busy429yesThis website is receiving too many screenshots right now. Try again in a minute.
country_not_available422noThis country is not available. See GET /v1/countries.
service_paused503yesScreenshots are temporarily paused. Try again later.
idempotency_conflict409noThis Idempotency-Key was already used with different parameters.
not_found404noNot found.

The screenshot was tried and failed

The page was opened, or we tried to. Most of the time the body is the screenshot itself, with status set to failed and its error filled in, so you keep its id.

option_unavailable can also be answered before anything is tried, for example when you ask for a country that is not open to your account. The body is then {"error": {...}}, as in the first table.

CodeHTTPRetryWhat it means
country_not_obtained502yesThe page could not be loaded from the requested country, so no screenshot was taken. You were not charged. Try again.
challenge_page502noThe website showed a bot check instead of the page. We do not bypass bot checks.
timeout504yesThe page took too long to load.
page_too_heavy502noThe page is too heavy to capture (over the size limit).
too_many_redirects502noThe page redirected too many times.
selector_not_found422noNo element matches "selector" on this page.
wait_for_timeout422noThe "wait_for" element never appeared.
navigation_failed502noThe page could not be opened. Check the address.
image_too_large502noThe screenshot would be too large. Use a smaller viewport or turn off full_page.
option_unavailable503noOne of the requested options is not available right now.
image_withheld502noThe page displays the network address used to load it, so the screenshot was not kept. You were not charged.
engine_busy503yesAll browsers are busy. Try again in a few seconds.
canceled409noThe screenshot was cancelled before it finished.
internal_error500yesSomething went wrong on our side. You were not charged.

What to do with an error

  1. Read error.code, not the message: the code is stable, the wording may change.
  2. If retryable is false, change the request before sending it again.
  3. If retryable is true, wait for Retry-After when it is there, then try again with the same Idempotency-Key.
  4. Stop after a few tries. See Retries and Idempotency-Key.

Through the MCP server

Your AI gets the same message as a plain sentence, followed by the code, for example (code: challenge_page, retryable: no). It can tell you what happened without reading JSON.