Skip to main content

Overview

A property record is everything the county recorded for a parcel: owner, address, structures, land, valuation, taxes and sale history, along with the boundary geometry, the PropertyLayer identifiers and the enrichment fields. Every field is optional. If a value is null or missing, it was not published for that property. PropertyLayer does not estimate or infer.

PropertyLayer identifiers and geometry


Assessor identifiers (identity)

Owner (ownership)

Property address (situs_address)

Classification

Structure summary (building_summary)

Rolled up across every structure on the property. Read this when you want one number per property.
Counties measure building area differently. universal_building_sqft picks the best available measure per record and universal_building_sqft_source tells you which one, so you can hold the basis constant when comparing across counties.

Structures (buildings[])

One entry per structure, with whatever construction detail the assessor carries.

Land

Valuation (valuation_current, valuations[])

valuation_current is the latest roll year. valuations[] is the full history, one entry per year. valuation_current additionally carries appraised_land, appraised_improvements, taxable_land, taxable_improvements, exempt_value, and homestead_value.
States are not consistent about what “value” means. Read basis before comparing across state lines. A California assessed figure is constrained by Prop 13 and will not line up with a Texas market figure.

Taxes

Exemptions

Sale history (transfers[])

Every recorded transfer the assessor carries.
Use is_arms_length to exclude intra-family transfers, quitclaims, and $1 nominal deeds before computing price statistics.

Location

Districts

Taxing and service districts: { kind, code, name }. Common kind values are tax_district, school, jurisdiction, city, municipality, township, county, special_service, fire, college, hospital.

Computed fields (derived)

PropertyLayer-computed roll-ups, present on every assessor record. Use these instead of walking the arrays yourself.
Use calculated_total when you need one comparable value per property nationwide. It reconciles counties that publish assessed, market, or appraised figures under different names.

Normalized vs. verbatim values

Most assessor string fields are passed through exactly as the county publishes them, with no cross-county normalization. buildings.pool alone appears as No, NO, N, 0, No Pool, Yes, Y, YES, Pool, and more. Normalized, cross-county-comparable fields are limited to:
  • derived.calculated_total / calculated_land / calculated_improvements
  • derived.last_sale_date / last_sale_price
  • derived.has_building / has_sales / has_valuation_history
  • building_summary.universal_building_sqft (with universal_building_sqft_source)
  • transfers[].is_arms_length / is_nominal / is_quitclaim
  • identity.* and location.census_tract
Everything else needs your own normalization layer if you are comparing across counties. That is a deliberate choice. Flattening each county’s vocabulary into a shared one would throw away detail PropertyLayer has no way to recover.

Schema versioning

Each assessor record carries a schema_version. Counties periodically publish attributes that are not yet in the PropertyLayer schema, and those get passed through on the relevant section rather than dropped. So treat every section as open: parse what you need and ignore the rest. The list above is not exhaustive.

Enrichments

External datasets joined onto every property by PropertyLayer.

USDA Cropland Data Layer (CDL)

The CDL is updated annually by USDA and covers all US agricultural land. Useful for filtering properties by crop type or separating agricultural from developed land at scale.

FEMA flood zones

Zone X indicates minimal flood hazard. Zones beginning with A or V indicate Special Flood Hazard Areas (SFHA) where federal flood insurance may be required.

Elevation and adjacency

adjacent_acreage_sameowner is useful for identifying large contiguous landholdings split across multiple parcel records.

Building footprints (building_footprints[])

Opt in with include_buildings: true. Each entry is one structure from the ORNL building footprint dataset. The key is omitted entirely when include_buildings was not requested, which says nothing about whether buildings exist.
building_footprints is ORNL footprint geometry and height. It is not the same as the assessor’s buildings array, which carries per-structure construction detail: bedrooms, baths, roof, HVAC, year built.

Null values

A null or absent value means that data was not published for the property. PropertyLayer does not estimate, impute, or infer missing values. This is by design: a missing sale price means no sale was recorded, not that the property has never sold. A missing classification.zoning means zoning was not published. PropertyLayer retains all property records regardless of data completeness. Some competitors remove parcels that fall below a minimum field threshold, which makes their counts appear lower. PropertyLayer keeps every record a county publishes, so counts reflect what the county actually recorded.