LeadLeapData
Getting started

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

LimitValueScopeHow it works
Token bucket60 burst · 1/sec refillper accountSmooths spikes. A request consumes its endpoint cost (table below) from the bucket. Empty bucket → 429 with Retry-After in seconds.
Daily unit budget5,000 units/dayper accountDifferent endpoints cost different amounts. Adding more keys does NOT raise this - keys exist for attribution and optional sub-allocation, never for multiplying quota.
Concurrency8 in-flightper accountAcross 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.

EndpointCostMax calls / day at the unit cap
POST/v1/companies/search2 units5,000 calls
POST/v1/contacts/search2 units5,000 calls
GET/v1/companies/by-domain/{domain}10 units1,000 calls
POST/v1/companies/by-domain10 units1,000 calls (max 5 domains per call)
POST/v1/email/validate3 units3,333 calls
GET/v1/sources1 unit10,000 calls
POST/v1/find2 unitsDEPRECATED - removed after 2026-06-16
GET/health0 unitsUnlimited; 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:             2
  • X-RateLimit-Tokens-Remaining - current bucket level. Drops by X-Endpoint-Cost-Units on each call, refills at refill-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_after seconds for refill.
  • daily_units_exhausted - account-wide unit budget gone. Resets at UTC midnight; retry_after is 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/find calls/day. With limit=500 that's up to 2.5M rows/day per account.
  • Pure validation: 3,333 /v1/email/validate calls/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.