API

Rate limits & page sizes

How much you can pull per request, per minute, and per export — every number measured.

Every number here is measured against real data, not chosen to look good. Two scripts in the repo re-measure them and fail the build if a published limit stops being deliverable.

Reading leads

2,500 leadsMax per page on GET /api/v1/leads (default 50). Page with limit + offset; the response returns next_offset until you reach the end.
1,000 leadsMax per MCP tool call (default 25). Lower on purpose — MCP results are fed into a model's context window, so a huge page costs you tokens you can't use. Use export for volume.
120/minuteRequests per API key. Exceeding it returns 429; retry after the window.
8/minuteNew searches per account — searches call paid data providers, so they're metered separately from reads.

There is no single response that can carry 50,000 leads — ours or anyone’s. A serverless response is capped at 4.5 MB and a fully verified lead is about 1 KB, so past a few thousand rows the honest answer is pagination for reading and an export job for bulk.

Bulk export (POST /api/v1/exports) — writes a file or pushes to your CRM, so it isn’t bound by the response cap:

50,000 leadsPer CSV or XLSX export. Returns a download link, and the file is emailed to you.
25,000 leadsPer JSON export. Lower than CSV because JSON repeats every field name on every row — the same leads are roughly three times the bytes.
5,000 leadsPer Google Sheets export — one append request, which Sheets caps by payload size.
1,000 leadsPer Close or GoHighLevel export. Much lower, because CRMs take one API call per lead — this is a time limit, not a size limit. For a bigger push, export CSV and import the file.

If more leads match than the limit, the export still runs and the response sets truncated: true with the limit that applied. It will never quietly hand you part of a list and call it done.