> ## Documentation Index
> Fetch the complete documentation index at: https://qwady.wiki/llms.txt
> Use this file to discover all available pages before exploring further.

# Search Filters

> All available search parameters for rental and sale listings

## Common filters

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

| Parameter             | Type    | Description                                                             | Example           |
| --------------------- | ------- | ----------------------------------------------------------------------- | ----------------- |
| `areas`               | string  | Comma-separated area IDs                                                | `120,115`         |
| `excludeAreas`        | string  | Comma-separated area IDs to exclude (exact match, no borough expansion) | `115`             |
| `minPrice`            | integer | Minimum price                                                           | `2000`            |
| `maxPrice`            | integer | Maximum price                                                           | `5000`            |
| `minBeds`             | integer | Minimum bedrooms                                                        | `1`               |
| `maxBeds`             | integer | Maximum bedrooms                                                        | `3`               |
| `minBaths`            | integer | Minimum full bathrooms                                                  | `1`               |
| `maxBaths`            | integer | Maximum full bathrooms                                                  | `2`               |
| `minSqft` †           | integer | Minimum square footage                                                  | `500`             |
| `maxSqft` †           | integer | Maximum square footage                                                  | `1500`            |
| `amenities` †         | string  | Comma-separated amenity enums                                           | `DOORMAN,GYM`     |
| `petsAllowed`         | boolean | Pet-friendly listings                                                   | `true`            |
| `buildingType`        | string  | Comma-separated building types                                          | `CONDO,CO_OP`     |
| `excludeBuildingType` | string  | Comma-separated building types to exclude                               | `HOUSE,TOWNHOUSE` |
| `noFee` †‡            | boolean | Confirmed no-broker-fee listings only                                   | `true`            |

## Advanced filters

| Parameter           | Type    | Description                                                                                                                                             | Example      |
| ------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
| `minDaysOnMarket` † | integer | Minimum days listed                                                                                                                                     | `7`          |
| `maxDaysOnMarket` † | integer | Maximum days listed                                                                                                                                     | `30`         |
| `listedAfter` †     | date    | Listed on or after this date (`YYYY-MM-DD`; datetimes are accepted and normalized to the UTC date)                                                      | `2026-01-01` |
| `listedBefore` †    | date    | Listed on or before this date                                                                                                                           | `2026-02-01` |
| `updatedSince`      | date    | Delta sync: only listings last confirmed in the active feed on or after this date (`YYYY-MM-DD`; datetimes are accepted and normalized to the UTC date) | `2026-06-01` |
| `hasOpenHouse` †‡   | boolean | Confirmed scheduled-open-house listings only                                                                                                            | `true`       |
| `has3dTour` †‡      | boolean | Confirmed 3D-virtual-tour listings only                                                                                                                 | `true`       |
| `maxMonthlyCost`    | integer | Max total monthly cost (price + maintenance + charges + tax)                                                                                            | `6000`       |
| `minTransitScore`   | integer | Minimum transit score (0-100)                                                                                                                           | `70`         |
| `fiberOnly`         | boolean | Require a fiber provider match for the building                                                                                                         | `true`       |
| `minDownloadMbps`   | integer | Require a provider with at least this advertised download speed                                                                                         | `1000`       |

## 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](/borough/guides/data-freshness#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:

```bash theme={null}
curl -H "Authorization: Bearer BOROUGH-..." \
  "https://borough.qwady.app/v1/search/rentals?areas=120&updatedSince=2026-06-01"
```

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

| Parameter  | Type | Description      | Example  |
| ---------- | ---- | ---------------- | -------- |
| `saleType` | enum | Sale type filter | `RESALE` |

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

## Sorting

| Parameter | Type | Default       | Options                               |
| --------- | ---- | ------------- | ------------------------------------- |
| `sort`    | enum | `RECOMMENDED` | `RECOMMENDED`, `PRICE`, `LISTED_AT` † |
| `sortDir` | enum | `DESC`        | `ASC`, `DESC`                         |

† `sort=LISTED_AT`: see [Detail-only filter coverage](#detail-only-filter-coverage) above.

## Example: complex search

```bash theme={null}
curl -H "Authorization: Bearer BOROUGH-..." \
  "https://borough.qwady.app/v1/search/rentals?\
areas=120,115&\
minPrice=2000&\
maxPrice=4500&\
minBeds=1&\
maxBeds=2&\
noFee=true&\
petsAllowed=true&\
minTransitScore=70&\
maxDaysOnMarket=14&\
sort=PRICE&\
sortDir=ASC&\
fiberOnly=true&\
minDownloadMbps=1000"
```
