Screenshot API

Rate limits & quotas

Per-minute rate limits, concurrency caps, and monthly Billable Render Quota by Plan.

Limits apply per API Key (rate and concurrency) and per Account (monthly Quota). Your Plan is determined by your Account's subscription tier.

Plan tiers

PlanPer-minute limitConcurrent RendersMonthly Billable Renders
Free51100
Starter ($9/mo)3032,000
Pro ($29/mo)601010,000

Billable Render means a successful (2xx) Render that was not served from cache and was not an idempotency replay. Failed Renders and cache hits do not count toward monthly Quota.

Quota resets at the first second of each calendar month (UTC), regardless of when you subscribed.

Per-minute rate limit

Uses a fixed one-minute window (not sliding). When you exceed the cap, the API returns 429 rate_limit_exceeded.

At the start of each minute window you receive a fresh allocation. Note the documented boundary cliff: a burst straddling a minute boundary can briefly allow up to 2× your cap across two seconds.

Concurrency cap

Each API Key may have only N Renders in flight at once (see table above). Additional requests receive 429 concurrency_limit_exceeded.

Slots are released when a Render finishes (success or failure). Stale slots from crashed workers are evicted automatically after the Render wall-time budget plus a safety buffer (35 seconds).

There is no Retry-After on concurrency errors — retry when an in-flight Render completes.

Response headers

Successful responses and most post-authentication errors include limit counters:

HeaderDescription
X-RateLimit-LimitPer-minute cap for your Plan
X-RateLimit-RemainingRequests left in the current minute window
X-RateLimit-ResetUnix epoch seconds when the current minute window ends
X-Quota-LimitMonthly Billable Render cap for your Plan
X-Quota-RemainingBillable Renders remaining this calendar month
X-Quota-Resets-AtUnix epoch seconds of the next UTC month boundary
Retry-AfterSeconds until the minute window resets (only on 429 rate_limit_exceeded)

Render-specific headers on success:

HeaderDescription
X-Render-Cached"true" if served from cache, "false" for a fresh Render
X-Render-Billable"true" if this Render counts toward Quota, "false" for cache hits and idempotency replays
X-Idempotent-Replay"true" when the response is replayed from a prior Idempotency-Key claim

X-Concurrency-* headers are not emitted on API responses today. Concurrency state is enforced server-side; the dashboard may show live usage separately.

Quota exceeded

When monthly Quota is exhausted:

{
  "error": {
    "code": "quota_exceeded",
    "message": "Monthly Quota of 100 Billable Renders reached. Resets at 2026-06-01T00:00:00Z.",
    "request_id": "req_01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "quota_used": 100,
    "quota_limit": 100,
    "resets_at": "2026-06-01T00:00:00Z",
    "upgrade_url": "https://app.example.com/dashboard?upgrade=true"
  }
}

There is no metered overage — upgrade via the URL in upgrade_url or wait for the reset.

See Caching & idempotency for cases that do not consume Quota.