Screenshot API

Errors

Every API error code, when it happens, and how to fix it.

All errors use the same JSON envelope:

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Human-readable summary.",
    "request_id": "req_01ARZ3NDEKTSV4RRFFQ69G5FAV"
  }
}

Every response — success or error — includes X-Request-Id matching error.request_id. Quote this ID when contacting support.

Some codes include extra fields (shown below). Validation errors add field and issue.

Error code reference

StatusCodeWhen it happensHow to fix
400invalid_inputRequest body failed validation (out-of-bounds viewport, bad format, malformed URL shape, etc.)Read error.field and error.issue in the response. Fix the named field and retry.
401missing_api_keyNo Authorization headerAdd Authorization: Bearer shot_…. See Authentication.
401invalid_api_keyKey hash not found in the databaseCheck for typos. Create a new key if needed.
401revoked_api_keyKey was revoked from the dashboardCreate a new API Key and update your integration. Revocation propagates within ~60 seconds.
403url_not_allowedSSRF defense rejected the URL (private/loopback/link-local address, blocked scheme, or post-DNS resolution to a blocked range)Use a public http or https URL that resolves to a routable address. Do not target internal networks.
422idempotency_key_reusedSame Idempotency-Key header was previously used with a different request bodyReuse the key only when retrying the identical body, or generate a new key for a changed request. See Caching & idempotency.
422page_too_tallfull_page: true and the page exceeds 32,768 px tallDisable full-page capture, clip to a viewport, or target a shorter page. Response may include actual_height.
422render_failedTarget returned 5xx, JavaScript crash, or navigation failureVerify the URL loads in a normal browser. Retry later if the site is down. Response may include reason.
422selector_not_foundwait_for CSS selector never appeared within the timeoutFix the selector or increase delay. Response includes selector.
429rate_limit_exceededPer-minute request cap for your PlanSlow down or wait. Response includes retry_after, limit, and window ("1m"). Obey the Retry-After header.
429concurrency_limit_exceededToo many in-flight Renders for this API KeyWait for an existing Render to finish before starting another. Response includes limit.
429quota_exceededMonthly Billable Render Quota exhaustedUpgrade your Plan or wait until the calendar month resets (UTC). Response includes quota_used, quota_limit, resets_at, and upgrade_url.
500internal_errorUnhandled server error or deploy-time misconfigurationRetry with backoff. Quote request_id when escalating — the response intentionally omits internal details.
503render_timeoutRender exceeded the 30-second wall-time budgetSimplify the page, reduce wait_for / delay, or retry. Response includes timeout_ms (30000).
503browser_unavailableBrowserless (managed Playwright) is not reachableRetry later. If persistent, check service status on the operator side.

Example: validation error

{
  "error": {
    "code": "invalid_input",
    "message": "viewport.width must be between 320 and 3840",
    "request_id": "req_01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "field": "viewport.width",
    "issue": "must be between 320 and 3840"
  }
}

Example: rate limit

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "5 requests per minute. Retry in 27s.",
    "request_id": "req_01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "retry_after": 27,
    "limit": 5,
    "window": "1m"
  }
}

Failed Renders (4xx/5xx) do not consume monthly Quota. See Rate limits & quotas.