Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Zillow API page →
Real Estate

Zillow API & Scraper

The Zillow API returns US real-estate data — for-sale, rental and sold listings — as clean JSON.

14 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary search endpoint returns properties with zpid, URL, list price, status, type, beds, baths, square footage, lot size, the Zestimate and the rent estimate — the data you would otherwise scrape from a Zillow search page. You can also search by coordinates or by URL, pull a full property_detail, run comps, list sold history and fetch agent profiles. It is built for real-estate investors, brokerage tools and property dashboards that need live listing and valuation data without fighting Zillow's anti-bot defenses. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

Vocabularies and types that change between actions

Zillow's filter words are not Zillow's response words, and the same field can be a float in one action and an int in another. Everything below was measured on Austin, TX inventory — 123 listings across three search pages plus a property_detail on zpid 464181906.

FieldWhat comes backWatch out for
home_type (filter)house · condo · townhouse · multi_family · land · manufactured · apartmentthese are the words you send
property_type (response)SINGLE_FAMILY · CONDO · TOWNHOUSE · MULTI_FAMILY · MANUFACTUREDthese are the words you get back — 'house' becomes SINGLE_FAMILY, and matching the filter string against the response never hits
statusFOR_SALE (uniform across all 123 measured rows)the enum. Filter on this.
status_textActive · House for sale · Home for sale · Zillow Previewfree display text, four distinct values under one status. Never filter on it.
beds / baths / sqftfloats from search (4.0, 3.0, 2586.0), ints from property_detail (4, 3, 2586)same property, two numeric types
zpidinteger in items[], string in map_pins[]both in the same response — normalize before you join them
lot_sqft24668.03 — square feet, always43,560 sqft = 1 acre. That measured lot is 0.57 acres, not 24,668 of anything a customer recognizes.
days_on_market60 from search, null from property_detail for the same zpidsearch is the reliable source for this one
zestimate_usdnull on 104 of 123 measured search rowsnot a search limitation — see the FAQ below

