Rate limits
Keep each account under 100 requests in any 10 seconds and 600 requests a minute, across all of its API keys. That is the budget the API is planned around, and we can start enforcing it at any time, so build your client to slow down as soon as it sees a 429.
A few endpoints already enforce limits of their own, because each call does real work: an AI model run, a database search or a purchase.
These endpoints have their own limits today
| Endpoint | Limit | Over the limit |
|---|---|---|
POST /copilot/plan | About 5 plans a minute and 250 a day per account, shared with the AI features in the app | 429 with a Retry-After header |
Lead Finder searches (POST /lead-finder/searches) | 20 searches a minute, plus a daily allowance of rows you can browse (2,000 a day, 250 on a trial) | 429 with Retry-After and retryAfterSeconds in the body |
Lead Finder imports (POST /lead-finder/imports) | Up to 25,000 people a day when you import the first results of a search, and 3 imports running at once | 429 |
Autopilot (POST /autopilot/runs) | One run waiting for approval at a time, and 5 new runs a day | 429 |
| Email verification on a trial | 100 addresses in all until the trial converts | 402 with trial_allowance_exceeded |
Days are UTC days.
Back off when you get a 429
- Read the
Retry-Afterheader when there is one. It is the number of seconds to wait. - When there isn't one, wait 1 second, then 2, then 4, and so on, up to about a minute.
- Send requests from one queue per account rather than in parallel bursts, and spread big jobs out over time.
Batch instead of looping
The cheapest request is the one you don't send:
POST /leadstakes up to 1,000 leads in one request. Never loop over leads one by one.POST /dfy/domains/checkchecks up to 100 domains in one request.POST /email-verification/jobsverifies a whole list as one job; poll the job, not each address.- Webhooks push replies, bounces and status changes to you, so you don't need to poll for them.
Questions about the API? Email support@emailchaser.com.