Limits by Plan
There is no daily cap on any plan — usage is metered monthly in render units.
Understanding Each Limit
Sustained Rate
The sustained rate is the maximum number of render requests you can make in any 60-second window.POST /v1/render and POST /v1/templates/*/render share this bucket. Short bursts slightly above this rate may succeed, but requests that consistently exceed it will receive 429 Too Many Requests responses.
Concurrency
Concurrency controls how many render jobs can be in-flight simultaneously on your account (shared acrossPOST /v1/render and template routes). A request occupies a concurrency slot from the moment the server accepts it until the PDF response is returned. If you hit the concurrency ceiling, new requests block until a slot frees up or return 429 depending on your client configuration.
Validate has its own rate-limit bucket
POST /v1/render/validate is rate-limited per plan tier in its own bucket, kept independent from POST /v1/render. A burst of validation calls never spends your render throughput, and a burst of renders never throttles your validation — each can return 429 independently of the other. Validation still consumes no render units.
Max Input Size
The maximum size of the Markdown request body you can send in a single request. Requests that exceed this limit receive413 Payload Too Large.
Input size limits apply to the request body, not the final PDF file size. Images staged out of band and referenced with
blink://asset/<id> handles are fetched at render time and do not count toward this limit — only inline data: images and Markdown text do.What Counts Toward Your Usage
Only successful renders consume render units. A render is counted only when the API returns a valid PDF response (HTTP200) and its X-BlinkPDF-Billing header is counted — that includes both POST /v1/render and POST /v1/templates/*/render. Cache and idempotent replays on /v1/render (deduped-cache / deduped-idempotent) are not billed.
What Does NOT Count
The following never consume render units:GET /healthand any health-check endpointsPOST /v1/render/validate(though it has its own rate-limit bucket, above)- Font, theme, and style-target catalog listings
- Requests that return any error status (
400,401,402,405,413,422,429,5xx) - Retried requests that ultimately fail
Handling HTTP 429 Too Many Requests
When you exceed your rate limit, the API responds with:Retry Strategy
Use exponential backoff with jitter when retrying after a429. A simple recipe:
Monthly Spending Cap
On Pro and Business plans, you can set a configurable monthly spending cap in your account dashboard. Each paid plan also has a fixed hard cap at 2× its included volume. When your usage reaches the cap:- The API returns a clear
402error with the reasonspend_cap_reached - No further charges are incurred for that billing period
- The cap resets automatically at the start of your next billing cycle
The spending cap is optional. If you don’t set one, your account follows soft overage billing — you’re never cut off, but overage charges apply beyond your included quota.