Rate limits
The /v1 API allows at least 67 requests per minute per organization. This is a guaranteed floor, not a hard global ceiling: enforcement happens per edge location and is eventually consistent, so a geographically distributed caller may sustain more before being limited.
The limit is shared across every /v1 endpoint — extract, parse, redact, fill, sign, pipelines, files, runs, templates, actions, and webhook management all draw from the same per-organization budget.
Scoped to your organization, not your key. Every organization API key in the same organization draws from one budget, and one organization exhausting it never affects another. Minting a second key does not buy more throughput.
What counts as one request
One HTTP request, one token — regardless of how much work it starts. A batch that fans out to 100 documents costs the same single token as a one-file call, which makes batching the cheapest way to stay under the limit at volume. Long-polling with ?wait= also costs one token no matter how long the call is held open, so waiting for a run is cheaper than polling it.
GET /v1/webhooks/jwks.json is the one exception: it is public, unauthenticated, and never rate limited, so key rotation can’t be locked out.
When you exceed it
You get 429 with the standard error envelope and a Retry-After header in seconds:
Nothing was started: a 429 never creates a run and is never billed, so replaying the identical request is safe.
How to retry
- Respect
Retry-Afterfirst. It is the authoritative wait in seconds — sleep at least that long before the next attempt. Don’t compute your own delay when the header is present. - Then back off exponentially on repeated
429s: 60 s, 120 s, 240 s, with jitter, so a fleet of workers doesn’t resynchronize into the next window together. - Cap your concurrency rather than retrying harder. A steady ~1 request per second per organization never hits the floor.
- Send an
Idempotency-Keyon writes so a retry that crosses with a slow success returns the original run instead of starting a second one. The one exception isPOST /v1/extract/batch, which ignores the header — one key cannot address N runs, so a retried batch fans out again. Track batches bymetadatainstead.
Retrying immediately on 429 — or in a tight loop without jitter — keeps you limited for longer. retryable: true means the same request can succeed later, not that it can succeed now.
Staying under the limit
- Batch instead of looping.
POST /v1/extract/batchturns 100 calls into one. - Use webhooks instead of polling. A terminal event costs you zero requests; polling a slow run costs one per check.
- Long-poll when you must poll.
GET /v1/runs/:id?wait=30holds one request open instead of spending 30. - Reuse file ids. Registering a document once and re-running against
{"id": …}avoids both re-parsing and extra calls.
Need a higher ceiling for a launch or a backfill? Talk to your CloudRaker contact with your expected peak — the floor above is what every organization gets without asking.