Build with HousingFeed.
Start with the product you use. Display Feed delivery and Data API access have different setup instructions and usage rights.
Integrate licensed listings and apply weekly updates.
Integration guide ↓ For internal useData APIQuery the database through Apify for research and analysis.
API reference ↓From sample to integration.
Review a sample for your locations, then agree the delivery format and access details during setup. CSV and JSON exports are available; API delivery is arranged for your agreed scope.
Check your sample.
Inspect the populated fields, missing values and source links. Confirm the locations and listing details your product needs.
Agree delivery and identifiers.
Use the schema supplied with your sample. Customer exports use
uidas the stable identifier; the Data API below usesid. Confirm the format before building your importer.Apply weekly updates.
Add new records, update changed records by their identifier and remove delisted records from display on your next sync. Keep the source URL and verification date with each record.
Customer export fields
These are the current CSV columns, generated from the export format. JSON exports can contain additional fields; your supplied sample defines the format for your integration.
| Group | CSV fields |
|---|---|
| Identity & source | uid, listing_id, url |
| Location | address, street, city, state, zip, lat, lng |
| Rent | rent_min, rent_max, rent_usd |
| Property | beds, baths, sqft_min, sqft_max, property_type, furnished |
| Availability & content | available, image, n_photos, description, amenities |
| Verification | last_seen_at |
Missing values are not zero: preserve nulls in JSON and empty CSV cells. Zero bedrooms means a studio. Keep ZIP codes as strings so leading zeros survive.
Keep attribution with the listing.
Show the publishing manager or owner, link to the source listing and send enquiries there. Display photos using the supplied URLs. The public Data API and its credentials do not grant display rights.
Display rights →Licence terms →Data API reference
The reference below covers the Apify Data API: authentication, query parameters, response fields and examples. It includes manager-direct sources and consumer portals. Public display requires a separate Display Feed licence.
Data API product overview →Try it live, no key needed
Preview up to 10 records. This public sample endpoint is a preview tool; the authenticated Data API endpoint and parameters are documented below.
managerDirectOnly limits the Data API to manager-direct sources (the Display Feed universe; see manager-direct only). The sample additionally requires a photo; the API expresses that preference through sort: best, which ranks rows with a photo and coordinates first.
Quickstart
The Data API is delivered as an Apify actor. You send one POST request with your filters as JSON and get an array of listing rows 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 freshest rows across all sources.# 2-bed listings in Austin, TX under $2,500 a month
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":"TX","city":"Austin","minBeds":2,"maxRent":2500,"maxItems":200}'
To request CSV from the endpoint above, append &format=csv after the token parameter.
Authentication
Every request needs your Apify API token, passed as a query-string parameter. You find it in your Apify account under Settings, Integrations. Keep it secret and 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 rows. See Response schema. |
run-sync-get-dataset-items runs the actor and returns the dataset in one blocking call, which suits 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 freshest rows across all sources and countries. This table is generated from the actor's input schema.
| Field | Type | Description |
|---|---|---|
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. 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). 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. |
availableNow | boolean | Only listings marked available now. Default false. |
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. |
freshDays | integer | Exclude rows last collected more than N days ago (scraped_at). Default 30; 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. 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 5,000. Default 100. 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. |
Response schema
The API returns a JSON array of listing rows. Every row has the same 35 fields in the same order whatever the source or country. Any field can be null. The coverage column marks fields whose fill rate depends on what the source publishes; an unmarked field is not a completeness guarantee. Inspect your sample for actual field availability. This table is generated from the API's public field list.
| Field | Type | Meaning | Coverage |
|---|---|---|---|
id | string | Stable opaque listing key (hf_ + 20 characters), the same in every run. Dedupe on it across runs and diff a newSinceDays pull against your own store. | |
source_type | string | manager_direct (published by the property manager or owner on their own software or website) or portal. | |
listing_id | string | The source's own listing identifier. | |
url | string | Link to the listing at its source. | |
address | string | Full address as published. | |
street | string | Street component of the address. | |
city | string | City as labelled at the source. | |
canonical_city | string | Metro rollup of city: borough and ward labels collapse to the parent metro (New York boroughs to New York). Group on this for market-level aggregation. | |
state | string | State or region code. | |
zip | string | ZIP or postal code. | |
country | string | Country code supplied by the source or inferred from its platform. | |
lat | float | Latitude in decimal degrees. | varies by source |
lng | float | Longitude in decimal degrees. | varies by source |
rent_min | number | Lowest monthly rent advertised, in the native currency. | |
rent_max | number | Highest monthly rent advertised, when supplied; may be null. | |
currency | string | Native currency code, derived from the country. | |
rent_usd | number | Approximate USD rent using configured conversion rates, not a live exchange-rate quote. | |
rent_per_sqft | number | rent_usd divided by sqft_min; null when the size is missing or implausible. | |
rent_per_sqm | number | The same figure per square metre. | |
beds | float | Bedroom count (0 = studio). | |
baths | float | Bathroom count. | |
sqft_min | number | Lower bound of the floor area, in square feet. | varies by source |
sqft_max | number | Upper bound of the floor area, in square feet. | varies by source |
property_type | string | Common labels include apartment, house, condo, townhouse, studio, room and other source labels. | |
furnished | boolean | Furnished status when supplied; null when unknown. | |
available | string | Availability as published, for example "Now" or a date. | varies by source |
units_available | integer | Unit count for floorplan-level rows. | |
granularity | string | "unit" or "floorplan". | |
image | string | Primary photo URL. | varies by source |
images | array of strings | Collected photo URLs; not necessarily the complete source gallery. | varies by source |
description | string | Collected listing description; may be cleaned during processing. | varies by source |
amenities | array of strings | Amenity labels as published. | varies by source |
first_seen_at | string | ISO-8601 timestamp of the first time HousingFeed saw this listing. | |
last_seen_at | string | ISO-8601 timestamp of the last time the listing was verified live at its source. | |
scraped_at | string | ISO-8601 timestamp of the collection run that produced this row. |
Freshness fields
Three timestamps tell you how current each row is, so you can judge freshness yourself instead of trusting a label.
first_seen_at: the first time HousingFeed saw this listing.newSinceDaysfilters on it, which selects new records only, not changes or removals.last_seen_at: the last time the listing was verified live at its source. A listing whose source stops publishing it is marked delisted and no longer returned.scraped_at: the collection run that produced the row.freshDaysfilters on it; by default rows last collected more than 30 days ago are excluded.
Delisted rows are excluded from responses. An ID missing from a filtered or capped query is not proof of removal. Reconcile only against a complete agreed snapshot or an explicit removal set; never delete records because a request failed.
Example response
One real row from the sample endpoint, rendered in schema order. The build refreshes it; the images list is shortened to three URLs for display.
[
{
"id": "hf_46a5e765a1db8b36d537",
"source_type": "manager_direct",
"listing_id": "2720698-D-4203",
"url": "https://www.camdenliving.com/apartments/dallas-tx/camden-belmont/available-apartments?unit=4203",
"address": "2500 Bennett Ave #4203, Dallas, TX 75206",
"street": "2500 Bennett Ave",
"city": "Dallas",
"canonical_city": null,
"state": "TX",
"zip": "75206",
"country": "US",
"lat": 32.813148,
"lng": -96.782188,
"rent_min": 2379,
"rent_max": 2379,
"currency": "USD",
"rent_usd": 2379,
"rent_per_sqft": 1.8,
"rent_per_sqm": 19.38,
"beds": 2,
"baths": 2,
"sqft_min": 1325,
"sqft_max": 1325,
"property_type": "apartment",
"furnished": null,
"available": "2026-10-23",
"units_available": null,
"granularity": "unit",
"image": "https://images.ctfassets.net/pg6xj64qk0kh/1RKAhV2BvxWt7rp1ik1ZMk/d953ab013c6ff5e0aa4fe65895231b29/camden-belmont-apartments-dallas-texas-floor-plan-Mulberry_3.jpg",
"images": [
"https://images.ctfassets.net/pg6xj64qk0kh/1RKAhV2BvxWt7rp1ik1ZMk/d953ab013c6ff5e0aa4fe65895231b29/camden-belmont-apartments-dallas-texas-floor-plan-Mulberry_3.jpg"
],
"description": "Camden Belmont features one, two and three-bedroom apartments and two-bedroom townhomes centrally located in the vibrant Knox-Henderson district near Greenville",
"amenities": [
"Parking",
"Balcony / patio",
"Pool",
"Fitness center",
"Fireplace"
],
"first_seen_at": "2026-09-08T18:10:09+00:00",
"last_seen_at": "2026-09-27T05:22:29+00:00",
"scraped_at": "2026-09-27T05:22:29+00:00"
}
]
Query examples
These examples use the input parameters documented above. Source filters do not grant display rights or guarantee that every matching row qualifies for the Display Feed.
New listings: first seen this week
Select rows first seen in the last seven days and deduplicate by id. This does not return changed or removed records. Results are capped by maxItems; a capped query is not a complete sync.
{ "country": "US", "state": "NY", "newSinceDays": 7, "maxItems": 1000 }
Manager-direct sources only
Restrict the query to listings published by property managers and owners on their own software or websites rather than portals. Each row's source_type says which kind it is.
{ "managerDirectOnly": true, "state": "FL", "maxItems": 2000 }
Bounding box
Pass a map box and get the geocoded rows inside it, all sources, one schema. Downtown Miami:
{ "minLat": 25.70, "maxLat": 25.86, "minLng": -80.32, "maxLng": -80.10, "maxItems": 500 }
Freshness & cadence
Sources are not all on the same clock, and the API does not pretend they are.
Display Feed sources are checked weekly. Data API sources have different collection schedules; the dated source list below describes the saved coverage snapshot. Check each returned record’s timestamps. A scheduled refresh does not guarantee a successful verification of all records.
Every row carries first_seen_at, last_seen_at and scraped_at, and freshDays (default 30 days) keeps old snapshot rows out unless you ask for them. Confirm source scope and freshness when requesting your sample.
Display Feed sources are checked weekly. Data API source schedules vary; inspect returned timestamps and confirm freshness in your sample.
Limits & pricing
Check the Data API on Apify for current pricing. Each run returns at most 5,000 rows. This actor input has no cursor or offset parameter: narrow your filters or contact us for a complete export.
Versioning, rate limits and errors on housingfeed.com
The keyless sample lives at /api/v1/sample (/api/sample is an alias). Every response carries X-API-Version: 1 and the RFC RateLimit fields (RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset; about 30 requests per 10 minutes per IP), with Retry-After on a 429. Errors are JSON with a stable code (RATE_LIMITED, UPSTREAM_UNAVAILABLE, NOT_FOUND) and a hint. Treat this endpoint as a preview. A partial response means some sources failed; complete describes request completion, not a complete inventory export. Results remain capped at 10 records. The full contract, including the Data API actor's input schema, is openapi.json.
Rights
The Data API grants internal use only: research, analytics, internal tools and model evaluation within the general terms. Public display requires the Display Feed licence. See the Display Feed and the Display Feed terms.