To keep the service fast for everyone, the API limits how many requests your account can send to each endpoint in a minute. Limits apply per account, not per key: two keys on the same account share them.
How the limits work
- Each endpoint has its own limit, counted over the last 60 seconds. Calls to one endpoint don't use up another's.
- For an endpoint with an id in its path, such as a job's status, each job or list has its own count.
- Endpoints that aren't in the table below have no per-minute limit of their own. Call them at a sensible pace all the same.
- The MCP server has one limit for all tools together: 60 requests a minute per account.
Limits per endpoint
Requests per minute, per account.
| Endpoint | Limit |
|---|---|
| Verification | |
POST /v1/verify/email | 200 |
POST /v1/bulk/jobs, POST /v1/bulk/jobs/from-list | 5 |
GET /v1/bulk/jobs | 30 |
GET /v1/bulk/jobs/{job_id}, GET /v1/bulk/jobs/{job_id}/rows | 60 |
GET /v1/bulk/jobs/{job_id}/export | 10 |
POST /v1/bulk/jobs/{job_id}/resolve-catchalls, POST /v1/bulk/jobs/{job_id}/resume-resolve | 5 |
| Email finder | |
POST /v1/finder/search | 200 |
POST /v1/finder/linkedin-search | 100 |
POST /v1/bulk-finder/jobs, POST /v1/bulk-finder/jobs/from-list | 5 |
GET /v1/bulk-finder/jobs | 30 |
GET /v1/bulk-finder/jobs/{job_id}, GET /v1/bulk-finder/jobs/{job_id}/rows | 60 |
GET /v1/bulk-finder/jobs/{job_id}/export | 10 |
POST /v1/bulk-finder/jobs/{job_id}/resume | 5 |
POST /v1/bulk-finder/jobs/{job_id}/rows/{row_id}/retry | 10 |
| Lead lists | |
POST /v1/leads/lists/{list_id}/leads | 30 |
POST /v1/leads/lists/{list_id}/find-emails | 5 |
POST /v1/leads/companies/resolve | 10 |
| Company lists | |
POST /v1/company-lists/{list_id}/companies | 30 |
POST /v1/company-lists/{list_id}/enrich | 5 |
POST /v1/company-lists/{list_id}/companies/{item_id}/enrich | 30 |
POST /v1/company-lists/{list_id}/find-decision-makers | 5 |
POST /v1/linkedin/search and /search/companies, /search/content, /search/events, /search/jobs, /search/groups | 10 |
GET /v1/linkedin/search/parameters | 30 |
POST /v1/linkedin/profile, POST /v1/linkedin/company-profile | 30 |
POST /v1/linkedin/post-engagement | 10 |
POST /v1/linkedin/event-engagement | 5 |
POST /v1/capture-jobs/ | 5 |
| AI and ICP | |
/v1/custom-columns (every method) | 30 |
POST /v1/enrichment-jobs/estimate | 60 |
POST /v1/enrichment-jobs/ | 20 |
GET /v1/icp | 30 |
POST /v1/persona/{persona_id}/icps | 30 |
POST /v1/persona/{persona_id}/icps/{icp_id}/test, POST /v1/persona/{persona_id}/icps/{icp_id}/score | 10 |
POST /v1/persona/{persona_id}/icps/{icp_id}/score-row | 30 |
POST /v1/icp/clear-scores | 5 |
| Domain intelligence | |
POST /v1/domain-intelligence/inspect | 20 |
POST /v1/domain-intelligence/inspect-batch, POST /v1/domain-intelligence/lookup | 10 |
GET /v1/domain-intelligence/history | 30 |
GET /v1/domain-intelligence/export | 10 |
| Account | |
/v1/settings/ai/... (every endpoint) | 10 |
GET /v1/usage/history, GET /v1/billing/status, GET /v1/billing/ledger | 30 |
/v1/api-keys (every method) | 10 |
The API reference describes each endpoint.
When you hit a limit
The API answers 429 with the code RATE_LIMITED, and the message names the limit. Nothing was run and nothing was charged for that request, so it's safe to send it again.
The response includes a Retry-After header with the number of seconds to wait: 60 for the REST API, 5 for the MCP server.
To handle it:
- Wait the number of seconds in
Retry-After. - If a response has no
Retry-After(for example a502,503or504), back off instead: wait 2 seconds, then 4, then 8, and so on, up to about a minute. - Retry the same request.
import time
import requests
def post_with_retry(url, payload, key, tries=5):
wait = 2
for _ in range(tries):
r = requests.post(
url,
json=payload,
headers={"Authorization": f"Bearer {key}"},
timeout=90,
)
if r.status_code not in (429, 502, 503, 504):
return r
retry_after = r.headers.get("Retry-After")
time.sleep(int(retry_after) if retry_after and retry_after.isdigit() else wait)
wait = min(wait * 2, 60)
return rThe same approach works for 502, 503 and 504, which mean a temporary problem on our side.
Stay under the limits
- Use bulk endpoints for lists. One bulk job of 10,000 addresses is one request to start, a few to poll and a few to read. Ten thousand single calls will hit the limit and take longer.
- Poll calmly. Every 5–10 seconds is plenty for a job's status. See Long-running jobs.
- Spread out single calls. If you call the single endpoints from a spreadsheet tool or automation, add a short pause between rows. In Clay, we recommend setting each filtrat column to 60 requests a minute. That's a recommendation for a column's throughput, well under the endpoint limits above, so retries and other tools have room: see Recommended column settings.
- Set a long enough timeout. Resolving a catch-all address can take up to a minute. A client that gives up after a few seconds and retries sends more requests, not fewer. Use a timeout of 90 seconds for verification and finding.
Rate limits are separate from LinkedIn limits. Searches and captures also respect the daily cap you set on each LinkedIn account and the limits LinkedIn itself applies. Those slow a capture down; they don't return 429. See Daily caps and pacing.
Need more?
If your use case needs a higher sustained rate, email support@filtrat.io with what you're building and roughly how many requests a minute you need.