Skip to main content
Both the enrichment API and the Lead Finder API are asynchronous. You submit a request, you get a request_id back immediately, and the work happens in the background.
Always branch on status, never on the HTTP status code alone.While a request is running, the GET endpoints answer 202 Accepted with a body that has no data (enrichment) and no leads (Lead Finder). Many HTTP clients treat every 2xx as success, so an integration that only checks response.ok reads an empty result and wrongly concludes that nothing was found.

Lifecycle

1

Submit

POST /async answers 201, POST /lead_finder/async answers 202. The body carries the identifier you will poll on: id for enrichment, request_id for Lead Finder.
2

Processing

The GET endpoint answers 202 with status: "processing" and a message. No data, no leads, no summary.
3

Done

The GET endpoint answers 200 with status: "terminated". summary and the results array are now present.

Status values

A Lead Finder search that matched nothing is reported as terminated with an empty leads array and summary.leads_found at 0. It is a normal outcome, not an error.

Polling recipe

Prefer a webhook whenever you can. When you do have to poll, wait a few seconds between attempts and stop on terminated, keeping an eye on the rate limit.
For Lead Finder, use GET /lead_finder/async/{request_id} and treat 404 as the unknown-id case instead of 406.

Per lead status

Inside a terminated enrichment, each row of data carries its own enriched boolean. A batch can be terminated while some of its leads could not be enriched. Check enriched before using a row.