Skip to main content

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

Use updatedSince 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:
Each listing also carries 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:
  • prewar
  • transitLines
  • view-style amenity enums such as CITY_VIEW or WATER_VIEW

Sale-only filters

Valid values: RESALE, SPONSOR_UNIT, FORECLOSURE, RESTRICTED, AUCTION, SHORT, UNKNOWN

Sorting

sort=LISTED_AT: see Detail-only filter coverage above.