Skip to main content
Use the Contact Search API to find business contacts by role, company, and location — count how many match, preview a sample, then export the full list.

Choose the right method

Count before you do either. POST /v2/contact/count is immediate and tells you whether a search is worth running. Every response carries the standard X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. See Rate limits and error codes, and Credits & Plans for what searches and downloads cost on your plan.

Understand the data model

Every record is one person at one company. Person fields and company fields sit on the same record, so a single search can filter on both at once — no joining required. Column names end in a suffix that tells you what the field describes: COUNTRY_NAME_PER is where the person is. For where the company is, use the HEADQUARTERS_* fields — HEADQUARTERS_COUNTRY_NAME_ORG and friends. These are frequently different, so for “people in the United States”, use _PER.
COUNTRY_NAME_ORG is a location the company operates from, not necessarily the head office. For “companies headquartered in the United States”, use HEADQUARTERS_COUNTRY_NAME_ORG. See Company location vs headquarters.
Every field is documented in the Person-Organization-Insight data dictionary, including how each one is sourced and how often it’s populated.

Count matching contacts

Send a filter describing who you want. See Build a search filter for the full syntax.
Response:
The exact object reports which figures are precise. In the default fast mode everything except total is an estimate — display those with a ~. Send "mode": "exact" for precise figures at the cost of a slower response. Counting accounts rather than people? Company Search takes the same filter and returns one row per company.

Preview matching contacts

Return rows inline to check a search before committing to an export.
Response:
Omit columns to receive a default set. Results are unordered and there is no pagination — preview returns a sample, not page one of a list. For a complete list, use an export.

Understand the response fields

Export a full list

Exports run asynchronously. Submit the search, poll for status, then download the file.
1

Start the export

Returns an exportId immediately. Formats are csv, json, and parquet; compression is gz, zip, or none.
2

Poll for status

Poll until status is COMPLETED. Use a reasonable interval — every 5–10 seconds for smaller exports.
3

Download the results

A completed export includes a downloadUrl:
The link requires no API key and expires after one hour. Treat it as a credential — anyone holding it can download the file. Poll again to get a fresh link.

Track export status

Manage exports

Cancelling an export that has already finished returns its final status unchanged.

Analyze an audience

POST /v2/contact/insights returns aggregate statistics for a filter instead of rows. Send one section per request.
Response:

Match contacts you already have

POST /v2/contact/enrich looks up records for a list of email addresses. Send up to 10,000 addresses per request, counted after canonicalization and de-duplication — 12,000 addresses that resolve to 9,000 distinct ones is fine. Over the cap returns 400; split the list and merge the responses. See Limits.
Response:
Results are keyed by the address you submitted, so they join directly back to your own list. Addresses with no match are absent from matches; total minus matched is your miss count.

Browse the data

Response:
For what each field contains and how it’s sourced, see the Person-Organization-Insight data dictionary. The catalog tells you which columns exist; the data dictionary tells you what they mean.

Find similar companies

Look-alike search is company-grain, so it lives on the company surface — see Search for companies. You can still use a look-alike leg inside a contact filter to find people at similar companies; see SmartSearch.

Next steps