Find candidates without returning existing customers
Send this body toPOST /api/companies/search, or as search_companies arguments with a request_key:
procurement_request and facility_expansion. Demand classes are explicit_request, proxy,
and structural. occurred_after and observed_after accept ISO 8601 timestamps.
Restrict a search to known companies
Addcompany_ids or domains under filters. Exclude using exclude_company_ids or
exclude_domains. Each accepts up to 100 values. IDs are positive JSON integers; domains must be
hostnames, not URLs or email addresses. Domain matching normalizes case, surrounding whitespace,
and a trailing dot, but does not collapse subdomains or remove www.
Values within a field are OR; separate fields are AND. Exclusions win. An empty list does not
restrict. Domain matches require an active, currently evidenced company-domain relationship.
Unknown IDs/domains yield no matches, not invented company records. This is filtering company
evidence search, not a promise to research every supplied company or return one row per input.
Existing bounded acquisition may run for a short first page; the filters remain authoritative over
its results. There is no separate per-input bulk lookup or contact enrichment operation.
Continue a list
Whennext_cursor is not null, repeat the same query, filters and limit with that cursor and a
new request key. At most 100 companies enter the frozen shortlist, with up to three supporting
observations each. Builder permits 25 companies per page; professional permits 50. Pagination
does not acquire more sources, replan, or rerank. Withdrawal can shorten a later page.
Investigate one company
Callget_company({"id":123}), or GET /api/companies/123, with an ID returned by search. This
unmetered, subscription-authorized read returns identity, up to three recent deliverable observations,
and domains supported by those observations. It is not a full organization profile. Follow an
observation ID using get_observation to inspect its evidence. Neither detail read calls a provider.
Understand retries and usage
The same account, action, key and normalized inputs refer to one operation, even across API/MCP or synchronous/background modes. A successful new search settles one request unit and one delivered unit per distinct company. Fresh-evidence units count newly acquired observations actually delivered. An identical retry or usage poll adds no charge. Polling another account’s usage ID returns not found. Reads recheck current evidence. If a delivered company loses support, replay can remove it and reportwithheld_units without changing historical settlement. Raw provider and AI audit details are not
returned. Background operations move pending → processing → delivered or failed.
Verify and troubleshoot
Checkcompanies, supporting evidence, coverage, usage, and request_allowance, not just the
HTTP status. Similarity is not proof of buying intent. A suppressed or empty result is not proof of
absence. invalid_cursor means restart the search without a cursor; idempotency_conflict means the
key belongs to different inputs. After a terminal failure use a new key only if you intend new work.
Do not retry invalid inputs unchanged or loop on rate limits.
City/category filters, change feeds, exports, OAuth and whole-dataset downloads are not implemented.
See MCP tools and the API reference for exact request and response structures.