Rental Listings API documentation
Try it live — no signup
Real data, straight from the feed. Run a query and see the actual JSON a paying key returns — capped at 10 results, no key required.
Quickstart
The HousingFeed Rental Listings API is delivered as an Apify actor. You send a single POST request with your filters as JSON, and get an array of rental listings back synchronously. No SDK, no proxies, no infrastructure on your side.
YOUR_TOKEN with your Apify API token and run the request below. Leave the body as {} to get the latest listings across all platforms.# 2-bed listings in California under $3,000/mo
curl -X POST "https://api.apify.com/v2/acts/housingfeed~rental-listings-api/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"country": "US",
"state": "CA",
"minBeds": 2,
"maxRent": 3000,
"maxItems": 100
}'
Authentication
Every request needs your Apify API token, passed as a query-string parameter. You can find it in your Apify account under Settings → Integrations. Keep it secret, treat it like a password.
Endpoint
| Method | POST |
|---|---|
| URL | https://api.apify.com/v2/acts/housingfeed~rental-listings-api/run-sync-get-dataset-items |
| Query | ?token=YOUR_TOKEN |
| Body | JSON object of filters (all optional). See Input parameters. |
| Returns | JSON array of listing objects. See Response schema. |
run-sync-get-dataset-items runs the actor and returns the dataset in one blocking call, ideal for direct queries. For large or scheduled pulls, use the standard async Apify run endpoints and read the dataset when the run finishes.
Input parameters
All fields are optional. Send an empty body {} to get the latest listings across every platform and country.
| Field | Type | Description |
|---|---|---|
country | string | ISO-style 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. Blank = all countries. |
state | string | US state code (e.g. CA, NY, TX) or region. Blank = all. |
city | string | City name, partial match (e.g. "Los Angeles"). Blank = all. |
minLat, maxLat | float | Bounding-box latitude bounds (decimal degrees). Pair with the longitude bounds to return only listings inside a map box. |
minLng, maxLng | float | Bounding-box longitude bounds (decimal degrees). Any combination of the four is allowed; geo filters return geocoded listings only, and boxes crossing the 180° antimeridian are unsupported. |
minRent | integer | Minimum monthly rent, in the listing's local currency. |
maxRent | integer | Maximum monthly rent, in the listing's local currency. |
minBeds | integer | Minimum number of bedrooms. |
maxBeds | integer | Maximum number of bedrooms. |
platform | string | Restrict to one source (e.g. appfolio, zumper, immoweb, rightmove). Blank = all. |
availableNow | boolean | Only return listings marked available now. Default false. |
sort | string | Result ordering. One of newest (default, most recently scraped first), oldest, cheapest (lowest rent first), or rent_desc (highest rent first). |
maxItems | integer | Max listings to return. Default 100, up to 5000. |
refresh | boolean | Live-refresh: re-scrape the portal platforms at query time for the freshest data. Slower. Default false. |
# every listing in downtown Miami — all platforms, one schema
{ "minLat": 25.70, "maxLat": 25.86, "minLng": -80.32, "maxLng": -80.10, "maxItems": 100 }
Response schema
The API returns a JSON array of listing objects. Every listing shares the same shape regardless of source, every field is nullable, and coverage varies by platform.
| Field | Type | Description |
|---|---|---|
uid | string | Stable primary key, unique across the whole feed. Use it for client-side dedup. |
platform | string | Source platform the listing came from. |
source_id | string | Company subdomain / account id on that platform. |
listing_id | string | Platform-local listing id. |
url | string | Link to the original listing. |
address | string | Full address as displayed. |
street, city, state, zip | string | Parsed address components. |
country | string | Country code, derived at load. |
canonical_city | string | Metro rollup of city: borough/ward labels collapse to the parent metro (Tokyo's 23 wards → Tokyo, NYC boroughs → New York). Group on this for market-level aggregation; city stays as-labelled. |
lat, lng | float | Coordinates where available. |
rent_min, rent_max | integer | Monthly rent range in native currency. |
currency | string | Native currency code, derived from country. |
rent_usd | number | Rent converted to USD for cross-market comparison. |
beds, baths | float | Bedroom / bathroom counts. |
sqft_min, sqft_max | integer | Floor-area range where available. |
property_type | string | e.g. apartment, house, condo (where provided). |
furnished | boolean | True for furnished / mid-term listings. |
available | string | Raw availability string, e.g. "NOW" or a date. |
units_available | integer | Floorplan-level unit count where applicable. |
image | string | Primary listing photo URL. |
granularity | string | "unit" or "floorplan". |
scraped_at | string | ISO-8601 timestamp of when the record was scraped. |
updated_at | string | ISO-8601 timestamp of the record's last update. |
Example response
[
{
"platform": "appfolio",
"source_id": "aberdeenrealty",
"listing_id": "206",
"url": "https://aberdeenrealty.appfolio.com/listings/detail/40dd11be-…",
"address": "2528 Pacific Ave. #2, Hoquiam, WA 98550",
"city": "Hoquiam",
"state": "WA",
"zip": "98550",
"country": "US",
"rent_min": 1550,
"rent_max": 1550,
"currency": "USD",
"rent_usd": 1550,
"beds": 2,
"baths": 1,
"available": "NOW",
"image": "https://images.cdn.appfolio.com/…/medium.jpeg",
"granularity": "unit",
"scraped_at": "2026-07-03T21:43:31Z"
}
]
Freshness
The feed is refreshed by a scheduled harvester that re-scrapes the network on a recurring cron. Each record's scraped_at tells you exactly when it was captured. When you need the absolute latest data for the portal platforms, set "refresh": true in your request body to re-scrape at query time (this is slower, leave it off for fast snapshot queries).
Limits & pricing
The actor runs on Apify with pay-per-use pricing from $2 per 1,000 listings ($0.002 per result). maxItems caps results per run (up to 5,000). Higher run limits, live-refresh, and bulk dataset exports are available on paid plans, see Pricing. For full-country exports or custom sources, talk to us about Enterprise.