Kansoku
English日本語简体中文

Errors and limits

What each failure code means, which are worth retrying, and why a refusal from a source is reported as a refusal rather than as an empty result.

Shape

{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Invalid request body",
    "request_id": "req_…",
    "retryable": false,
    "details": { }
  }
}

retryable is the field to branch on. Nothing else in the error is a stable contract.

Codes

CodeMeaningRetry
VALIDATION_FAILEDThe request body does not match the schemaNo — fix the request
UNAUTHORIZEDMissing or unknown keyNo
QUOTA_EXCEEDEDA plan limit was reachedAfter the period resets
NO_CAPACITYNo browser worker freeYes, with backoff
NO_IP_AVAILABLENo healthy address for the country requestedYes — often means a region is still warming up
INVALID_URLBlocked by the SSRF gates, or malformedNo
BROWSER_FAILEDThe page did not loadYes, once
RATE_LIMITEDToo many requests, from you or toward that domainYes, after the interval

Refusals are not empty results

When a source answers 403 or 429, that is reported as an HTTP status on the response — not as a successful extraction with nothing in it. The distinction matters more than it looks: an empty result reads as "there is nothing there", which sends you to check your selectors, when the actual message was "slow down".

We record refusals with their date, stop, and do not put that source back on a schedule.

Politeness is enforced, not advisory

Requests toward one domain are paced regardless of how fast you send them. robots.txt is fetched and honoured, including crawl-delay. A disallowed path returns INVALID_URL rather than being fetched anyway.

There is no setting that turns this off, and support cannot turn it off for you. A source that refuses us once is a source nobody gets back, and the loss falls on every customer who needed it.

Last updated