Common filters
These filters work on both/v1/search/rentals and /v1/search/sales:
Advanced filters
Detail-only filter coverage
† and ‡ above mark filters that touch detail-only fields: data that only a listing-detail scrape populates, as opposed to the search-feed sweep that keeps most of Borough’s data warm. Currently around 55% of ACTIVE listings have never been detail-scraped — an approximate figure that shifts over time as the backlog drains and new listings arrive, but reliably the majority case, not an edge case; see Detail-only fields and coverage for the full picture. Two consequences follow from that: † Under-return, not exclusion.minSqft/maxSqft, amenities (the
listing-level match), hasOpenHouse=true, has3dTour=true, noFee=true,
and the listedAt-derived filters (minDaysOnMarket, maxDaysOnMarket,
listedAfter, listedBefore, and sort=LISTED_AT) all only match against
data that requires a detail scrape (or, for listedAt, is a feed-first-seen
estimate until one runs). A listing that hasn’t been detail-scraped is
dropped from minSqft/maxSqft/amenities results and cannot satisfy
hasOpenHouse=true/has3dTour=true/noFee=true even if the true value
would have matched. It’s excluded for lack of data, not because it fails
the filter. amenities matching also depends on listing-level amenities
being regex-derived from the listing description, so an amenity the
description never mentions reads as absent, not merely unconfirmed.
sort=LISTED_AT can rank an undetailed listing as newer than it really is,
since its listedAt is only an estimate. Whenever any of these filters (or
sort) is used, the response’s meta.warnings array carries a caveat string
naming the specific gap. Check it rather than assuming meta.total is a
population count.
‡ =false is rejected, not silently ignored. noFee, has3dTour, and
hasOpenHouse are detail-only booleans stored as null until a detail
scrape runs. Borough cannot yet distinguish “confirmed false” from “not yet
checked.” Passing noFee=false, has3dTour=false, or hasOpenHouse=false
returns 400 INVALID_PARAMS rather than the previous behavior of silently
matching every listing (including every undetailed one). Use =true for
confirmed matches, or omit the parameter to search all listings regardless
of that field’s value.
Incremental sync
UseupdatedSince to pull only what changed since your last crawl instead of
re-paging the whole result set. It matches listings whose last_seen_at, the
time the listing was last confirmed in the active feed, is on or after the
value you pass, and it includes newly listed rows. Matching is by calendar day
(UTC); any time component in the value is ignored. Pair it with your stored
high-water mark from the previous run:
sqft and a derived pricePerSqft (rounded to the
nearest dollar) when square footage is known; both are null for listings whose
detail page has not yet been scraped.
Broadband filters are based on Borough’s FCC-backed provider enrichment. Coverage may be exact-building when a listing is attached to a matched FCC location, or Census-block level when sourced from FCC BDC public bulk files. Listings in unmatched buildings or blocks will not satisfy these filters.
This product uses FCC APIs and/or Data but is not endorsed or certified by the FCC.
Not currently supported
These are common requests, but they are not current Borough search filters:prewartransitLines- view-style amenity enums such as
CITY_VIEWorWATER_VIEW
Sale-only filters
Valid values:
RESALE, SPONSOR_UNIT, FORECLOSURE, RESTRICTED, AUCTION, SHORT, UNKNOWN
Sorting
†
sort=LISTED_AT: see Detail-only filter coverage above.