Zillow Rental Listings API: Rent Estimates and Availability at Scale
How to pull Zillow for-rent listings by location in Python — monthly rent, availability date, beds, baths, and Rent Zestimate — with no login or API key.
The actor referenced in this article. Pay only for results delivered.
There is no official Zillow Rentals API for developers. Zillow’s old rental listing endpoints were retired along with the rest of its public API surface, and the current data partnerships are gated to large property-management platforms and MLS-affiliated portals — not to a developer who wants rent comps for a ZIP code. Anyone building rental market tooling in 2026 is working from scraped data, one way or another.
The Zillow Rental Listings Scraper does the scraping part cleanly. It queries Zillow’s own for-rent search backend by location and returns monthly rent, availability date, beds, baths, square footage, property type, Rent Zestimate, and coordinates — structured JSON, no browser, no login.
What you get per listing
Each rental record includes:
- monthlyRent and priceLabel — the asking rent
- availableFrom — the move-in date Zillow publishes, when available
- beds, baths, sqft — the core size fields
- propertyType — apartment, house, townhouse, condo
- rentZestimate — Zillow’s automated rent estimate, when published for that listing
- address, city, state, zipCode, and latitude/longitude
- zpid and detailUrl for the individual listing
Not every field populates for every listing — availability dates and Rent Zestimates depend on what the individual landlord or property manager submits to Zillow — but the core fields (rent, beds, baths, sqft, location) are reliably present.
Pulling rentals by location
import os
from apify_client import ApifyClient
apify = ApifyClient(os.environ["APIFY_TOKEN"])
run = apify.actor("themineworks/zillow-rental-listings").call(run_input={
"location": "Austin, TX",
"maxItems": 200,
"minBeds": 1,
"rentalType": "APARTMENT",
})
rentals = list(apify.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Pulled {len(rentals)} rental listings")
location accepts a city and state, or a ZIP code, resolved automatically to a Zillow search region. rentalType filters to APARTMENT, HOUSE, TOWNHOUSE, or CONDO, and minRent/maxRent narrow by price.
Filtering by rent band and bedroom count
run = apify.actor("themineworks/zillow-rental-listings").call(run_input={
"location": "10001",
"maxItems": 100,
"minRent": 2500,
"maxRent": 4500,
"minBeds": 2,
})
filtered = [r for r in apify.dataset(run["defaultDatasetId"]).iterate_items()]
Because these filters are passed as actor input rather than applied client-side after a broad pull, you only pay for the results that already match your criteria — the actor filters server-side against Zillow’s search parameters.
Calculating average rent by bedroom count
A common first analysis on a rental dataset is average asking rent broken out by bedroom count, which is the baseline comparison for both a landlord setting rent and an investor underwriting a purchase.
from collections import defaultdict
by_beds = defaultdict(list)
for r in rentals:
if r.get("monthlyRent") and r.get("beds") is not None:
by_beds[r["beds"]].append(r["monthlyRent"])
for beds, rents in sorted(by_beds.items()):
avg = sum(rents) / len(rents)
print(f"{beds} bed: ${avg:,.0f}/mo average across {len(rents)} listings")
Comparing asking rent to Rent Zestimate
Where rentZestimate is present, it is a useful cross-check against the actual asking rent in the listing — the gap between Zillow’s automated estimate and what landlords are actually asking tells you whether a submarket is running above or below Zillow’s model.
gaps = [
(r["monthlyRent"] - r["rentZestimate"]) / r["rentZestimate"]
for r in rentals
if r.get("monthlyRent") and r.get("rentZestimate")
]
if gaps:
avg_gap = sum(gaps) / len(gaps)
print(f"Asking rents are averaging {avg_gap:+.1%} vs Rent Zestimate")
Use cases
Property management benchmarking. A property manager sets rent for a unit by comparing it against currently-listed comparable units nearby — not against a stale internal spreadsheet. Pulling live listings for the surrounding ZIP each time a unit turns over keeps pricing current with the actual market rather than a guess.
Investor rent underwriting. Before buying a rental property, an investor needs a realistic gross rent number for the model. Pulling comparable current listings by bed count and location gives a real market figure rather than relying on a single Rent Zestimate.
Rental market analysis. Tracking average asking rent by ZIP and bedroom count over time — running the same pull monthly and storing results — builds a rent-trend dataset that shows which submarkets are tightening or softening.
Renter and landlord lead lists. Fresh rental inventory in a target area is useful both to renters searching directly and to services that aggregate listings for a niche audience (student housing near a specific campus, pet-friendly units, etc.).
For short-term rental comparisons specifically, where the question is Airbnb versus long-term lease economics rather than long-term rent alone, see our Airbnb vs Zillow Rental Listings guide.
Wiring it into an MCP agent
The actor is available as a hosted MCP server for use directly inside Claude or any MCP-compatible client:
https://mcp.apify.com/?tools=themineworks/zillow-rental-listings
Connected, you can ask something like “pull 2-bedroom apartment rentals in Austin under $2,800/mo and tell me the average rent” and get the answer back in the conversation without writing any code.
Where this fits in a broader real estate data stack
Rent data is one leg of a full property picture. Paired with the Zillow Search Scraper for active for-sale listings and the Zillow Recently Sold Scraper for sold comps, you can build gross rent multiplier and cap rate models across a metro without touching three different paid data subscriptions. For a full walkthrough of combining Zillow with Redfin and Realtor.com data, see Building a Real Estate Data Stack: Zillow, Redfin, and Realtor.com.
Pricing
Results cost $1 per 1,000 ($0.001 each), with nothing charged on failed or empty pulls. Pulling 200 rentals for a metro-wide analysis costs $0.20; a monthly recurring pull across ten ZIP codes for a property management company runs a few dollars a month.
Frequently Asked Questions
Does this cover short-term rentals like Airbnb?
No. This actor covers Zillow’s long-term for-rent listings (apartments, houses, condos, townhouses submitted for lease). For short-term rental data, a different data source like Airbnb is needed — see the linked comparison above.
Why is availableFrom sometimes missing?
Not every landlord or property manager submits a move-in date to Zillow. When the field is absent from Zillow’s own listing data, it is omitted from the record rather than filled with a guess.
Can I filter by property type?
Yes. Set rentalType to APARTMENT, HOUSE, TOWNHOUSE, or CONDO to narrow results to one property type.
Do I need a Zillow account or API key?
No. The scraper requires no login, no cookies, and no API key — just an Apify account to run it.
Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.
Airbnb Scraper: Listing Prices, Ratings, and Availability Without the API
Airbnb has no public listings API. Here's how to pull nightly price, rating, superhost status and coordinates from Airbnb search results using Python.
Maps Leads: Verified Email Extraction from Google Maps Business Listings
How to pull B2B leads from Google Maps with MX-verified emails, past the official API's 120-result cap, and pay only for contactable businesses.
Realtor.com Scraper: Property and Agent Data Without the MLS Paywall
Scrape Realtor.com listings in Python — price, beds, baths, county, and the listing agent + brokerage office on every record. No login, no API key.