Skip to main content
GET
Search Properties

Authorizations

X-API-Key
string
header
required

Query Parameters

geo_id
string | null

Scope: a 2-letter state, 5-digit ZIP, ZIP+4, or a Shovels state/county/city/address geolocation id. Jurisdiction ids are not accepted. Optional when legal_owner is given, required otherwise.

legal_owner
string[] | null

Filter by the property's legal owner, matched on the owner's canonical form — case and spacing variants of one name return the same properties. Pass up to 10 legal_owner params to span several owners. Without a geo_id this searches an owner's properties nationwide; with one it narrows that scope to the owner. A name the data uses for an unidentified owner (for example 'RECORD OWNER') is rejected.

Maximum array length: 10
permit_tags
string[] | null

Filter by canonical permit tags. Repeat the key for several tags (e.g. ?permit_tags=roofing&permit_tags=-solar). A positive tag keeps properties with that tag on some permit; a - prefix excludes the tag (properties without it). Multiple positive tags require each tag (address grain — a documented divergence from /permits/search, where they must share one permit). With permit_status, each positive tag must be matched by a permit that also has one of the statuses. With permit_from: a positive tag matches since the date; an exclusion means 'no such tag since the date' in a pure-absence query, or 'never' when combined with any positive filter.

permit_status
string[] | null

Filter by permit status; repeat the key for several (final, in_review, inactive, active). With positive permit_tags this is a same-permit conjunction; on its own it keeps properties with a permit of one of the statuses. 'unknown' is not a filterable status.

permit_from
string<date> | null

Bind the tag/status/absence filters to this ISO date (YYYY-MM-DD): a positive filter matches since the date, a pure-absence exclusion means 'none since the date'. With no tag/status filter it keeps properties whose most recent permit is on or after the date.

permit_to
string | null

Not supported on /properties/search — use /permits/search for a date-window search.

property_type
string[] | null

Filter by property type: residential, commercial, industrial, agricultural, vacant land, exempt, miscellaneous, office, recreational. Repeat the key to match any of several types (e.g. ?property_type=residential&property_type=commercial). Properties with no attributed type are excluded; property attributes are available for 70.1% of properties.

permit_tags_unfinaled
string[] | null

Keep properties with an UNFINALED permit of each named canonical tag. Repeat the key for several (e.g. ?permit_tags_unfinaled=solar&permit_tags_unfinaled=roofing). Permit status — not a permit's final_date — is the finaled flag: a final permit carries a NULL final_date 14.7% of the time, and ~41% of permits with a NULL final_date are in fact finaled by status, so a final_date IS NULL test over-counts unfinaled permits and is wrong ~41% of the time. A tag is unfinaled for an address only when its latest non-final permit of that tag is more recent than its latest final permit of that tag (equal dates count as finaled); this clear rule removes the false positives a plain 'any non-final permit of this tag' test would keep — for solar, 31.5% of them, though the share varies by tag (nearer 13-18% for tags such as roofing and hvac). A permit whose status is unknown (NULL) counts as neither final nor unfinaled. With permit_from, the tag's latest unfinaled permit must be on or after the date.

property_min_market_value
integer | null

Minimum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).

property_max_market_value
integer | null

Maximum assessed market value in integer cents (dollars x 100). A property with no assessed market value never matches a range filter (a value is available for 61.0% of properties).

property_min_lot_size
integer | null

Minimum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties).

property_max_lot_size
integer | null

Maximum lot size in square feet. A property with no lot size never matches a range filter (a value is available for 68.7% of properties).

property_min_building_area
integer | null

Minimum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties).

property_max_building_area
integer | null

Maximum building area in square feet. A property with no building area never matches a range filter (a value is available for 60.8% of properties).

property_min_unit_count
integer | null

Minimum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties).

property_max_unit_count
integer | null

Maximum unit count. A property with no unit count never matches a range filter (a value is available for 70.1% of properties).

property_min_year_built
integer | null

Minimum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties).

property_max_year_built
integer | null

Maximum year built. A property with no year built never matches a range filter (a value is available for 61.1% of properties).

cursor
string | null

Opaque keyset cursor from a previous page's next_cursor.

size
integer
default:50

Page size (1-100).

Required range: 1 <= x <= 100
include_total_count
boolean
default:false

When true and on the first page (no cursor), include a total_count capped at 10,000.

Response

A page of properties in the scope.

Paginated /properties response; carries the honesty summary on absence pages.

items
PropertiesRead · object[]
required

The list of items returned in the response following given criteria.

size
integer
required

The number of items returned in the response.

next_cursor
string | null
required

The cursor for retrieving the next page of results.

total_count
TotalCount · object | null

Total result count (capped at 10,000). Present on first-page responses when include_count=true. null if the count query timed out.

trust_summary
TrustSummary · object | null

Row-weighted trust summary; present only on absence-class responses.