Reliability

How the API behaves under load

Rate limits, quotas, what every error code means and how your client should react to each one. Written for the engineer who has to make the integration survive a Monday morning backlog.

Talk to our technical team → — for integration questions, a security review or a volume estimate.

Limits, and which one you hit

Three separate limits govern a key. They fail differently on purpose, because the right client reaction to each one is different.

Requests per minute
Set per plan. Exceeding it returns 429 with limit_per_minute. Retry with exponential back-off — this one clears on its own within the minute.
Documents per month
Set per plan. Exhausting it returns 429 with a quota object giving limit, used and remaining. Do not retry. Alert instead: the ceiling does not move until the period rolls or someone raises it.
Billing period
A plan whose period has ended and not been renewed returns 402. Do not retry. This is a commercial state, not a capacity one — it clears when the renewal is recorded, and retrying will not bring it forward.
Plan scope
An endpoint your plan does not include returns 403 naming the scopes you do have. Never retry. This is a configuration error and will fail identically forever.
The distinction that matters: a client that treats every 4xx as retryable will hammer us for an hour over a 403 that was never going to succeed, and will still be doing it when your on-call gets paged. Branch on the error field, which is stable, rather than on the status code alone.

What every response tells you

Quota state comes back on every successful call, so your client can see a ceiling approaching rather than discovering it.

X-Quota-Used
Documents spent this period. On a subscription this is the shared pool, not a per-key counter, so it agrees with what the dashboard shows.
X-Quota-Remaining
What is left, or unlimited.
X-Masked-Count
Regions redacted. The redaction and extraction endpoints report their own equivalents — X-Redacted-Count, X-Extracted-Fields, X-Signals-Found.
X-Documents-*
On batch calls: submitted, masked, and how many found no number. A batch that "succeeded" with forty documents and eight no-number findings is eight documents you still have to handle.
A 200 is not proof of masking. If no number could be read, the original document is returned unchanged and X-Masked-Count is 0. Treat zero as a failure that needs review. A pipeline that branches only on the status code will file unmasked documents and report success while doing it — and nothing charges for a call that produced nothing, so your billing will not flag it either.

Throughput and latency

Processing is OCR-bound, so the honest answer depends on your documents rather than on a number we would like to print here.

We do not publish an uptime percentage we have not measured. Availability commitments and their remedies are agreed contractually on enterprise plans. If you need a number in a contract, that is the conversation to have — we would rather negotiate one we can meet than publish one that reads well.

Building a client that survives

Questions we get asked

What uptime do you commit to?

Availability commitments are agreed contractually on enterprise plans, with remedies. We do not publish a percentage on this page because we would rather commit to a number in a contract we have sized than advertise one.

What should my client do on a 429?

It depends which 429. If the error field is rate_limited, back off exponentially with jitter and retry — it clears within the minute. If it is quota_exceeded, do not retry: the ceiling will not move until the period rolls or somebody raises it, so alert a human instead.

What is a 402?

The plan's paid period has ended and has not been renewed. It is a commercial state rather than a capacity one, so retrying will not help. It clears when the renewal is recorded.

Do you have webhooks?

Not today. Every endpoint is synchronous: you send a document and the result comes back on the same call. For volume, the batch endpoints take many documents per request and return a ZIP with a per-document manifest. If asynchronous callbacks would change your architecture, tell us — it is a roadmap question and customer demand decides it.

Is there a sandbox?

There is a trial key with a small quota that calls the live service, so what you test is what you will run. There is no separate mock environment, deliberately: a sandbox that returns canned responses tells you nothing about how your documents actually OCR.

Do you publish SDKs?

Not as installable packages. We publish worked client code for Python, Node.js and Java — retries, error branching and batching included — because a single REST endpoint taking a multipart upload does not need a dependency, and an unmaintained SDK is worse than none.

Read next

Talk to us about your document volume

Tell us how many documents a month you process and what your peak looks like. We will size a plan, provision a key with a test quota, and answer a security questionnaire if you need one.