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
| Code | HTTP Status | Description | How to Fix |
|---|---|---|---|
UNAUTHORIZED | 401 | Missing or invalid API key | Check your Authorization: Bearer header |
FORBIDDEN | 403 | API key revoked or account suspended | Generate a new key in the dashboard |
RATE_LIMITED | 429 | Per-minute rate limit exceeded | Wait and retry, or upgrade your plan |
QUOTA_EXCEEDED | 429 | Monthly quota exhausted | Upgrade your plan or wait for next billing cycle |
INVALID_REQUEST | 400 | Invalid request parameters | Check the request body against the API reference |
URL_REQUIRED | 400 | Neither url nor html provided | Include either a url or html field |
RENDER_TIMEOUT | 408 | Page took too long to load | Increase wait_timeout or use wait_for: "load" |
RENDER_FAILED | 502 | Browser failed to render the page | Check the URL is accessible and try again |
INTERNAL_ERROR | 500 | Unexpected server error | Retry the request; contact support if persistent |
Troubleshooting
”UNAUTHORIZED” errors
- Ensure the key starts with
sk_live_orsk_test_ - Use
Bearerprefix: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_timeoutif you don’t need the full page - Use
block_ads: trueto 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: 2000for pages with animations - Use
custom_cssto fix layout issues