Docs/Errors
Every error is a JSON body carrying statusCode, statusMessage (a message field mirrors it), and data with a stable machine-readable code and the call's requestId - branch on data.code, not the English message. Failed calls are never billed - retrying costs nothing.
Every response - success or error - also carries the same id in the X-Request-Id header. Include it when reporting a problem and we can find your exact call.
400invalid_requestThe url parameter is missing or not a valid URL, a format / framework / fields value is unknown, or the target resolves to a private or internal address (blocked).401invalid_api_keyThe API key is missing, malformed, invalid, or revoked.402billing_issue · render_requires_planbilling_issue: the key's subscription is past due, canceled, or inactive - update billing in the dashboard or create a new key. render_requires_plan: legacy, not returned since 2026-09-23 - render=true is available on every key, free included, since 2026-10-14.403target_blockedThe target site is blocking automated requests, usually bot protection refusing a plain HTTP request. The server already retries such a refusal in a real browser by itself at no charge (usage.autoRender on success), so a 403 that reaches you normally means the browser was refused too: when the message says so, or says the site blocks browser rendering (a known-blocked host, refused before any fetch and never charged), there is nothing to retry. Otherwise, one retry with render=true is worth it.406target_errorThe site's edge refused the plain request - publishers commonly serve this to datacenter IP ranges, and it does NOT mean the page is missing. A real browser usually gets through, and the server already retries it in one by itself at no charge (usage.autoRender on success), so a 406 that still reaches you means the browser was refused too.404not_foundThe target page doesn't exist - or, on /v1/code, the selector matched no element or the named section is not on the page (the message lists the sections that do exist).408target_timeoutThe target site took longer than 15 seconds to respond.422unprocessable_contentThe URL is a media file (image, video, audio), not a page - pass the page that shows it, or the matching asset endpoint returns the file itself. Also any URL that returns data instead of a page (JSON, plain text, an XML sitemap, a PDF). Also /v1/code when the selected element produced no renderable content - pick a different selector from sections.429rate_limited · quota_exceededPer-minute rate limit exceeded (rate_limited - the message says how many seconds until it resets), or your credit allowance is used up (quota_exceeded) - on free keys that is the monthly quota; on paid plans it is the quota plus the billed overage allowance. quota_exceeded also fires when the credits left are fewer than this one call costs: the refusal is immediate and nothing is charged, so an expensive endpoint never runs the extraction first and bills you for a result you cannot receive.500internal_errorThe extraction failed unexpectedly. Retrying is safe - failed calls are never billed.502target_errorThe target site responded with an error status of its own.503target_unreachable · render_unavailableThe target site is unreachable - down, or refusing connections. render_unavailable means render=true was requested but JS rendering is not available - retry without it.