Rate limits
Three enforcement points: a token-bucket burst, a daily unit budget, and a concurrency cap. All scoped to your account, not your key - adding more keys does not multiply quota. Every authenticated response carries the headers you need to back off without guessing.
The three limits
| Limit | Value | Scope | How it works |
|---|---|---|---|
| Token bucket | 60 burst · 1/sec refill | per account | Smooths spikes. A request consumes its endpoint cost (table below) from the bucket. Empty bucket → 429 with Retry-After in seconds. |
| Daily unit budget | 5,000 units/day | per account | Different endpoints cost different amounts. Adding more keys does NOT raise this - keys exist for attribution and optional sub-allocation, never for multiplying quota. |
| Concurrency | 8 in-flight | per account | Across all keys. The 9th request 429s instantly with retry_after=1 - back off and retry. |
Unit cost per endpoint
Each call charges its endpoint cost against the daily unit budget. /v1/find costs more than /v1/sources because it fans out to many shards and merges/dedupes the results.
| Endpoint | Cost | Max calls / day at the unit cap |
|---|---|---|
POST/v1/companies/search | 2 units | 5,000 calls |
POST/v1/contacts/search | 2 units | 5,000 calls |
GET/v1/companies/by-domain/{domain} | 10 units | 1,000 calls |
POST/v1/companies/by-domain | 10 units | 1,000 calls (max 5 domains per call) |
POST/v1/email/validate | 3 units | 3,333 calls |
GET/v1/sources | 1 unit | 10,000 calls |
POST/v1/find | 2 units | DEPRECATED - removed after 2026-06-16 |
GET/health | 0 units | Unlimited; no auth |
For mixed traffic, work the math against units. Example: 1,000 find calls + 2,000 validate calls = 2,000 + 6,000 = 8,000 units, leaving 2,000 in the budget.
Headers on every response
Every authenticated response carries enough state to pace yourself without guessing. Read these on every response and back off proactively rather than reactively.
X-RateLimit-Burst: 60
X-RateLimit-Refill-Per-Sec: 1
X-RateLimit-Tokens-Remaining: 59
X-RateLimit-Daily-Units-Limit: 10000
X-RateLimit-Daily-Units-Used: 22
X-RateLimit-Concurrent-Limit: 8
X-RateLimit-Concurrent-Now: 1
X-Endpoint-Cost-Units: 2X-RateLimit-Tokens-Remaining- current bucket level. Drops byX-Endpoint-Cost-Unitson each call, refills atrefill-per-sec.X-RateLimit-Daily-Units-Used/Limit- your unit budget position for the day. Resets at UTC midnight.X-RateLimit-Concurrent-Now/Limit- in-flight requests across your account. Use this to size your own client-side concurrency.X-Endpoint-Cost-Units- what THIS specific call cost in units. Useful when the table above lags a pricing change.
When you exceed
429 with a Retry-After header in seconds. The body tells you which limit you hit so you can decide whether to wait, slow down, or rebalance.
HTTP 429 Too Many Requests
Retry-After: 4
{
"error": "rate_limited",
"detail": "Token bucket empty. Retry in 4 seconds.",
"reason": "minute_burst_exceeded",
"retry_after": 4
}- minute_burst_exceeded - token bucket empty. Wait
retry_afterseconds for refill. - daily_units_exhausted - account-wide unit budget gone. Resets at UTC midnight;
retry_afteris the seconds until reset. - concurrency_exceeded - 8 in-flight already.
retry_after=1; immediate retry usually fine after one in-flight call returns. - key_daily_units_exhausted - only fires if you set a per-key sub-allocation lower than your account cap. Account budget may still have room.
Throughput examples
- Pure search: 5,000
/v1/findcalls/day. Withlimit=500that's up to 2.5M rows/day per account. - Pure validation: 3,333
/v1/email/validatecalls/day before the unit budget runs out. - Sustained pace: at 60 burst + 1/sec refill, you can hold ~60 req/min steady, with a burst-of-60 in the first second of an idle bucket.
- Parallelism: 8 concurrent calls. A worker pool of 8 keeps the gateway saturated without ever 429ing on concurrency.
Need more. The numbers above are the developer-preview caps. Once self-serve billing lands, higher tiers auto-grant proportionally higher limits. Until then, write to the founder - bumps for legit use cases happen the same day.
Per-key sub-allocation. You can split your account-wide unit budget across keys by setting daily_unit_limit on individual keys. The sum can't exceed the account cap. Useful for splitting between dev / staging / prod without spinning up multiple accounts.
See Errors for the full 429 envelope and Response format for the per-response headers we set.