Skip to main content

Rate limits

To keep the service fast for everyone, each endpoint accepts a maximum number of calls. Go over it and you get an HTTP 429 error.

EndpointWhat it doesLimit
/email-searchFind one email10 calls / second
/email-verificationVerify one email10 calls / second
/domain-searchScan one domain10 calls / second
/bulk-searchStart a bulk search1 call / second, up to 5,000 rows each
/bulk-single-searchs/readRead results30 calls / minute
/search-files/readBulk search progress15 calls / minute
/scrape/profile, /scrape/companyScrape one profile or company20 calls / second
/scrapeScrape in bulk20 calls / second, up to 50 rows each
/url-search/profile, /url-search/companyFind one profile or company URL20 calls / second
/url-searchFind URLs in bulk20 calls / second, up to 50 rows each
/find-people, /find-companiesSearch the lead database30 calls / second
/find-people/count, /find-companies/countCount leads10 calls / second
/reverse-email-lookupOne reverse lookup20 calls / second
/reverse-email-lookupsReverse lookups in bulk15 calls / second, up to 50 rows each

Limits may change.

Staying under the limits​

  • Reading results is the tightest limit (30 per minute). Wait at least 3 seconds between two reads, or better, use webhooks: they don't count against any limit.
  • Use bulk endpoints for lists. One bulk call replaces up to 5,000 single calls.
  • On a 429, slow down and retry. Wait 2 seconds, then 4, then 8…
Retry with backoff
async function callIcypeas(url, body, attempt = 0) {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: process.env.ICYPEAS_API_KEY },
body: JSON.stringify(body),
});
if (res.status === 429 && attempt < 5) {
await new Promise((r) => setTimeout(r, 2000 * 2 ** attempt));
return callIcypeas(url, body, attempt + 1);
}
return res.json();
}