Skip to content

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 ceiling
  • X-RateLimit-Remaining — calls still available in the window
  • Retry-After — present on the monthly request, AI and coverage quota 429s and on demo 429s. The per-minute 429 and the PDF-quota 429 do 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:

  1. Server: env OVERAGE_BILLING_ENABLED=true (default false).
  2. Team: must have a stripe_customer_id (created automatically on first plan checkout).
  3. 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_id via the Admin portal or PATCH /teams/{id} (eligibility cache expires after 60 s).