Added
- Property search filters now cover every indexed attribute by its dotted path: 144 canonical fields, for example
address.postcode,building.construction.year,epc.rating.current.band,floodRisk.riskLevelandroomDetails.beds, plus every existing short alias, on POST /v1/property/query and thequeryclause of POST /v1/property/aggregate. The whitelist is generated from the live index mapping: keyword and boolean fields take term comparators, numeric and date fields add range comparators, and nested blocks such aslistingsandsaleHistoryare handled transparently. GET /v1/property/attributes marks each attributefilterableand reports the real filter target. marketStatus.forSaleandmarketStatus.forRent, the names used in responses and the attribute catalogue, now work directly as filter fields, equivalent to the existingsaleListingStatusandrentalListingStatusaliases.
Changed
- Unknown filter fields and comparator mismatches on POST /v1/property/query return a descriptive
400with codeinvalid_query_conditionnaming the problem and pointing at the attribute catalogue. Filtering on a permission-gated field returns an explicit403with codepermission_deniedrather than leaking which properties match.
Fixed
- Property search documents polygon and point coordinates in GeoJSON
[longitude, latitude]order, and POST /v1/property/query returns a clear400with codeinvalid_coordinatesfor malformed area geometry, explaining that polygon rings need at least three distinct points and must be closed. Well-formed requests, including existing GeoJSON-order integrations, are unchanged, and locationId is always included whatever you request. listingTypeandlistingStatusfilters use exact-match term semantics.