Zillow Rental Data Scraper API
Our Zillow rental data API takes a location and a for_rent filter and returns every rental listing with its rent price, beds, baths, and square footage as structured JSON, so you can collect rent prices and rental listings for any city or ZIP in one call.
Why Zillow Rental data is tough at scale
Zillow's own rental data ships only as bulk research files like the Zillow Observed Rent Index, with no per-listing API, so current asking rents for a ZIP are not available as clean data. The rentals page holds them, but it sits behind PerimeterX and buries each listing in a hydration blob you have to parse out of an HTML comment.
Run the Zillow Rental Data Scraper API in one call
curl "https://api.zillowscraperapi.com/api/v1/zillow/search?location=Seattle,%20WA&status=for_rent&page=1&api_key=$API_KEY" import requests
BASE = "https://api.zillowscraperapi.com"
API_KEY = "YOUR_API_KEY"
# for_rent returns rental listings; price holds the monthly asking rent.
data = requests.get(
f"{BASE}/api/v1/zillow/search",
params={
"location": "Seattle, WA",
"status": "for_rent",
"page": 1,
"api_key": API_KEY,
},
timeout=30,
).json()
print(data["total_results"], "rentals in", data["location"])
for unit in data["results"]:
print(unit["address_zip"], f"${unit['price']:,}/mo", unit["beds"], "bd", unit["baths"], "ba", unit["sqft"], "sqft") Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
location | required | - | The place to pull rentals for: a city and state (Seattle, WA), a ZIP code, or a neighborhood. This is the primary parameter. |
status | optional | for_sale | Set to for_rent to return rental listings (rent under the price field). Also accepts for_sale and sold. |
url | optional | - | A Zillow rentals results URL to scrape directly, as an alternative to passing a location. |
page | optional | 1 | 1-based results page. Zillow paginates the rental list; page holds about 40 units. Range 1 to 20. |
limit | optional | 100 | Maximum rows to return, from 1 to 500. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
The Zillow Rental Data Scraper API JSON response
{
"query": "Seattle, WA",
"location": "Seattle, WA",
"page": 1,
"total_results": 10,
"results_count": 10,
"results": [
{
"position": 1,
"id": "463504654",
"title": "6505 44th Avenue NE, Seattle, WA 98115",
"url": "https://www.zillow.com/homedetails/6505-44th-Ave-NE-Seattle-WA-98115/463504654_zpid/",
"price": 899900,
"currency": "USD",
"beds": 3,
"baths": 3,
"sqft": 1422,
"zpid": "463504654",
"address_street": "6505 44th Avenue NE",
"address_city": "Seattle",
"address_state": "WA",
"address_zip": "98115",
"zestimate": null,
"status": "FOR_SALE",
"status_text": "Active",
"home_type": "SINGLE_FAMILY",
"latitude": 47.675953,
"longitude": -122.281136,
"has_image": true,
"builder_name": "Enduring Estates LLC"
}
]
} | Field | Type | Description |
|---|---|---|
query | string | The location you searched, echoed back. |
location | string | The resolved location string for the results. |
page | integer | The results page returned, starting at 1. |
total_results | integer | Number of listings in the results array for this page. |
results | array | The rental listings for this location, each with the fields below. |
results[].price | integer | The monthly asking rent in whole dollars for a for_rent listing. |
results[].beds | integer | Bedroom count for the unit. |
results[].baths | integer | Bathroom count for the unit. |
results[].sqft | integer | Living area in square feet, used for rent-per-square-foot math. |
results[].address_street | string | Street address of the rental. |
results[].address_city | string | City of the rental. |
results[].address_state | string | Two-letter state of the rental. |
results[].address_zip | string | ZIP code of the rental, for grouping rent data by ZIP. |
results[].home_type | string | Unit type, e.g. SINGLE_FAMILY, CONDO, APARTMENT. |
results[].status | string | Raw listing status, e.g. FOR_RENT. |
results[].zpid | string | The stable Zillow id, ready to pass to the property endpoint for full detail. |
results[].latitude | number | Rental latitude for mapping and geographic joins. |
results[].longitude | number | Rental longitude for mapping and geographic joins. |
Ways teams use this data
Rent price data by ZIP
Rental market tracking
Rent-per-square-foot analysis
Investor and landlord comps
Relocation and search tools
PropTech and CRM enrichment
Where our Zillow Rental Data Scraper API stands out
Give us a location with a for_rent filter and we run the proxied fetch, PerimeterX handling, and parsing, then return every rental's rent, size, and address as a ranked JSON array. One request covers a whole page of a rental market in about 2.6 seconds, with a stable schema, no rent-index CSV to reshape, and a 1,000-request free tier.
for_rent filter
Location or URL input
PerimeterX handling built in
Rent, size, and geo per unit
Chains into the property endpoint
Pay for success
Zillow Rental Data Scraper API vs DIY and the Zillow API
| Our API | Zillow rent index (ZORI) | DIY (requests / headless) | |
|---|---|---|---|
| Per-listing asking rent | Live JSON per location | Aggregate index only | Manual fetch and parse |
| Freshness | Current page at request time | Monthly file refresh | Current, if unblocked |
| Beds, baths, size | Included per rental | Not in the index files | You parse it yourself |
| Setup | API key only | Download and reshape CSV | Residential proxies and parsers |
| Anti-bot (PerimeterX) | Handled for you | Not applicable | You solve the challenge |
| Output shape | Stable flat JSON | CSV you reshape | Whatever you parse |
Free to test, cheap to scale
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
Send one GET request to our zillow/search endpoint with a location and status set to for_rent, plus your api_key. The response is a results array where each rental carries its monthly asking rent under the price field, along with beds, baths, square footage, address, ZIP, and coordinates. We handle the proxies, Zillow's PerimeterX challenge, and parsing, so you collect rent prices for a ZIP or city without running a scraper yourself.
Zillow publishes rental market data as bulk research files, most notably the Zillow Observed Rent Index, but it does not offer a public API that returns per-listing asking rents for a given ZIP. Our Zillow rental data API reads the public rentals pages and returns each listing's rent and details as structured JSON, filling the listing-level gap the research downloads leave.
For a for_rent search, the monthly asking rent comes back in the price field of each result, in whole dollars. The example response on this page shows the shared search schema (a for-sale example, where price is the list price); when you pass status=for_rent, the same fields describe rentals and price holds the rent. We never relabel or invent fields, so the shape stays identical across statuses.
The endpoint returns the live rental listings on Zillow at request time, so it captures current asking rents. To build a monthly history, run the same location on a schedule and store the results, which gives you a time series of asking rents you control. For market-level historical rent, Zillow's Observed Rent Index research files remain the source, and this API complements them with current per-listing data.
One request returns a single results page, which holds roughly 40 units, and you can raise the limit parameter up to 500 or page deeper with the page parameter (1 to 20). Zillow caps a given search around a few hundred results, so covering a large metro means splitting it into tighter locations or ZIP codes and paging through each.
Median end-to-end response is about 2.6 seconds per page, including proxy routing, PerimeterX handling, retries, and parsing. You are billed only for successful requests, so blocked fetches we retry behind the scenes do not land on your bill. The free tier includes 1,000 requests to test against real locations first.