Skip to content

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:

ProductTypeProduct codeWhat it does
Zillow Listing APIScraper API (synchronous)zillow_listingSearch a city/neighborhood and get back normalized listing cards.
Zillow Property APIScraper API (synchronous)zillow_propertyGive 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 caseWhat you pull
Market researchAsking 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 generationListing agent, phone and brokerage per property.
Investment underwritingHOA fees, property tax rate, year built, lot size and rent estimates.
Rental market trackingFor-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_KEY

city 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 ​

ParameterTypeExampleDescription
citystringChicagoRequired. Target city, e.g. Chicago.
statestringILRequired. Two-letter US state code, e.g. IL.
neighborhoodstringLincoln ParkOptional neighborhood within the city, e.g. Lincoln Park.
listing_statusstringfor_salefor_sale (default), for_rent or sold.
home_typesstringhouses,condoshouses, apartments, condos, townhomes, manufactured, lots_land, multi_family.
min_pricenumber250000Minimum price in USD (monthly rent for for_rent).
max_pricenumber500000Maximum price in USD (monthly rent for for_rent).
min_bedroomsnumber2Minimum bedrooms (0 = studio).
max_bedroomsnumber4Maximum bedrooms.
min_bathroomsnumber2Minimum bathrooms.
pagenumber21-based results page. Defaults to 1.
limitnumber41Max listings to return, 1–41. Defaults to 41.
include_detailbooleantrueAlso scrape each card's property page and nest it under detail. Billed one extra unit per card.

Advanced filters ("More filters") ​

ParameterTypeExampleDescription
min_square_feetnumber1200Minimum living area in square feet.
max_square_feetnumber2500Maximum living area in square feet.
min_lot_sizenumber3000Minimum lot size in square feet.
max_lot_sizenumber10000Maximum lot size in square feet.
min_year_builtnumber1990Earliest construction year.
max_year_builtnumber2024Latest construction year.
max_hoa_feenumber300Maximum monthly HOA fee in USD.
max_days_on_zillownumber30Only listings published within this many days.
sortstringnewestrelevance, newest, price_high_low, price_low_high, bedrooms, bathrooms, square_feet, lot_size.
keywordsstringgarageFree-text keyword filter, e.g. garage.
has_poolbooleantrueOnly listings with a pool.
has_garagebooleantrueOnly listings with a garage.
has_air_conditioningbooleantrueOnly listings with air conditioning.
is_waterfrontbooleantrueOnly waterfront listings.
is_new_constructionbooleantrueOnly new-construction listings.
has_open_housebooleantrueOnly listings with a scheduled open house.
price_reducedbooleantrueOnly listings whose price was recently reduced.
pets_allowedbooleantrueRentals only: listings that allow pets.
include_htmlbooleantrueAlso 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 ​

GroupFields
top levelzpid, url, name, units, open_houses, detail
locationstreet_address, unit, address, city, state, zip, country, latitude, longitude, is_undisclosed_address
pricingprice, 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
overviewavailable_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
contactbroker_name, phone
mediaimage_url, image_count, images, has_video, has_3d_model
flagsis_zillow_owned, is_featured, is_showcase, is_building, is_preforeclosure_auction, is_non_owner_occupied
  • open_houses lists 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_types names 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 leasing phone, the highlights chips ("34 available units", "1.5 Months Free") and, when the building splits its price, base_rent_min/base_rent_max with required_monthly_fees_min/required_monthly_fees_max. price_includes_required_fees says 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
ParameterTypeExampleDescription
urlstringhttps://www.zillow.com/homedetails/1133-W-Cornelia-Ave-APT-B-Chicago-IL-60657/3712404_zpid/Required. Absolute zillow.com property URL (/homedetails/...).
include_htmlbooleantrueAlso 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 ​

GroupFields
top levelzpid, url, canonical_url, name, price_history, tax_history, at_a_glance_facts, open_houses
locationaddress, street_address, city, state, zip, neighborhood, county, county_fips, parcel_id, country, latitude, longitude, time_zone
pricingprice, 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
overviewhome_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
contactagent_name, agent_phone, agent_email, broker_name, broker_phone, listing_provider, is_listed_by_owner
mediaphoto_count, images, virtual_tour_url, has_video
featuresappliances, 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
neighborhoodschools

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}
ParameterTypeExampleDescription
max_pagesnumber10Result pages to sweep, 1–20. Defaults to 5.
output_formatarray["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 page to walk further.
  • Every page is fetched live - never served from the shared cache - so prices and status are current.
  • include_detail fan-out is bounded by your plan's concurrency limit.
  • The Listing API answers synchronously, so with include_detail the cards whose property pages do not fit its reply time come back without detail. The no-code scraper runs detail jobs in the background instead.

ScrapeIt Web Scraping API documentation. Managed web scraping services: www.scrapeit.io.