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
| Activity | Weight (records) | Charged |
|---|---|---|
search_companies / search_many / find_similar | 1 | per company shown |
get_companies | 1 | per company returned |
search_people / get_people / get_contacts | 1 | per person shown, with or without a contact |
start_export | 1 | per exported row (company or person) |
count_companies / count_people / segment_companies | 0 | free |
list_filters / list_filter_values / get_page | 0 | free |
verify_email / find_email (single and bulk) | 0 | free |
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.
| Limit | Trial | Solo | Starter | Growth | Unlimited |
|---|---|---|---|---|---|
| Records / 5 hours | 200 | 1,600 | 20,000 | 120,000 | no limit |
| Records / 7 days | 1,000 | 8,000 | 100,000 | 600,000 | 4,000,000 |
| Requests / minute | 60 | 60 | 120 | 300 | 600 |
| Concurrent requests | 3 | 2 | 4 | 8 | 12 |
| Export size (rows) | 1,000 | 3,000 | 50,000 | 250,000 | 1,000,000 |
| Parallel jobs | 1 | 1 | 2 | 4 | 8 |
| Lists | 5 | 10 | 20 | 50 | 200 |
| Companies per list | 10,000 | 8,000 | 100,000 | 500,000 | 2,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.