Skip to main content
POST
Resolve an address, coordinate, or APN to canonical join keys

When to use this

/v1/geocode answers “where is this address.” This endpoint answers a different question: “what are the canonical join keys for this place, and how confident should I be?” Use /v1/lookup when the input might be ambiguous, when you want a parcel attached, or when the input could be a coordinate or an APN instead of a clean address.
Every response says how it resolved and how confident it is. disposition is one of:
  • resolved — a coordinate, plus a parcel when the geocode cleared parcel-quality accuracy.
  • clarify — the input is genuinely ambiguous: multiple plausible matches at comparable confidence. You get candidates, never a silent pick.
  • no_match — an honest failure, with a reason.
The rule behind all three: a clarification or an honest no-match is always acceptable; a silently wrong place never is. An unqualified “1100 King St W, Toronto” can land on Toronto, Ontario or Toronto, Ohio at similar confidence — a single top-ranked geocode result can never reveal that a comparably-good alternative existed. This endpoint checks multiple candidates specifically so it can tell you when that’s happened, instead of picking one and hoping.

Request shape

Example: a clean, parcel-quality match

Area, hazard, and market context

Every resolved response carries free context beyond the coordinate and parcel, gathered concurrently with the parcel lookup (not after it — a slow enrichment call never adds to the parcel leg’s latency):
  • Jurisdiction codes, from the same Census Geocoder call as county_fips/county/tract_geoid: state_fips, state, block_group_geoid, block_geoid, congressional_district (e.g. "TX-27"), cbsa_name/cbsa_code (the metro or micro market, e.g. "Austin-Round Rock-San Marcos, TX Metro Area").
  • Elevation and flood risk: elevation_m, fema_flood_zone, within_floodplain, coastal_high_hazard — the same catalog sources /v1/fetch uses (3DEP/EPQS elevation, FEMA NFHL).
  • County market context: county_market bundles ten metrics from five federal sources (Census PEP/BPS/ACS, FHFA, BLS QCEW) — population and its 1-year growth, net domestic migration, building permits (total, single-family, YoY %), home-price YoY %, employment (total, YoY %), and median household income.
  • Opportunity Zone status: in_opportunity_zone (a federal tax-incentive designation) and opportunity_zone_tract_geoid when applicable.
  • Timezone: timezone, the IANA zone name (e.g. "America/Chicago").
Every one of these degrades independently to null on its own failure — none of them can turn an otherwise-successful resolved into anything else. Same guarantee parcel_unavailable already makes for the parcel leg, applied to enrichment too.

Example: genuine ambiguity — never a silent pick

Present the candidates to the user (or use a disambiguation hint you have — state, county) rather than picking the first one. Up to 3 candidates are returned per response.

Example: a lone winner in the wrong town is a no_match, never silent

Some inputs name a city the geocoder only has ONE plausible match for — but the wrong one, in a different town that happens to share the same street name and number. There’s no second candidate to offer, so this isn’t clarify; it’s an honest no_match, same governing rule as everywhere else on this page:
The check compares the city you named against the winning candidate’s actual city (normalizing a small set of common spelling variants — Saint/St., Mount/Mt., Fort/Ft. — so a legitimately-abbreviated city is never a false positive). It only fires when the input actually names a city; a street-only input has nothing to contradict.

Example: a parcel-lookup failure never demotes a good geocode

If the parcel vendor is unavailable — including a plan/quota issue on our end — the geocode still comes back honestly, just without a parcel:
This never becomes a 5xx, and it never demotes disposition away from resolved. The geocode succeeded; only the parcel attempt didn’t, and the response says exactly why.

Check parcel_grade before re-using the coordinate

parcel_grade: false means the coordinate is an estimate. The geocoder could only interpolate the point along the street rather than match it to a rooftop, and a range_interpolation-grade match can be off by up to ~2,872 m in rural areas — easily a different parcel. precision_note says the same thing in prose, ready to show a user. The parcel in that response is still the right one. A street-tier lookup matches by the situs address, never by the estimated pin, precisely because a mislocated pin can bill the wrong parcel. It is only the top-level lat/lng that is approximate — so passing it to /v1/fetch or /v1/ask can return the neighbouring property’s data while every field in that response looks perfectly confident. Use parcel.interior_point_lat / interior_point_lng instead. They are derived from the matched parcel’s own geometry and are guaranteed to fall inside it, which makes them the coordinate to key downstream point queries on. They are null only when no geometry came back.
Both fields are absent rather than false when no geocode ran: a coordinate you supplied is not an estimate of ours, and clarify / no_match have no single coordinate to grade. /v1/fetch and /v1/ask carry the same pair inside their geocode block, graded by the same rule. Below centroid quality (a city or county middle), the input is rejected outright rather than graded — see address_too_coarse under Errors.

Swapped coordinates are a hard error, never a nearest-match

This is the one input class the design treats as a hard failure rather than a best-effort placement — a transposed lat/lng is a caller bug, not an ambiguous location, and silently “fixing” it would risk landing on a plausible-looking but wrong point.

APN-only lookup is not supported yet

The only wired parcel integration here is a point (lat/lng) lookup — there is no attribute-search-by-APN path. An APN-shaped input returns a clean no_match:

Response shape

Errors

Input-validation failures specific to this endpoint: A propagated address-leg failure (input that resolved to nothing at all, or hit a geocoder-level problem) shares /v1/geocode’s error taxonomy exactly: address_form_unsupported, geocode_unconfigured, geocode_forbidden, geocode_timeout, geocode_upstream_error. A parcel-leg failure is never one of these — see above, it degrades the response instead.

Limits

  • One input per request. No batching in V1; loop client-side.
  • 256 characters maximum, rejected rather than truncated.
  • Address-leg caching follows /v1/geocode’s rules: successful geocodes cache 30 days, negatives 24 hours, form-only normalization (case/whitespace/ punctuation) — see /v1/geocode’s Limits for the full detail, since the same cache backs both.
  • US only, same envelope as the rest of the API.
  • Parcel data comes from a commercial upstream provider. There is no free parcel tier — a parcel is attached only when that lookup succeeds and the match is close enough to trust; every other case is an honest parcel_unavailable, not an error.

What we keep

Same retention as /v1/geocode: the input you send (when it’s an address) is recorded alongside the coordinate it resolved to, for 30 days, so a result can be audited later. If your use case cannot accommodate this, resolve client-side and call /v1/fetch or /v1/ask with lat/lng instead.

Body

application/json
input
string
required
Required string length: 1 - 256
include_parcel
boolean
default:true
kind
enum<string> | null
Available options:
address,
coord,
apn

Response

Successful Response