The HousingFeed Data API answers queries over the whole rental listings database by city, ZIP, state, rent, bedrooms or map box, paid per returned row, for research and internal tools.
curl -X POST "https://api.apify.com/v2/acts/housingfeed~rental-listings-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"state": "TX", "city": "Austin", "minBeds": 2, "maxRent": 2500, "maxItems": 100}'
The Data API runs as an Actor on Apify. Sign in to Apify for a token, then call the endpoint above; the response is a JSON array of listing objects. Paid per returned row, no contract. For internal use: research, analytics and internal tools. Showing the listings publicly needs the Display Feed licence.
| Field | Type | Meaning |
|---|---|---|
country | string | Country code, one of US, JP, BR, ES, UK, DE, FR, CA, AU, BE, PL, AT, IT, PK, RO, CH, PT, AE, NO, BH, EU, EG, QA, AR, SA, MX, IE, PE, EC, NL. US is the maintained market, re-read weekly; other countries are older portal snapshots. Blank = all countries. |
state | string | US state code (CA, NY, TX) or region. Blank = all. |
city | string | City name, partial match (for example Los Angeles), or a county (Hudson County; add the state when the name exists in several states). Blank = all. |
zip | string | Exact ZIP or postal code, for example 94110. Blank = all. |
minRent, maxRent | integer | Monthly rent range, in the listing's own currency. |
minBeds, maxBeds | integer | Bedroom range. Equal values match an exact bedroom count. |
managerDirectOnly | boolean | Only listings published by property managers and owners on their own software or websites, no consumer portals. Default false. See the manager-direct example. |
includePortals | boolean | Also return listings from consumer portals and other countries, licensed for research and internal use only. Default false. |
availableNow | boolean | Only listings marked available now. Default false. |
cursor | string | The nextCursor value from the previous run's OUTPUT record, with sort stable: the next page of the same query, every listing exactly once across pages. Blank on the first run. |
newSinceDays | integer | New listings only: records first seen by HousingFeed in the last N days (first_seen_at). Blank or 0 = no limit. See the new-listings example. |
removedSinceDays | integer | Removals instead of live listings: records our weekly liveness check confirmed gone at the source in the last N days (1 to 90), each with removed_at, newest first. Run it next to a newSinceDays pull and delete these ids from your copy. |
timeWindow | string | Changes instead of all live listings: new_7d or new_30d for listings first seen in that window, removed_7d or removed_30d for listings confirmed gone at the source, each with removed_at. Blank = all live listings. newSinceDays or removedSinceDays, if set, take precedence. |
countOnly | boolean | Return one row with the number of matching listings (matched, estimated, query) instead of the listings, charged as one result. Default false. |
freshDays | integer | Exclude rows last collected more than N days ago (scraped_at). Default 30 (90 when country is not US); set 0 to disable the age filter (other filters and delisting exclusions still apply). |
minLat, maxLat | float | Bounding-box latitude bounds in decimal degrees. Pair with the longitude bounds to return only listings inside a map box. |
minLng, maxLng | float | Bounding-box longitude bounds. Any combination of the four bounds is allowed; geo filters return geocoded rows only, and boxes crossing the 180° antimeridian are unsupported. |
sort | string | Result ordering: best (default), newest, oldest, cheapest, rent_desc, stable. best puts geocoded rows with a photo first, freshest first, mixed across sources; newest and oldest order by scraped_at; cheapest and rent_desc by monthly rent. |
maxItems | integer | Rows to return, 1 to 25,000. Default 25. You are charged per returned row. |
refresh | boolean | Re-collect the portal sources live at query time instead of serving the database. Slow (minutes), portal tier only. Default false. |
Set "timeWindow": "new_7d" for listings first seen in the last 7 days and "removed_7d" for listings confirmed gone at the source, each with removed_at. Run both weekly and a copy stays in sync. "countOnly": true returns just the number of matching listings.
Tell us your cities and what you are building. You get a sample in the production format and the listing count for your markets, usually within one business day.
Request a sample