Grail

Errors

Every error is a JSON body with a stable error code. Here's what to do with each.

HTTPcodewhat to do
400bad_requestMissing or malformed parameter (e.g. empty keyword). Fix the request; do not retry.
401unauthorizedMissing or invalid API key.
429quota_exceededPer-minute or monthly quota hit. Back off, or use /v1/scrape/jobs.
503server_busyOur pool is momentarily saturated. Retry with backoff.
503upstream_blockedeBay transiently challenged the request. Retry with backoff; it self-recovers.
503research_unavailableResearch aggregation could not complete for this query right now.

Retry policy

Retry 503 with exponential backoff (start ~1s, cap ~30s, add jitter). Do not tight-loop: for bulk work, enqueue via /v1/scrape/jobs and poll. Never retry 400 or 401 — they won't change on their own.