Skip to Content
API & MCPRecords & rate limits

API & MCP

Records & rate limits

One allowance, two rolling windows — what each activity costs, and how fast you can call.

Your plan is one allowance, counted in records, with two rolling windows — the last 5 hours and the last 7 days — the way AI chat plans work. Every company or person we show you is one record, every time it is shown: a search returning 50 companies takes 50, the people at them one each, an export row one. Counting, filters, page text and e-mail find / verify are free.

What each activity costs

ActivityWeight (records)Charged
search_companies / search_many / find_similar1per company shown
get_companies1per company returned
search_people / get_people / get_contacts1per person shown, with or without a contact
start_export1per exported row (company or person)
count_companies / count_people / segment_companies0free
list_filters / list_filter_values / get_page0free
verify_email / find_email (single and bulk)0free

A page that would show more records than your allowance has left shows what fits and says so (warnings, records_withheld) — it never overdraws.

These are the current default weights. Your organization’s weights are always in get_usage → meter, and they may be fractional (a weight of 0.1 means ten calls cost one record). A call that fails costs nothing, and a retried call or job is never charged twice.

The two windows

Both windows roll: each charge ages out 5 hours or 7 days after it was made, so the allowance trickles back continuously instead of resetting at midnight. A call must fit in both windows.

  • The 5-hour window is a speed bump — it stops an agent stuck in a loop or a scraper, not a person doing their job.
  • The weekly window is the plan. Unlimited has no 5-hour window, only the weekly one.
LimitTrialSoloStarterGrowthUnlimited
Records / 5 hours2001,60020,000120,000no limit
Records / 7 days1,0008,000100,000600,0004,000,000
Requests / minute6060120300600
Concurrent requests324812
Export size (rows)1,0003,00050,000250,0001,000,000
Parallel jobs11248
Lists5102050200
Companies per list10,0008,000100,000500,0002,000,000

These are the defaults; your organization’s current values are always in get_usage, including any individual terms (listed as override layers). An export is capped at what is left in the tighter window, so it never overdraws.

At a limit

A call that does not fit gets quota_exceeded with the window, the numbers and the moment enough frees up — exact, computed from your own usage:

{ "error": { "code": "quota_exceeded", "message": "5-hour allowance used up (250/250 records) — enough frees up at 2026-09-23T17:42:10Z (in 38 min); the window is rolling, so it trickles back continuously", "retry_after": 2280, "details": { "window": "5h", "limit": 250, "used": 250, "left": 0, "needed": 1, "resets_at": "2026-09-23T17:42:10Z" }, "request_id": "req_…" } }

Over the per-minute rate or the concurrency limit you get rate_limited with retry_after in seconds. Over REST both come with a Retry-After header.

Agents: when a call returns quota_exceeded, tell the person which window and when it frees up, and keep going with work that costs nothing (searches and counts at weight 0) — don’t retry in a loop.