Errors

Error Response Format

All errors return a consistent JSON structure:

{
  "success": false,
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Maximum 60 requests per minute on your plan.",
    "status": 429
  },
  "request_id": "req_abc123"
}

Error Codes

CodeHTTP StatusDescriptionHow to Fix
UNAUTHORIZED401Missing or invalid API keyCheck your Authorization: Bearer header
FORBIDDEN403API key revoked or account suspendedGenerate a new key in the dashboard
RATE_LIMITED429Per-minute rate limit exceededWait and retry, or upgrade your plan
QUOTA_EXCEEDED429Monthly quota exhaustedUpgrade your plan or wait for next billing cycle
INVALID_REQUEST400Invalid request parametersCheck the request body against the API reference
URL_REQUIRED400Neither url nor html providedInclude either a url or html field
RENDER_TIMEOUT408Page took too long to loadIncrease wait_timeout or use wait_for: "load"
RENDER_FAILED502Browser failed to render the pageCheck the URL is accessible and try again
INTERNAL_ERROR500Unexpected server errorRetry the request; contact support if persistent

Troubleshooting

”UNAUTHORIZED” errors

  • Ensure the key starts with sk_live_ or sk_test_
  • Use Bearer prefix: Authorization: Bearer sk_live_...
  • Check for trailing whitespace or newlines in the key

”RENDER_TIMEOUT” errors

  • Some pages load slowly — try wait_for: "load" instead of "networkidle"
  • Reduce wait_timeout if you don’t need the full page
  • Use block_ads: true to prevent slow ad scripts

”RATE_LIMITED” errors

  • Check your plan’s per-minute limit in the dashboard
  • Implement exponential backoff in your retry logic
  • Consider upgrading to a higher plan for more capacity

Empty or broken screenshots

  • Try wait_for: "networkidle" for JavaScript-heavy pages
  • Add delay_ms: 2000 for pages with animations
  • Use custom_css to fix layout issues