Skip to main content
To search Shovels Properties, use the Search Properties endpoint. Each result is one property with its permit history already summarized on the record—permit counts, work-type tags, latest activity dates, contractors, and job values—so you don’t have to stitch individual permits together yourself.
Properties are currently in beta. Query parameters, response fields, and the absence-trust surface may still change in response to how the endpoint is used in practice.

Required Parameters

Every search needs a scope: a location or an owner (or both). Omitting both returns a 422 error. Jurisdiction geo_ids are not accepted—see Properties vs Permits for why.
To turn a typed address into a geo_id, call Search Addresses first. See Resolving addresses.

Permit Filters

These three filters take repeated keys, not one comma-joined value. permit_tags=solar,-roofing is rejected with a 422 naming the bad token—send permit_tags=solar&permit_tags=-roofing instead.An unrecognized tag is also a 422 rather than an empty result, so a typo fails loudly here. Search Permits returns 200 with zero items for the same typo, which is easy to misread as “no such properties.”
permit_to (and any other upper date bound) is not supported on properties. The property record keeps only the latest permit date per work type, so a closed date window can’t be answered correctly. Use Search Permits for date-window queries.
With multiple positive tags, each tag must be present on the property but they may come from different permits. This differs from /permits/search, where multiple tags must appear on the same permit.

Property Attribute Filters

Attribute data (value, size, year, units, type) is available for roughly 60–70% of properties. A property with no value for an attribute never matches a range filter on it, so attribute filters narrow results to the covered set.

Pagination

Results are sorted most recently permitted first.
  • size — results per page (1–100, default 50)
  • cursor — pass the next_cursor from the previous response to fetch the next page
  • include_total_count — set to true on the first page (no cursor) to include total_count. The count is exact up to 10,000; above that it is reported as a “greater than or equal to” value.