Screening calls count against your plan's monthly allowance and are also capped at 120 requests per minute per tenant (a fixed window shared by all of your keys and portal users). Use up the allowance and, once any prepaid credit is spent, your plan decides: either calls stop with a 402 or they go through and the overage is billed. Exceed the per-minute cap and you get a 429. Both refusals use the standard error envelope.
Allowances are plan-dependent and shown in the portal under Usage. Enterprise contracts set their own volume; talk to us if you need a different ceiling.
Both kinds of rejection use the same envelope as every other error, so one handler covers them. The 402 names the exhausted feature (screenings_monthly, prekyc_monthly ...); on a demo account it reads Demo query quota exhausted. instead. Branch on the code, not the message.
HTTP/1.1 429 Too Many Requests
{ "success": false, "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Too many requests. Please try again later." } }
HTTP/1.1 402 Payment Required
{ "success": false, "error": { "code": "QUOTA_EXCEEDED", "message": "Monthly quota for 'screenings_monthly' exhausted." } }A 429 carries a Retry-After header telling a well-behaved client exactly when the fixed window reopens; honour it. Fall back to exponential backoff with full jitter only when the header is absent. Do not retry a 402; it clears when the allowance renews, credit is added or the plan changes.
async function callWithRetry(fn, attempt = 0) {
const res = await fn();
if (res.status === 429 && attempt < 5) {
// The server says when the window reopens; honour it.
const retryAfter = Number(res.headers.get("Retry-After"));
const seconds = Number.isFinite(retryAfter) && retryAfter > 0
? retryAfter // wait exactly as told
: Math.random() * 2 ** attempt; // else exponential backoff, full jitter
await new Promise((r) => setTimeout(r, seconds * 1000));
return callWithRetry(fn, attempt + 1);
}
return res;
}Usage is reported per month in the portal. Alert yourself at 80 percent: past the allowance, depending on your plan, a busy onboarding day either ends in a 402 or arrives as an overage charge.
For files and back-book re-screens, use the asynchronous batch job endpoints instead of thousands of synchronous calls; the same units apply, with less overhead.
We use strictly necessary cookies to run on8, and, with your consent, optional cookies for analytics and marketing. Read our Cookie Policy.