A search page is atomic: asking for max_results 3 returned 41 listings, because Zillow serves ~41 per page and the page comes back whole. max_results caps across pages, not within one. Requesting 200 across 3 pages returned 123.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/zillow/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "location": "Austin, TX"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "zillow",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 4621.2,
    "record_count": 41,
    "bytes": 1146281,
    "cache_hit": false,
    "completeness_pct": 100,
    "completeness_fields": 12,
    "completeness_basis": "search",
    "location": "Austin, TX",
    "map_bounds": {
      "west": -98.246758,
      "east": -97.346758,
      "south": 29.93245,
      "north": 30.63245
    },
    "filters_applied": null
  },
  "data": {
    "items": [
      {
        "zpid": 80104300,
        "source": "zillow",
        "url": "https://www.zillow.com/homedetails/8112-Alophia-Dr-Austin-TX-78739/80104300_zpid/",
        "list_price_usd": 665000,
        "price_display": "$665,000",
        "status": "FOR_SALE",
        "status_text": "Active",
        "property_type": "SINGLE_FAMILY",
        "beds": 4,
        "baths": 2,
        "sqft": 2119,
        "lot_sqft": 9234.72,
        "zestimate_usd": null,
        "rent_zestimate_usd": null,
        "tax_assessed_value_usd": 597390,
        "days_on_market": 1,
        "address_line": "8112 Alophia Dr",
        "city": "Austin",
        "state_code": "TX",
        "postal_code": "78739",
        "address": "8112 Alophia Dr, Austin, TX 78739",
        "latitude": 30.190031,
        "longitude": -97.92381,
        "broker_name": "ERA Experts",
        "is_showcase": true,
        "photos": [
          "https://photos.zillowstatic.com/fp/eb04dde0c5f6d674004e7c81fe6ccfb5-p_e.jpg"
        ]
      },
      {
        "zpid": 29411152,
        "source": "zillow",
        "url": "https://www.zillow.com/homedetails/7303-Geneva-Dr-Austin-TX-78723/29411152_zpid/",
        "list_price_usd": 499000,
        "price_display": "$499,000",
        "status": "FOR_SALE",
        "status_text": "Active",
        "property_type": "SINGLE_FAMILY",
        "beds": 4,
        "baths": 2,
        "sqft": 2225,
        "lot_sqft": 8703.288,
        "zestimate_usd": null,
        "rent_zestimate_usd": null,
        "tax_assessed_value_usd": 408693,
        "days_on_market": 72,
        "address_line": "7303 Geneva Dr",
        "city": "Austin",
        "state_code": "TX",
        "postal_code": "78723",
        "address": "7303 Geneva Dr, Austin, TX 78723",
        "latitude": 30.321936,
        "longitude": -97.6741,
        "broker_name": "Compass RE Texas, LLC",
        "is_showcase": true,
        "photos": [
          "https://photos.zillowstatic.com/fp/c9e61505b9497365eb4fe60cf95a8fde-p_e.jpg"
        ]
      },
      {
        "zpid": 29481606,
        "source": "zillow",
        "url": "https://www.zillow.com/homedetails/6901-Breezy-Pass-Austin-TX-78749/29481606_zpid/",
        "list_price_usd": 669000,
        "price_display": "$669,000",
        "status": "FOR_SALE",
        "status_text": "Active",
        "property_type": "SINGLE_FAMILY",
        "beds": 3,
        "baths": 2,
        "sqft": 1708,
        "lot_sqft": 9679.032,
        "zestimate_usd": null,
        "rent_zestimate_usd": null,
        "tax_assessed_value_usd": 542000,
        "days_on_market": 44,
        "address_line": "6901 Breezy Pass",
        "city": "Austin",
        "state_code": "TX",
        "postal_code": "78749",
        "address": "6901 Breezy Pass, Austin, TX 78749",
        "latitude": 30.229353,
        "longitude": -97.877014,
        "broker_name": "LPT Realty, LLC",
        "is_showcase": true,
        "photos": [
          "https://photos.zillowstatic.com/fp/bfe64360c88fd4e3359cbd4ae3ae3576-p_e.jpg"
        ]
      }
    ],
    "count": 41,
    "map_pins": [
      {
        "zpid": "80104300",
        "latitude": 30.190031,
        "longitude": -97.92381,
        "price_display": "$665,000"
      },
      {
        "zpid": "29411152",
        "latitude": 30.321936,
        "longitude": -97.6741,
        "price_display": "$499,000"
      },
      {
        "zpid": "29481606",
        "latitude": 30.229353,
        "longitude": -97.877014,
        "price_display": "$669,000"
      }
    ],
    "total_reported": 5932,
    "pages_fetched": 1,
    "tiles_fetched": null,
    "stop_reason": "max_pages",
    "partial": false,
    "location": "Austin, TX",
    "status": "for_sale",
    "filters_applied": null,
    "harvest_note": "SRP caps ~860 listResults/~500 map pins per box; fetch_all bbox-tiles to exceed (faceted-search-pagination)."
  }
}
Actions

What the Zillow API does

