Rate limits¶
Every key uses a 60-second window (fixed when Redis is active, the normal case; sliding only in the no-Redis fallback). The per-minute limit follows the key's own plan. When exceeded the API returns 429 Too Many Requests. On top of the per-minute limit, each plan has a monthly request quota (table below); once exhausted, the API also returns 429.
| Plan | Rpm | Calls/mo | Batch receivers |
|---|---|---|---|
| Free | 10 | 1,000 | — |
| Starter | 30 | 10,000 | 100 |
| Pro | 100 | 100,000 | 2,000 |
| Business | 300 | 1,000,000 | 5,000 |
| Enterprise | 1,000 | 10,000,000 | 10,000 |
| Ultra | 5,000 | 100,000,000 | 50,000 |
| Carrier (Tier-1) | per contract | per contract | per contract |
Carrier tier (Tier-1 / national operators). Quotas, throughput and SLA are sized per contract. Contract only, after a measured PoC. Talk to sales.
Response headers¶
X-RateLimit-Limit— current rpm ceilingX-RateLimit-Remaining— calls still available in the windowRetry-After— present on the monthly request, AI and coverage quota429s and on demo429s. The per-minute429and the PDF-quota429do not carry it
Demo keys¶
Additional hard cap of 6 rpm regardless of the nominal tier of the key.
Overage billing¶
When the server has OVERAGE_BILLING_ENABLED=true (off by default), paid teams with a stripe_customer_id on file keep being served past the monthly quota instead of returning 429 Too Many Requests. Each surplus unit is billed via a Stripe out-of-cycle invoice; no service interruption.
How to enable:
- Server: env
OVERAGE_BILLING_ENABLED=true(defaultfalse). - Team: must have a
stripe_customer_id(created automatically on first plan checkout). - Per-unit price (configurable via
STRIPE_OVERAGE_*_CENTS):
| Metric | Price per unit (BRL) |
|---|---|
requests |
R$ 0.01 |
pdfs |
R$ 0.25 |
coverage_predict |
R$ 0.10 |
ai |
R$ 0.05 |
Response signalling:
When a request was served in overage mode (above the soft quota), the response carries:
X-Overage-Billing: true
X-Quota-Used: 1001
X-Quota-Limit: 1000
Your SDK can use this header to surface a "this call will be billed" notice to the operator. When the team is not enrolled, the default 429 behaviour is preserved.
To opt a team out of overage, clear
stripe_customer_idvia the Admin portal orPATCH /teams/{id}(eligibility cache expires after 60 s).