Skip to content
PlatformErrors

Errors

Errors use the same envelope as success: success: false plus an error object with a stable machine code, a human message, optional details, and a request_id. Build retry logic against code, not the message text.

Error shape

error
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit of 200/min exceeded",
    "details": { "retry_after_ms": 41000 },
    "request_id": "req_7c0f1a2b"
  }
}

Error codes

HTTPCodeMeaningRetry?
400INVALID_PARAMSInvalid body — failed schema validation, or neither/both of url/html.No
401INVALID_API_KEYA supplied x-api-key is malformed, expired, or revoked.No
401INVALID_TOKENNo credentials at all (missing x-api-key) or an expired dashboard JWT.No
403FEATURE_NOT_AVAILABLEA parameter requires a higher plan.No
403ACCOUNT_SUSPENDEDThe account is suspended.No
404NOT_FOUNDUnknown job id or route.No
429QUOTA_EXCEEDEDOut of credits for the period.After top-up
429RATE_LIMIT_EXCEEDEDToo many requests/min or too many concurrent renders.After Retry-After
500INTERNAL_ERRORUnexpected server error.Yes, with backoff
502ENGINE_UNAVAILABLEThe render engine is unreachable.Yes, with backoff
502RENDER_FAILEDThe page failed to render (navigation/capture error).Sometimes
503SERVICE_UNAVAILABLEA dependency is temporarily down.Yes, with backoff
504TIMEOUTThe render exceeded its timeout.Yes — raise timeout or simplify

Failed renders are free

Any non-cache failure refunds the reserved credits automatically — RENDER_FAILED, TIMEOUT, and ENGINE_UNAVAILABLE never cost you. Only successful, non-cached renders are billed.

Agent-friendly

Codes are designed for autonomous recovery: retryable failures (5xx, rate limits) carry backoff hints in details, while client errors (4xx) are terminal and should not be retried without changing the request.