Skip to main content

Common filters

These filters work on both /v1/search/rentals and /v1/search/sales:

Rental-only filters

A broker fee is something you pay to rent, so sale listings carry no broker-fee flag. Sending noFee to /v1/search/sales returns 400 INVALID_PARAMS rather than matching nothing.

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 or the default sort=RECOMMENDED) 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=LISTED_AT) 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. The default sort=RECOMMENDED currently orders by listedAt too, so it has the same ranking caveat, but it does not add a warning. † Building-derived filters. minTransitScore, fiberOnly, minDownloadMbps, the building-level half of amenities, and the building pet-policy fallback for petsAllowed all read the listing’s building. A listing is linked to its building only once it is fetched in detail, so an undetailed listing cannot match any of them. petsAllowed has the same gap from both sides: the listing’s own pet flag is detail-only, and the building fallback needs the link. The warnings some of these add (transit, broadband, amenities) do not mention the building-link gap, and petsAllowed adds no warning. ‡ =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

updatedSince matches listings whose last_seen_at, the time the listing was last seen in the active feed, is on or after the value you pass. Matching is by calendar day (UTC); any time component in the value is ignored.
It is not a change feed. Every scheduled search refresh (rentals every 6 hours, sales every 8 hours) re-stamps last_seen_at on every listing it sees, whether or not anything about the listing changed. Any date before the latest refresh therefore matches nearly the whole active set, and search returns only ACTIVE listings, so listings that went off-market never appear. To find what changed or was removed, use webhooks or watchers, or compare full result sets between runs. 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
Unrecognized query parameters, including these and misspelled filter names, are ignored rather than rejected. A typo returns unfiltered results with a 200, so check your parameter names against this page.

Sale-only filters

Valid values: RESALE, SPONSOR_UNIT, FORECLOSURE, RESTRICTED, AUCTION, SHORT, UNKNOWN saleType sent to /v1/search/rentals is ignored (the results are not filtered), unlike noFee on sales, which returns 400.

Sorting

† RECOMMENDED currently orders by listedAt (recency), the same as LISTED_AT, so both carry the listedAt estimate caveat: see Detail-only filter coverage above. Only sort=LISTED_AT adds the meta.warnings entry.