Skip to main content
A property is one parcel. Its id is prop_ plus 32 hex characters. Find one from a point, an APN or a street address with GET /v1/properties/resolve. Then read it with GET /v1/properties/{property_id}. The parcel facts come from the assessor roll, and the API serves them to every key. The facts are the segment, the beds, the baths, the square feet, the year built, the pool and the lot size.

When the owner is named

Read this part carefully. The API finds investors and city-registered rental businesses. It is not a people-search tool. owner.names and owner.mailing exist in exactly two cases. On this host they come back null with contact_redacted: true in both cases. So what the cases decide for you is redacted_reason. The cases are:
  1. The parcel is a confirmed holding of a registry investor.
  2. The city registered the current owner as the operator of a short-term rental business there, by a date or a name. short_term_rental.business_use is then true, with an attribution_basis of PURCHASE_DATE, OWNER_NAME or LICENCE_START.
Otherwise you get names: null with a redacted_reason. For an ordinary household the reason is not_an_investor_hold, and that is deliberate. Three other cases keep the licence facts and lose the identity. They are a prior owner’s permit, an owner-occupied home with a casita permit, and a licence attributed only by assumption (attribution_basis: "ASSUMED"). The API always serves the owner facts that identify nobody: owner-occupied or absentee, a trust, how long held, rental-registered.

The side blocks

A null block means “no data of this kind for this market”, not “nothing found”. A block that is present with zeros or status: "NONE" means the market has the roll, and the parcel is not on it. See Coverage and freshness.

One parcel with its owner facts, its short-term rental licence, its deal history and its Investorlift listings.

id
string
required

Parcel id, prop_ followed by 32 hex characters: pass it to /v1/properties/{property_id} or as property_id geometry.

Pattern: ^prop_[0-9a-f]{32}$
market
string
required

Market code the parcel belongs to, for example phx. The loaded markets are in meta.coverage[].

apn
string | null
required

Assessor parcel number as recorded, for example "131-28-253". Null when the county did not supply one.

apn_norm
string | null
required

APN with punctuation removed, upper case, for example "13128253": the lookup key for /v1/properties/resolve.

county_fips
string | null
required

County FIPS, 5 digits, for example 04013 Maricopa, 04021 Pinal or 48201 Harris.

address_short
string | null
required

Situs street address in title case including the unit, for example "7522 E Cholla St".

street_no_unit
string | null
required

The street address without the unit.

unit
string | null
required

Unit designation, for example "UNIT 8". Null for most parcels.

city
string | null
required

City, upper case.

state
string | null
required

2-letter state.

zip
string | null
required

5-digit ZIP.

latitude
number | null
required

WGS84 latitude of the centre of the parcel. Null when the parcel has no coordinates.

Required range: -90 <= x <= 90
longitude
number | null
required

WGS84 longitude of the centre of the parcel. Null when the parcel has no coordinates.

Required range: -180 <= x <= 180
segment
enum<string> | null
required

Parcel segment: SFR, CONDO_TH (condo or townhouse) or OTHER (manufactured, multi-family, land, commercial). Null when the assessor use code is unknown.

Available options:
SFR,
CONDO_TH,
OTHER
bedrooms
integer | null
required

Bedrooms per the assessor. Null when the assessor did not report them.

Required range: -9007199254740991 <= x <= 9007199254740991
bathrooms
number | null
required

Bathrooms per the assessor. The value can be fractional, for example 2.5. Null when the assessor did not report them.

sqft
integer | null
required

Living area in square feet. Null when the assessor did not report it.

Required range: -9007199254740991 <= x <= 9007199254740991
year_built
integer | null
required

Year built. Null when the assessor did not report it.

Required range: -9007199254740991 <= x <= 9007199254740991
pool
boolean | null
required

True for a private pool, false for community pool or spa only, null when the assessor did not report it (most parcels).

pool_type
string | null
required

Pool detail as the assessor wrote it, for example Pool - Yes. Null when the assessor did not report it (most parcels).

owner
object
required

Who holds the parcel at the deed data end date (meta.coverage[].data_end) and how. This host never names the holder.

listing
object | null
required

The MLS listing on the parcel: the latest listing the feed knows, its status, prices and agent. Its owner_test says if it belongs to the parcel's current holder, and is null when no investor holds the parcel. Its list_to_bought_ratio is null here. Null when the parcel carries no listing record, and when the market has no published listing tables (meta.coverage[].listings_data_end is null then). This host does not name the agents.

short_term_rental
object | null
required

The short-term rental licence facts of the parcel from the city's own roll. The block says if the parcel is licensed and since when. It says if the licence belongs to the current owner and on what basis, and if the use is a business. Served to every key. Present on every parcel inside a loaded city: status NONE when it has no record, status null where coverage.served is false. Null outside every loaded city (meta.coverage[].str.jurisdictions says why), and when the market has no published short-term rental tables (meta.coverage[].str_as_of is null then).

deals
object[]
required

Every deal on the parcel: every kind and every year, public-body investors included, because a parcel lookup is not a list. Newest purchase first, undated deals last.

wholesale_listings
object[] | null
required

Every Investorlift listing of the house, newest first, each with the listing company and what the deeds show occurred. The API does not attach a hidden-address listing without a closing deed to the parcel, so it does not appear. Empty when the house was never listed. Null when the wholesale tables are not published (meta.coverage[].wholesale_as_of is null then). Served to every key.