Skip to content

Core concepts

Status codes

Every HTTP status the API returns, what it means, and whether it's billed.

ScreenshotDude uses conventional HTTP status codes. Errors always have a JSON body:

{ "error": "Human-readable message" }

Success

Status Meaning Billed
200 OK Request succeeded. Body is the file (capture) or JSON. Yes (billable endpoints)
201 Created Used in request logs for async jobs that completed successfully. Never returned directly by an endpoint. Yes, on completion
202 Accepted Async request queued (is_async=true). Body: { "success": true, "job_id": "job_…", "status": "Queued" }. No

Client errors

Status Message examples Meaning
400 Bad Request url is required, Invalid URL, Unsupported format A parameter is missing or invalid, or the target is not allowed (e.g. private networks).
401 Unauthorized Invalid API Key Missing or unknown key.
401 Unauthorized Inactive API Key / Expired API Key Key is deactivated, archived or expired.
401 Unauthorized Rate limit exceeded: You've exceeded the per-second rate limit on your subscription Plan rate limit (also per-minute).
401 Unauthorized Rate limit exceeded for the API key: quota daily Per-key quota (total, daily, weekly, monthly).
402 Payment Required Payment required Subscription requires payment or is suspended.
402 Payment Required You have open invoices: … Unpaid invoices must be settled.
402 Payment Required Insufficient credits: 1 required, 0 available No balance and no overage available.
403 Forbidden This endpoint is not available on your plan. Upgrade to access it. Feature not on your plan (e.g. AI analysis on Free).
403 Forbidden IP temporarily blocked Too many failed authentication attempts from your IP.
404 Not Found Not Found Unknown endpoint or job, or the target page returned 404.
413 Payload Too Large Payload Too Large The result exceeds size limits (e.g. extremely tall full-page capture).

Rate limits return 401, not 429

ScreenshotDude returns 401 — not 429 — for both plan rate limits and per-key quotas. Distinguish them from authentication failures by the message, which always starts with Rate limit exceeded:

  • Rate limit exceeded: … — plan rate limit. Transient: retry after a short backoff.
  • Rate limit exceeded for the API key: quota … — per-key quota. Don't retry until the window frees up.

Server errors

Status Meaning
500 Internal Server Error Rendering failed, the target timed out, or an unexpected error occurred. Never billed. Retry with backoff, or use is_async=true for slow pages.

soft_fail

With soft_fail=true, every error is returned with HTTP 200 and the message in error:

{ "success": false, "error": "Invalid URL" }

This is useful for no-code tools that stop a workflow on non-2xx responses. Always check the error field when you use it.

Which requests are billed?

Only successful requests on billable endpoints. Every 4xx and 5xx is free — with one exception: the website crawler bills a 404 from the target site, because the crawl itself succeeded. See Credits & billing.