Skip to main content
POST
Local Businesses
research/company and enrich/company are backed by a B2B database: strong for a 40-person HVAC company, thin for the single-location taqueria. These two endpoints cover the long tail — independent restaurants, contractors, dental practices, auto shops, owner-operator trucking companies. Both are async. You POST a request, get back a request_id, and poll GET /v1/requests/{request_id} until the job finishes. Both return the same LocalResult shape.
All paid endpoints on this page accept optional memo (≤ 1000 chars) and decisionContext (object) body fields. Stored on the receipt for debugging and audit — see Audit Trail.

Local Resolve

POST /v1/tools/local/resolve Given a business name and a street address, what is this place’s domain? Every public registry (a state business licence, NPPES, FMCSA) gives you a legal name and an address. enrich/email needs company_domain. This is the join.
string
required
Business name as it appears on the record, e.g. "TAQUERIA LOS AMIGOS"
string
Street address, e.g. "2334 Mission St"
string
City
string
State / province. Not a locating field on its own.
string
Postal code
string
Phone number. The strongest single match signal after the name.
name plus at least one of address, city, postal_code, or phone is required.

Response Structure

A miss is a completed job with found: false, result: null, and the best confidence seen — the same contract as enrich/email. It is never an error. When a candidate existed but did not clear the threshold, it is returned as closest_match so you can inspect it.
confidence is 0–1, a weighted mean over the signals you supplied (name, phone, address, postal code, city). found requires confidence ≥ 0.65 and a name similarity ≥ 0.5. POST /v1/tools/local/search Which businesses of this kind operate in this place? Discovery by category × geography. Priced flat per search, not per result, so you can size a territory without metering every row.
string[]
Business categories, e.g. ["hvac contractor", "dental practice"] (max 50). category or keywords is required.
string[]
Free-text keywords, an alternative to category (max 50)
string[]
required
Cities, neighborhoods, or "City, ST" strings, e.g. ["Austin, TX", "Round Rock, TX"] (max 50)
number
Minimum star rating, 0–5
number
Minimum review count
boolean
true keeps only detected chains; false drops them. Rows where no chain was detected have is_chain: null and survive false.
'open' | 'any'
default:"open"
open drops businesses detected as closed
boolean
true returns only rows with a resolvable website domain — the ones enrich/email can act on
number
default:"100"
Max results, 1–500. See truncated below.

Response Structure

Each search is capped at a fixed number of upstream calls to keep the flat price honest. When the cap stops the search before limit is reached, truncated is true. In practice a search yields up to ~60 rows (three pages of 20); split large territories across searches.

The LocalResult shape

Fields are ordered by how much they matter to a caller: the join key first, then whether the place is real and operating, then contactability.

What a registry still answers

A local tool tells you whether a business is real, operating, and reachable. It does not carry a licence issue date, an NPI taxonomy, an FMCSA authority type, or a NAICS code. Registries say who just became a buyer and what they’re licensed to do; these endpoints say whether they’re real and how to reach them. Use both.

SDK

See Pricing for costs.