SavvyIQ

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 pass webhook_url and 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 window
  • RateLimit-Remaining: Requests remaining in current window
  • RateLimit-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.