Skip to main content
GET
Find the parcel at a point, behind an APN or behind a street address
Returns the property_id to pass as property_id= to every other endpoint, plus the parcel block. The block carries the address, coordinates, beds, baths, square feet, year built and pool.

Use it when

The first call of a God Mode search.
  • From a search box. Google Places gives you a point. Pass lat and lng, and the API returns the nearest parcel within 100 m.
  • From a seller record. Pass apn (dashes optional) and, when you have it, county. The county is a name such as Maricopa, or a FIPS such as 04013.
  • From a street address. Pass address with zip or city. The ZIP is the narrower key. The address is the street line as the county records it, “7522 E Cholla St”. The API trims a ZIP+4. A unit goes inside the line, “7522 E Cholla St Unit 2”, or in unit.
Then read the parcel with GET /v1/properties/{property_id}.

Read the response

property_id is the id to keep. candidates is empty for a point lookup, a unique APN and a unique address. Sometimes the county recorded the same parcel under two spellings (“101-08-158B” and “101-08-158-B”). Then the row with the most deals is the property. The response lists the other spelling with same_parcel: true, and you can ignore it.

How an address is matched

The API normalises the street line with the same function the pipeline uses on every parcel’s situs line. The normalised line has the house number, directional, street name and suffix, with punctuation and case folded. Then the API probes the address table in the ZIP or, without one, the city. An exact street key wins. Only when no parcel carries it does the API try the direction-less key. So “7522 Cholla St” still finds “7522 E Cholla St”, while an exact spelling never widens to its twins. One row resolves. Several rows, a building of units or a duplicate line in the ZIP, resolve when exactly one row’s unit matches the unit you gave. Otherwise the API answers 422 ambiguous_address with up to 25 candidates[], each carrying its unit, and truncated: true when more exist. Pick one and call the parcel route with its id, or pass unit.

Gotchas

  • Pass exactly one of lat + lng, apn or address. Two of them is 400 geometry_conflict, and so is zip, city or unit without address, or county without apn. None of them is 400 geometry_required. An address without zip or city is 400 validation_error. So is a line with no house number, or a line with two house numbers (“628 & 630 W Main St”).
  • The API serves an address where the market has a published address table: meta.coverage[].address_as_of says so, and Coverage and freshness explains it. Until then an address is 422 addresses_unavailable. An address no parcel carries in the ZIP or city is a 404.
  • A point outside every loaded market is 422 outside_coverage. A point inside coverage with no parcel within 100 m is a 404: the difference matters, and Coverage and freshness explains it.
  • An APN that names different parcels is 422 ambiguous_apn with candidates[] in the error body. That occurs with the same APN in Maricopa and Pinal without county, or with twins more than 100 m apart. Pick one and call the parcel route with its id.
  • The address table carries the parts of each parcel’s situs line, never a mailing address. The API never matches an owner’s address here.
  • This endpoint never returns owner information.
Who owns this house?.

Authorizations

Authorization
string
header
required

API key from the developer console (starts with zpka_). Create one at https://developers.investorlift.com/get-a-key.

Query Parameters

lat
number

Point latitude (with lng): the API returns the nearest parcel within 100 m. Not allowed with apn.

Required range: -90 <= x <= 90
lng
number

Point longitude (with lat).

Required range: -180 <= x <= 180
apn
string

Assessor parcel number, with or without dashes: "131-28-253" and "13128253" match the same parcel. The API ignores punctuation and case. Not allowed with lat / lng.

Required string length: 1 - 32
address
string

Street line of a situs address as the county records it, for example "7522 E Cholla St" or "7522 E Cholla St Unit 2". The line carries the house number and the street, with the unit inside it or in unit. Needs zip or city. Not allowed with lat / lng or apn. A line without a house number, or one that names two ("628 & 630 W Main St"), is 400 validation_error. A line that names several parcels, the units of one building, is 422 ambiguous_address until unit picks one.

Required string length: 1 - 120
zip
string

5-digit ZIP of the address, for example "85257". The API reads the first five digits of a ZIP+4. Only with address. The address needs zip or city, and zip is the narrower key.

Pattern: ^\d{5}(-\d{4})?$
city
string

City of the address, for example "Scottsdale" (case does not matter). The API reads it when zip is absent. Only with address.

Required string length: 1 - 64
unit
string

Unit designator of the address, for example "2", "# 2", "Unit 2" or "B". The API drops the designator word. It picks one unit of a building that resolves to several parcels. Only with address. A unit inside the address line does the same.

Required string length: 1 - 16
county
string

Narrows an APN lookup to one county: a 5-digit FIPS ("04013", "48201") or the county name ("Maricopa", "Harris"). Case does not matter. Only with apn. Without it the API searches every loaded county, and an APN that exists in two counties is 422 ambiguous_apn.

Required string length: 1 - 64

Response

The resolved parcel: property_id, the parcel block and any same-parcel spelling twins.

The resolved parcel: property_id, the parcel block and any same-parcel spelling twins.

data
object
required

The parcel behind a point, an APN or an address.

meta
object
required

Response metadata: when the API produced it, which markets it covers, and how fresh they are.