ActionDescriptionConcrete use caseKey params
new_listingsNew US inventory straight from Zillow's own published feed — the listings that appeared in the last couple of days, refreshed within the hour. Returns identity and location (zpid, canonical url, address as Zillow writes it, region, postal code, country, changed_at); pass a zpid to `property_detail` for price, beds, sqft, status and Zestimate.Real-estate investors call new_listings to get new US inventory straight from Zillow's own published feed.category, region, country, postal_prefix, changed_after, ...
searchSearch listings by location (for sale / for rent / recently sold), with structured filters: price, beds, baths, home type, sqft, lot, year built, HOA, days-on-market and keywords. Read `returns` before using status=for_rent (rentals come back as BUILDINGS with a units[] breakdown, not as individual apartments) or status=sold (about a dozen US states publish no sale price at all).Brokerage tools call search to search listings by location (for sale / for rent / recently sold), with structured filters.location, status, max_pages, fetch_all, max_results, ...
search_by_coordinatesSearch listings inside exact map bounds (returns more than the standard ~860-result cap), with the same structured filters as search.Property dashboards call search_by_coordinates to search listings inside exact map bounds (returns more than the standard ~860-result cap), wit….map_bounds, status, max_pages, fetch_all, max_results, ...
search_by_urlRun any copied Zillow URL: a search URL replays that exact search (with its filters); a property URL routes to the full property detail.Lead-generation teams call search_by_url to get run any copied Zillow URL.url
property_detailFull property record: Zestimate (+history), price & tax history, schools, walk/transit/bike scores, agent, photos, RESO facts. Batch several with zpids[].Real-estate investors call property_detail to get full property record.zpid, zpids, url
compsComparable homes near a property (synthesized similar-listing search, scored by distance/beds/sqft).Brokerage tools call comps to get comparable homes near a property (synthesized similar-listing search, scored by distance/beds….zpid, url, radius_deg, max_comps
soldRecently-sold listings (last 12 months) by location or map bounds, with the same structured filters as search. The sale price fills in disclosure states and is genuinely absent in non-disclosure ones - read `returns` before building on it.Property dashboards call sold to get recently-sold listings (last 12 months) by location or map bounds, with the same structured f….location, map_bounds, max_pages, fetch_all, max_results, ...
agentListing agent + broker attribution for one property (agentInfo).Lead-generation teams call agent to get listing agent + broker attribution for one property (agentInfo)..zpid, url
agent_profileAn agent's full portfolio: profile info + their for-sale/sold listings + reviews.Real-estate investors call agent_profile to get an agent's full portfolio.username, profile_url, zuid, url
agents_by_locationReal-estate agent directory for a location, with review summaries.Brokerage tools call agents_by_location to get real-estate agent directory for a location, with review summaries..location
autocompleteLocation autocomplete — suggest Zillow regions and addresses for a free-text query (city, ZIP, neighborhood, county or street). Use it to resolve a fuzzy term before searching, or to power a search box.Property dashboards call autocomplete to get location autocomplete.query
market_trendsRegion market metrics: ZHVI home-value index, median sale/list price, inventory, days-to-pending, % sold above list, rent index.Lead-generation teams call market_trends to get region market metrics.location
walk_transit_bikeZillow Walk Score, Transit Score and Bike Score for a property — walkability, public-transit access and bikeability (0-100) with a description for each.Real-estate investors call walk_transit_bike to get zillow Walk Score, Transit Score and Bike Score for a property.zpid, url
home_value_chartZillow home-value history — the Zestimate value-over-time series for a property (monthly home value, up to the last 10 years, with the latest forecast point).Brokerage tools call home_value_chart to get zillow home-value history.zpid, url, time_period
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/zillow/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"location":"Austin, TX"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.zillow.search with {"location":"Austin, TX"}.
Use cases

Who uses this API and why

  • Real-estate investors call search then comps to find and value properties in a target market.
  • Property dashboards use property_detail and the Zestimate to enrich a listing with price and rent estimates.
  • Lead-gen tools use agent and sold to identify active agents and recent transactions in an area.
FAQ

Questions developers ask before integrating

I asked for 3 results and got 41 — is that a bug?

No, it is how the paging works and we would rather over-deliver than silently drop rows. Zillow's result page holds roughly 41 listings and it is fetched whole; max_results caps how many pages get fetched, not how many rows come out of one. A measured request for max_results 3 returned 41; max_results 200 with max_pages 3 returned 123. You are not charged per row, so slice the array to what you need.

Why is zestimate_usd null on most listings?

Because Zillow does not publish a Zestimate for every home, and we return null rather than an estimate of our own. Measured: only 19 of 123 Austin search rows carried one. Crucially, this is not something property_detail fixes — pulling the full record for zpid 464181906 also returned zestimate_usd null, zestimate_low_pct null and zestimate_history as an empty array. Newer construction and recently-listed homes are the usual gaps. If your product depends on a valuation, plan for the null case rather than retrying.

Why does filtering on home_type return properties whose property_type does not match?

Because they are two different vocabularies. You filter with lowercase words — house, condo, townhouse, multi_family, land, manufactured, apartment — and the response speaks SCREAMING_SNAKE: SINGLE_FAMILY, CONDO, TOWNHOUSE, MULTI_FAMILY, MANUFACTURED. 'house' and 'SINGLE_FAMILY' are the same thing under two names, so a string comparison between what you sent and what you got will always fail. Map them explicitly.

What is the difference between status and status_text?

status is the machine enum and status_text is the label Zillow prints on the card. Across 123 measured rows every single status was FOR_SALE while status_text split four ways: Active (118), House for sale (2), Home for sale (2) and Zillow Preview (1). Those are not different states — they are different phrasings, plus one marketing badge. Branch on status; show status_text.

What unit is lot size in, and how do I get acres?

Square feet, always, including the lot_min and lot_max filters. Divide by 43,560 for acres — a measured lot_sqft of 24,668.03 is 0.57 acres. This trips people up because US listing sites present large lots in acres and small ones in square feet, so a filter written as lot_min: 1 returns essentially everything rather than one-acre-plus properties.

How do I get more than Zillow's result cap for an area?

Set fetch_all to true. Zillow's own search caps out around 860 results for any one query no matter how you page, so a busy metro is truncated well before you have the market. fetch_all works around that at the cost of runtime — a plain 3-page search already measured 6.8 seconds. The cheaper alternative for wide areas is to split the query geographically by ZIP and merge, which also keeps each response small enough to process incrementally.

What does property_detail add over a search row, and what does it drop?

It adds price_per_sqft_usd, year_built, price_change_usd with its date (measured: -10,000 on 2026-08-21), price_history, tax_history, schools, neighborhood, the full description, every photo with a count, and the listing agent block. It drops days_on_market, which came back null there while search reported 60 for the same zpid. Several of the added arrays are frequently empty — tax_history, schools and home_insights were all [] on the measured record, and every listing_agent field was null. Empty means Zillow did not publish it for that home.

When should I use new_listings instead of search?

When you want inventory that just appeared rather than everything that matches a place. new_listings reads Zillow's published feed and returns only identity and location — zpid, url, address, region, postal_code, changed_at — which you then resolve through property_detail for the numbers. Watch window.is_recent_window on each response: for_sale, sold and for_rent are large enough that you get a genuine recent slice, while the smaller categories (for_sale_by_owner, auction, pending, other) fit inside the window entirely, so what you get is the whole category rather than new arrivals. Poll incrementally by passing the previous call's window.newest as changed_after.

What is the Zillow API?

Zillow API is a ReefAPI endpoint group for us homes with prices, history and estimates. It returns live JSON through POST requests under /zillow/v1.

Is the Zillow API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Zillow calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Zillow login or account?

No login to Zillow is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Zillow data?

The page example is captured from a live new_listings call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Zillow API use?

Zillow actions currently cost 1-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Zillow from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call zillow actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / zillow

Zillow

US homes with prices, history and estimates.

base /zillow/v114 endpoints
post/zillow/v1/new_listings2 credits

New US inventory straight from Zillow's own published feed — the listings that appeared in the last couple of days, refreshed within the hour. Returns identity and location (zpid, canonical url, address as Zillow writes it, region, postal code, country, changed_at); pass a zpid to `property_detail` for price, beds, sqft, status and Zestimate.

ParameterAllowed / rangeDescription
category = for_saleoptionalfor_sale · sold · for_rent · new_construction · for_sale_by_owner · auction · pending · otherWhich feed to read.
regionoptionalTwo-letter US state or Canadian province, e.g. TX. Pair with `country` — the codes overlap.
countryoptionalUS · CARestrict to one country. The feed mixes both.
postal_prefixoptionalMatch postal codes starting with this, e.g. 787 for the Austin area.
changed_afteroptionalISO-8601 instant; keep rows changed strictly after it (e.g. 2026-08-20T00:00:00Z). Use the previous call's `window.newest` to poll incrementally.
max_results = 200optional1–5000Rows to return, up to 5000.
page = 1optional1–1-based page over the filtered set.
Try in playground →
post/zillow/v1/search_by_coordinates2 credits

Search listings inside exact map bounds (returns more than the standard ~860-result cap), with the same structured filters as search.

ParameterAllowed / rangeDescription
map_boundsrequiredMap viewport to search: {west, east, south, north} in decimal degrees.
status = for_saleoptionalfor_sale · for_rent · soldListing status to search (synonyms rent/rental/recently_sold also accepted).
max_results = 1000optional1–10000Stop after this many listings. Caps across pages — a single page (~41 listings) is always returned in full.
max_pages = 1optional1–20How many result pages to fetch (~41 listings/page).
fetch_all = falseoptionalFetch EVERY listing in the area (returns more than Zillow's standard ~860-result cap). Slower; combine with max_results.
price_minoptional0–Minimum list price in USD (e.g. 300000).
price_maxoptional0–Maximum list price in USD (e.g. 700000).
beds_minoptional0–10Minimum bedrooms (e.g. 3 = 3+ beds).
baths_minoptional0–10Minimum bathrooms (e.g. 2 = 2+ baths).
home_typeoptionalProperty type filter — one or several (comma-separated). One of: house, condo, townhouse, multi_family, land, manufactured, apartment (e.g. 'house,condo').
sqft_minoptional0–Minimum living area in square feet (e.g. 1500).
sqft_maxoptional0–Maximum living area in square feet (e.g. 3000).
lot_minoptional0–Minimum lot size in SQUARE FEET (43560 sqft = 1 acre).
lot_maxoptional0–Maximum lot size in square feet.
year_built_minoptional1800–2030Earliest year built (e.g. 2010).
year_built_maxoptional1800–2030Latest year built (e.g. 2024).
max_hoaoptional0–Maximum monthly HOA fee in USD (e.g. 100; 0 keeps no-HOA only).
days_on_maxoptional1–Only listings on Zillow at most this many days (e.g. 7 = new this week).
keywordsoptionalFree-text listing keyword filter (e.g. 'pool', 'waterfront', 'guest house').
Try in playground →
post/zillow/v1/search_by_url2 credits

Run any copied Zillow URL: a search URL replays that exact search (with its filters); a property URL routes to the full property detail.

ParameterAllowed / rangeDescription
urlrequiredAny Zillow search or property URL, copied from the browser.
Try in playground →
post/zillow/v1/property_detail3 credits

Full property record: Zestimate (+history), price & tax history, schools, walk/transit/bike scores, agent, photos, RESO facts. Batch several with zpids[].

ParameterAllowed / rangeDescription
zpidoptionalZillow property ID. Provide zpid, zpids OR url.
zpidsoptionalSeveral property IDs in one call (batch).
urloptionalZillow property URL (alternative to zpid).
Try in playground →
post/zillow/v1/comps2 credits

Comparable homes near a property (synthesized similar-listing search, scored by distance/beds/sqft).

ParameterAllowed / rangeDescription
zpidoptionalZillow property ID — the number in the property URL (…/12345678_zpid/) or `zpid` from a search result.
urloptionalZillow property URL (alternative to zpid).
radius_deg = 0.03optional0.005–0.5Search radius in decimal degrees (0.03 ≈ 2 miles).
max_comps = 12optional1–100How many comparables to return (1–100).
Try in playground →
post/zillow/v1/sold2 credits

Recently-sold listings (last 12 months) by location or map bounds, with the same structured filters as search. The sale price fills in disclosure states and is genuinely absent in non-disclosure ones - read `returns` before building on it.

ParameterAllowed / rangeDescription
locationoptionalWhere to search. Provide location OR map_bounds.
map_boundsoptionalExact map viewport {west, east, south, north} (alternative to location).
max_pages = 1optional1–20How many result pages to fetch (~41 listings/page).
fetch_all = falseoptionalFetch EVERY listing in the area (returns more than Zillow's standard ~860-result cap). Slower; combine with max_results.
price_minoptional0–Minimum list price in USD (e.g. 300000).
price_maxoptional0–Maximum list price in USD (e.g. 700000).
beds_minoptional0–10Minimum bedrooms (e.g. 3 = 3+ beds).
baths_minoptional0–10Minimum bathrooms (e.g. 2 = 2+ baths).
home_typeoptionalProperty type filter — one or several (comma-separated). One of: house, condo, townhouse, multi_family, land, manufactured, apartment (e.g. 'house,condo').
sqft_minoptional0–Minimum living area in square feet (e.g. 1500).
sqft_maxoptional0–Maximum living area in square feet (e.g. 3000).
lot_minoptional0–Minimum lot size in SQUARE FEET (43560 sqft = 1 acre).
lot_maxoptional0–Maximum lot size in square feet.
year_built_minoptional1800–2030Earliest year built (e.g. 2010).
year_built_maxoptional1800–2030Latest year built (e.g. 2024).
max_hoaoptional0–Maximum monthly HOA fee in USD (e.g. 100; 0 keeps no-HOA only).
days_on_maxoptional1–Only listings on Zillow at most this many days (e.g. 7 = new this week).
keywordsoptionalFree-text listing keyword filter (e.g. 'pool', 'waterfront', 'guest house').
Try in playground →
post/zillow/v1/agent2 credits

Listing agent + broker attribution for one property (agentInfo).

ParameterAllowed / rangeDescription
zpidoptionalZillow property ID — the number in the property URL (…/12345678_zpid/) or `zpid` from a search result.
urloptionalZillow property URL (alternative to zpid).
Try in playground →
post/zillow/v1/agent_profile3 credits

An agent's full portfolio: profile info + their for-sale/sold listings + reviews.

ParameterAllowed / rangeDescription
usernameoptionalAgent's Zillow username (the part after /profile/; e.g. the profile_url a `agents_by_location` row returns). Provide username, profile_url, zuid OR url.
profile_urloptionalAgent profile URL.
zuidoptionalAdvanced: Zillow user ID.
Try in playground →
post/zillow/v1/agents_by_location2 credits

Real-estate agent directory for a location, with review summaries.

ParameterAllowed / rangeDescription
locationrequiredWhere to search — city, ZIP, neighborhood or county ('Austin, TX', '78704', 'Brooklyn, NY').
Try in playground →
post/zillow/v1/autocomplete1 credit

Location autocomplete — suggest Zillow regions and addresses for a free-text query (city, ZIP, neighborhood, county or street). Use it to resolve a fuzzy term before searching, or to power a search box.

ParameterAllowed / rangeDescription
queryrequiredFree-text location to autocomplete — a partial city, ZIP, neighborhood, county or street ('Brookl', '787', 'Austin').
limit = 10optional1–25Max suggestions to return (1–25).
Try in playground →
post/zillow/v1/walk_transit_bike1 credit

Zillow Walk Score, Transit Score and Bike Score for a property — walkability, public-transit access and bikeability (0-100) with a description for each.

ParameterAllowed / rangeDescription
zpidoptionalZillow property ID — the number in the property URL (…/12345678_zpid/) or `zpid` from a search result.
urloptionalZillow property URL (alternative to zpid).
Try in playground →
post/zillow/v1/home_value_chart1 credit

Zillow home-value history — the Zestimate value-over-time series for a property (monthly home value, up to the last 10 years, with the latest forecast point).

ParameterAllowed / rangeDescription
zpidoptionalZillow property ID — the number in the property URL (…/12345678_zpid/) or `zpid` from a search result.
urloptionalZillow property URL (alternative to zpid).
time_period = 10yoptional1y · 5y · 10yHistory window for the home-value chart.
Try in playground →
Comparing scraping APIs?ReefAPI vs Bright Data