Appearance
Zillow Scraper API
Turn zillow.com into structured real-estate data. Send a city and a state, get back normalized home listings - price, beds, baths, area, Zestimate, home type, days on Zillow - or point at one property URL and get the full record with facts and features, schools, price and tax history, photos and listing-agent attribution. No proxy pool, anti-bot handling or parser maintenance on your side.
It ships as two synchronous Scraper APIs sharing one field model:
| Product | Type | Product code | What it does |
|---|---|---|---|
| Zillow Listing API | Scraper API (synchronous) | zillow_listing | Search a city/neighborhood and get back normalized listing cards. |
| Zillow Property API | Scraper API (synchronous) | zillow_property | Give one property URL, get the full property detail. |
Every field is snake_case, the same convention as the Web Scraping API. Fields are returned in groups (location, pricing, overview, contact, media, features, neighborhood), with identifiers and primary collections at the top level.
What people build with it
| Use case | What you pull |
|---|---|
| Market research | Asking prices, Zestimates and days-on-market across a city or ZIP. |
| Comparable sales (comps) | Sold homes with price history, tax history and living area. |
| Lead generation | Listing agent, phone and brokerage per property. |
| Investment underwriting | HOA fees, property tax rate, year built, lot size and rent estimates. |
| Rental market tracking | For-rent buildings with per-unit beds and prices. |
Zillow Listing API
GET https://api.scrapeit.io/api/v1/scrape/zillow/listing
x-api-key: YOUR_SCRAPEIT_API_KEYcity and state are required and build the geography; everything else narrows the result set the same way the site's own filters do. One request returns one results page - up to 41 cards.
Basic parameters
| Parameter | Type | Example | Description |
|---|---|---|---|
city | string | Chicago | Required. Target city, e.g. Chicago. |
state | string | IL | Required. Two-letter US state code, e.g. IL. |
neighborhood | string | Lincoln Park | Optional neighborhood within the city, e.g. Lincoln Park. |
listing_status | string | for_sale | for_sale (default), for_rent or sold. |
home_types | string | houses,condos | houses, apartments, condos, townhomes, manufactured, lots_land, multi_family. |
min_price | number | 250000 | Minimum price in USD (monthly rent for for_rent). |
max_price | number | 500000 | Maximum price in USD (monthly rent for for_rent). |
min_bedrooms | number | 2 | Minimum bedrooms (0 = studio). |
max_bedrooms | number | 4 | Maximum bedrooms. |
min_bathrooms | number | 2 | Minimum bathrooms. |
page | number | 2 | 1-based results page. Defaults to 1. |
limit | number | 41 | Max listings to return, 1–41. Defaults to 41. |
include_detail | boolean | true | Also scrape each card's property page and nest it under detail. Billed one extra unit per card. |
Advanced filters ("More filters")
| Parameter | Type | Example | Description |
|---|---|---|---|
min_square_feet | number | 1200 | Minimum living area in square feet. |
max_square_feet | number | 2500 | Maximum living area in square feet. |
min_lot_size | number | 3000 | Minimum lot size in square feet. |
max_lot_size | number | 10000 | Maximum lot size in square feet. |
min_year_built | number | 1990 | Earliest construction year. |
max_year_built | number | 2024 | Latest construction year. |
max_hoa_fee | number | 300 | Maximum monthly HOA fee in USD. |
max_days_on_zillow | number | 30 | Only listings published within this many days. |
sort | string | newest | relevance, newest, price_high_low, price_low_high, bedrooms, bathrooms, square_feet, lot_size. |
keywords | string | garage | Free-text keyword filter, e.g. garage. |
has_pool | boolean | true | Only listings with a pool. |
has_garage | boolean | true | Only listings with a garage. |
has_air_conditioning | boolean | true | Only listings with air conditioning. |
is_waterfront | boolean | true | Only waterfront listings. |
is_new_construction | boolean | true | Only new-construction listings. |
has_open_house | boolean | true | Only listings with a scheduled open house. |
price_reduced | boolean | true | Only listings whose price was recently reduced. |
pets_allowed | boolean | true | Rentals only: listings that allow pets. |
include_html | boolean | true | Also return the fetched page HTML in html. Paid add-on: +4 credits per request. |
Example request
Search Chicago, IL for houses and condos under $500,000:
bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/zillow/listing' \
-H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
--data-urlencode 'city=Chicago' \
--data-urlencode 'state=IL' \
--data-urlencode 'home_types=houses,condos' \
--data-urlencode 'max_price=500000' \
--data-urlencode 'limit=41'js
const response = await fetch(
'https://api.scrapeit.io/api/v1/scrape/zillow/listing?' +
new URLSearchParams({ city: 'Chicago', state: 'IL', max_price: '500000', limit: '41' }),
{ headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
console.log(data.total_units, data.items.length);python
import requests
response = requests.get(
"https://api.scrapeit.io/api/v1/scrape/zillow/listing",
headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
params={"city": "Chicago", "state": "IL", "max_price": 500000, "limit": 41},
timeout=120,
)
data = response.json()["data"]
print(data["total_units"], len(data["items"]))Listing response
json
{
"data": {
"search_url": "https://www.zillow.com/chicago-il/?searchQueryState=...",
"geography": { "display": "Chicago IL", "city": "Chicago", "state": "IL", "region_id": 17426 },
"total_units": 5212,
"current_page": 1,
"total_pages": 20,
"results_per_page": 41,
"next_page_url": "https://www.zillow.com/chicago-il/?searchQueryState=...",
"result_count": 41,
"items": [
{
"zpid": "3712404",
"url": "https://www.zillow.com/homedetails/1133-W-Cornelia-Ave-APT-B-Chicago-IL-60657/3712404_zpid/",
"location": {
"street_address": "1133 W Cornelia Ave APT B",
"city": "Chicago",
"state": "IL",
"zip": "60657",
"latitude": 41.945084,
"longitude": -87.658295
},
"pricing": {
"price": "$775,000",
"price_value": 775000,
"zestimate": 801300,
"rent_zestimate": 5522,
"tax_assessed_value": 754300
},
"overview": {
"bedrooms": 3,
"bathrooms": 3,
"home_type": "TOWNHOUSE",
"home_status": "FOR_SALE",
"days_on_zillow": 3
},
"contact": { "broker_name": "Fulton Grace Realty", "phone": null },
"media": { "image_url": "https://photos.zillowstatic.com/fp/...jpg", "has_3d_model": true },
"open_houses": [{ "start": "2026-10-31T09:00:00", "end": "2026-10-31T11:00:00" }]
}
]
}
}Listing fields
| Group | Fields |
|---|---|
| top level | zpid, url, name, units, open_houses, detail |
location | street_address, unit, address, city, state, zip, country, latitude, longitude, is_undisclosed_address |
pricing | price, price_value, currency, zestimate, rent_zestimate, tax_assessed_value, price_change, price_change_date, base_rent_min, base_rent_max, required_monthly_fees_min, required_monthly_fees_max, price_includes_required_fees |
overview | available_units_count, listing_sub_types, highlights, bedrooms, bathrooms, living_area, living_area_units, lot_area_value, lot_area_unit, home_type, home_status, status_text, days_on_zillow, highlight_text |
contact | broker_name, phone |
media | image_url, image_count, images, has_video, has_3d_model |
flags | is_zillow_owned, is_featured, is_showcase, is_building, is_preforeclosure_auction, is_non_owner_occupied |
open_houseslists every scheduled showing as{ start, end }in the local time of the home, exactly as the card prints it (2026-10-31T09:00:00, no offset).listing_sub_typesnames the flags Zillow sets on the home:for_sale_by_agent,for_sale_by_owner,open_house,new_home,bank_owned,foreclosure,for_auction,coming_soon,pending.- Rental building cards add
available_units_count, the leasingphone, thehighlightschips ("34 available units","1.5 Months Free") and, when the building splits its price,base_rent_min/base_rent_maxwithrequired_monthly_fees_min/required_monthly_fees_max.price_includes_required_feessays whether the displayed price already contains those fees.
Zillow Property API
GET https://api.scrapeit.io/api/v1/scrape/zillow/property
x-api-key: YOUR_SCRAPEIT_API_KEY| Parameter | Type | Example | Description |
|---|---|---|---|
url | string | https://www.zillow.com/homedetails/1133-W-Cornelia-Ave-APT-B-Chicago-IL-60657/3712404_zpid/ | Required. Absolute zillow.com property URL (/homedetails/...). |
include_html | boolean | true | Also return the fetched page HTML in html. Paid add-on: +4 credits per request. |
Listing agent and brokerage attribution are always part of the record (the contact group). Any other parameter is rejected with 400 VALIDATION_ERROR.
bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/zillow/property' \
-H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
--data-urlencode 'url=https://www.zillow.com/homedetails/1133-W-Cornelia-Ave-APT-B-Chicago-IL-60657/3712404_zpid/'js
const response = await fetch(
'https://api.scrapeit.io/api/v1/scrape/zillow/property?' +
new URLSearchParams({ url: 'https://www.zillow.com/homedetails/x/3712404_zpid/' }),
{ headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
console.log(data.pricing.price, data.contact.agent_name);python
import requests
response = requests.get(
"https://api.scrapeit.io/api/v1/scrape/zillow/property",
headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
params={"url": "https://www.zillow.com/homedetails/x/3712404_zpid/"},
timeout=120,
)
print(response.json()["data"]["pricing"]["price"])Property fields
| Group | Fields |
|---|---|
| top level | zpid, url, canonical_url, name, price_history, tax_history, at_a_glance_facts, open_houses |
location | address, street_address, city, state, zip, neighborhood, county, county_fips, parcel_id, country, latitude, longitude, time_zone |
pricing | price, currency, zestimate, rent_zestimate, price_per_square_foot, tax_assessed_value, tax_annual_amount, property_tax_rate, monthly_hoa_fee, last_sold_price, date_sold, price_change, price_change_date |
overview | home_type, home_status, description, year_built, living_area, lot_area_value, bedrooms, bathrooms, bathrooms_full, bathrooms_half, stories, days_on_zillow, listing_sub_types, is_showcase, home_insights, page_view_count, favorite_count, mls_id, mls_name |
contact | agent_name, agent_phone, agent_email, broker_name, broker_phone, listing_provider, is_listed_by_owner |
media | photo_count, images, virtual_tour_url, has_video |
features | appliances, heating, cooling, flooring, interior_features, exterior_features, parking_features, has_garage, garage_parking_capacity, parking_capacity, has_view, view, architectural_style, construction_materials, roof_type, water_source, sewer |
neighborhood | schools |
home_insights are the "What's special" phrases Zillow highlights ("Vintage decorative fireplace"). open_houses uses the same local-time { start, end } shape as the listing card; time_zone (America/Chicago) names the zone those times are in.
A field that the property page does not publish comes back as null (or an empty array) - never as a missing key, so your schema stays stable. A Zillow Showcase listing (is_showcase: true) serves a lighter page: its price and tax history, schools and Zestimates load in the browser after the page, so those fields come back empty for it.
No-code bulk scraper
Prefer a dashboard run and a file? Scrapers without code → Zillow Scraper takes the same filters, sweeps up to 20 result pages and produces three files:
- JSON - records grouped exactly like the API response (
location,pricing,overview, …). - CSV - one flat row per listing, columns prefixed by their group (
location_city,pricing_price), lists joined with|, so a spreadsheet stays readable. - XML - the same records with grouped elements under
<listings><listing>.
With include_detail, the property record is part of every file: nested under detail and grouped like the Property API in JSON and XML, and spread into detail_-prefixed columns in CSV (detail_location_latitude, detail_overview_year_built). Cards without detail leave those cells empty.
The same job is available over HTTP with an API key (x-api-key; scope scrapers:run to start, scrapers:read to poll) or a dashboard session:
POST https://api.scrapeit.io/api/v1/scrapers/zillow/jobs
GET https://api.scrapeit.io/api/v1/scrapers/zillow/jobs/{jobId}| Parameter | Type | Example | Description |
|---|---|---|---|
max_pages | number | 10 | Result pages to sweep, 1–20. Defaults to 5. |
output_format | array | ["json", "csv"] | One or more of json, csv, xml. Defaults to ["json"]; an empty list is rejected. |
Every listing filter above applies here too. limit caps the whole export rather than each page: limit: 30 writes the first 30 homes of the search, in Zillow's order. A home Zillow repeats on a later page is written once, and the sweep ends when Zillow serves a page it already served. A sweep of five pages or fewer without include_detail finishes inline and the POST already answers with the result-file ids; a larger sweep, or any sweep with include_detail, answers queued and finishes in the background, so poll the GET endpoint until status is finished (or failed). Pages already swept are kept and billed even when a later page is blocked - you never pay for a result you did not receive. A job started with an API key runs under that key, queued or not: its pages count in the key's usage.
Credits and billing
Both products bill per request under their own product code (billing & credits). With include_detail, each fetched property page is one extra unit; a card whose property page could not be read comes back without detail.
Price per request: 30 credits, flat, for a listing page and for a property page alike; proxy and rendering are included (request cost).
Limits and behavior
- One listing request returns one results page (up to 41 cards). Use
pageto walk further. - Every page is fetched live - never served from the shared cache - so prices and status are current.
include_detailfan-out is bounded by your plan's concurrency limit.- The Listing API answers synchronously, so with
include_detailthe cards whose property pages do not fit its reply time come back withoutdetail. The no-code scraper runs detail jobs in the background instead.
Related pages
- Apartments.com Scraper API - the same shape for rentals: listing search, property detail and no-code exports.
- Web Scraping API - the general single-URL scraper behind both site scrapers.
- Billing & credits - credit prices and plans.
- Files & artifacts - downloading result files.
- Managed Zillow scraping - ScrapeIt builds, runs and monitors the scraper for you and delivers ready-to-use data.