Limits & timeouts
Every ceiling the API enforces, on one page. These are the values the running server actually applies — the page is generated from the same constants. Last reviewed 2026-08-14.
Quota and throughput by plan
| Plan | Allowance per period | Rate limit | Period |
|---|---|---|---|
| Free | 250 renders | 2 req/s | Rolling 30 days from signup |
| Starter | 3,000 renders | 5 req/s | Your Stripe renewal date |
| Growth | 12,000 renders | 5 req/s | Your Stripe renewal date |
| Scale | 60,000 renders | 5 req/s | Your Stripe renewal date |
The rate limit is a token bucket, so short bursts above the steady rate are
fine. Exceed it and you get 429 with Retry-After; wait that long and the
request works. That is throughput, not quota — see the docs. Need more
throughput for a batch job? Ask: it is a per-key setting.
Running out
Every plan is a hard cap. When the allowance for the period
is gone the API returns 402 until the period rolls over or you upgrade. Rendering stops;
nothing is charged on top of the plan you chose. You cannot receive a bill larger than your plan,
and there is no way to spend money by accident.
Only real renders count. Cache hits, validation errors, auth failures,
rate-limited requests and failed navigations are all free — a request that did not produce a file
does not cost you one. Check X-Quota-Charged on any response to see whether it counted.
Per-request limits
| Limit | Value | What happens past it |
|---|---|---|
| Navigation timeout, default | 30 s | Send timeout (ms) to change it. |
| Navigation timeout, maximum | 60 s | Accepted range is 1,000–60,000 ms; values outside it are clamped. A page that exceeds the timeout returns 504 and is not billed. |
full_page capture height | 20,000 px | Taller pages are cut at that height and the response carries X-Full-Page-Truncated: 1. Narrow the width and capture in sections if you need the rest. |
| Request body | 1 MB | 413, refused before the body is parsed. Render parameters are a URL plus a few scalars, so ordinary calls are nowhere near this. |
url length | 4,000 characters | 400 BAD_REQUEST. |
| Response size | No fixed cap | The rendered file comes back in the response body. Its size follows from the page and your parameters. |
What is not limited
- No concurrency quota to buy. The rate limit above is the only throttle applied to your key — there is no separate "N parallel requests" allowance. The renderer itself works through a shared pool, so heavy parallel traffic queues rather than fails.
- No surprise charges. Past the cap the API stops rendering; it never keeps going and adds to your bill. The plan price is the whole price.
- No expiry on unused renders beyond the period itself: allowances reset, they do not roll over.
Free is 250 renders every 30 days with no card. Paid plans run 3,000 / 12,000 / 60,000 renders per billing period — see pricing.
Live service state: /status. Full reference with request and response fields: the docs. Error codes: /docs#errors.