Getting started
Rate limits
Request limits
- 600 requests per minute per account, counted per endpoint. Each endpoint has its own counter, so calls to one do not consume another’s allowance
- The counter is per account, not per key: every API key on an account draws from the same allowance
- Exception:
GET /v3/runs/{run_id}is 100 requests per minute. Polls are free, so poll every 10 seconds rather than in a tight loop, or passwebhook_urland skip polling. See Webhooks
Concurrent connections
10 concurrent connections per account on the v1 and v2 streaming endpoints (/v1/entity-resolution/stream, /v2/entity-resolution/stream). v3 has no streaming endpoint.
Async and polling requests have no concurrency limit; they are bounded by the per-endpoint request limit above.
Exceeding it returns a 429. Every response on these routes carries X-Concurrent-Quota-Limit and X-Concurrent-Quota-Remaining, not just the rejections.
Rate limit headers
Every API response includes rate limit information in the headers:
RateLimit-Limit: 600
RateLimit-Remaining: 599
RateLimit-Reset: 50
RateLimit-Limit: Total requests allowed per windowRateLimit-Remaining: Requests remaining in current windowRateLimit-Reset: Seconds until window resets
X-RateLimit-Limit-Minute and X-RateLimit-Remaining-Minute are also sent, carrying the same values. Prefer the RateLimit-* headers above.
Rate limit responses
A 429 comes from either a rate limit or a plan limit, and the two carry different bodies. Branch on the shape, not on the status code.
The per-minute rate limit and the concurrency limit share this body. The per-minute limit also carries a Retry-After header giving the seconds to wait:
{ "message": "API rate limit exceeded" }
A plan limit, meaning the free-plan allowance, a monthly request cap, or a monthly spend limit:
{ "error": "monthly_cap_reached", "message": "Monthly usage cap reached for this API." }
Higher limits
For production workloads needing more throughput, contact sales@savvyiq.ai.