Rate limits + credits

Three layers — monthly quota, concurrent cap, and credit overflow.

Monthly quota

Each plan has a fixed number of requests per UTC month. The counter resets at the start of every month. Check current usage anytime via GET /v1/usage.

PlanRequests / month
Free1,000
Starter10,000
Growth100,000
Scale500,000
EnterpriseUnlimited

When you cross the cap, behaviour depends on the tier: Free is hard-capped (returns RATE_LIMITED 429); paid tiers fall through to credit overflow.

Concurrent requests

Independent of the monthly counter — limits how many requests can be in flight at the same instant per API key.

PlanConcurrent
Free2
Starter5
Growth20
Scale50
Enterprise100

Exceed it and you get CONCURRENT_LIMIT 429 with retry_after: 1. Slots free as fast as requests complete (typically < 1s). Implementation: atomic Redis INCR with 30s safety TTL — a crashed function never permanently consumes a slot.

Concurrency is per API key, not per IP. Multiple processes sharing the same key all share the cap. Issue separate keys to parallelize beyond your tier limit.

Credits (overflow)

Paid tiers run as soft caps. Once you cross the monthly quota, each extra request debits 1 credit from your balance. Out of plan + out of credits → 402 PAYMENT_REQUIRED. Buy credit packs from /read/billing#credits:

PackPriceCreditsPer creditBonus
Top-up S$5500$0.0100
Top-up M$202,200$0.009110% bonus
Top-up L$506,000$0.008320% bonus
Top-up XL$20028,000$0.007140% bonus
Free plan can receive credits but not buy them. Launch promos and goodwill grants apply to Free accounts; only paid tiers can purchase top-ups. Hits 402 stop the moment you upgrade or credits arrive.

Per-request response headers tell you which bucket got billed: X-Onto-Billed: plan (in quota) or X-Onto-Billed: credit (overflow). When credits are debited, X-Credits-Remaining shows the new balance.

Cache behavior

Successful /v1/read and /v1/read-and-score responses are cached for 1 hour per (URL, engine version). Cache hits are near-zero latency and still count against your monthly quota (one debit per request, hit or miss). Set "fresh": true in the body to bypass.

The cache key includes a server-side engine version, so when we ship cleaning-engine improvements, the next call gets a fresh extraction automatically.