Zillow API

Get Zillow data with one API

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

Z
/zillow/v1

14 active endpoints, on 1, 2 and 3 credit tiers.

  • POST/zillow/v1/new_listings
  • POST/zillow/v1/search
  • POST/zillow/v1/search_by_coordinates
  • POST/zillow/v1/search_by_url
  • POST/zillow/v1/property_detail
  • POST/zillow/v1/comps
  • POST/zillow/v1/sold
  • +7 more

What Zillow endpoints does ReefAPI ship?

14 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

14 endpoints

new_listings

2 cr

New US inventory straight from Zillow's own published feed.

required
optional
category, region, country, postal_prefix, changed_after, max_results, page

search

2 cr

Search listings by location (for sale / for rent / recently sold), with structured filters.

required
location
optional
status, max_pages, fetch_all, max_results, price_min, price_max, beds_min, baths_min, home_type, sqft_min, sqft_max, lot_min, lot_max, year_built_min, year_built_max, max_hoa, days_on_max, keywords

search_by_coordinates

2 cr

Search listings inside exact map bounds (returns more than the standard ~860-result cap), wit…

required
map_bounds
optional
status, max_pages, fetch_all, max_results, price_min, price_max, beds_min, baths_min, home_type, sqft_min, sqft_max, lot_min, lot_max, year_built_min, year_built_max, max_hoa, days_on_max, keywords

search_by_url

2 cr

Run any copied Zillow URL.

required
url
optional

property_detail

3 cr

Full property record.

required
optional
zpid, zpids, url

comps

2 cr

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

required
optional
zpid, url, radius_deg, max_comps

sold

2 cr

Recently-sold listings (last 12 months) by location or map bounds, with the same structured f…

required
optional
location, map_bounds, max_pages, fetch_all, max_results, price_min, price_max, beds_min, baths_min, home_type, sqft_min, sqft_max, lot_min, lot_max, year_built_min, year_built_max, max_hoa, days_on_max, keywords

agent

2 cr

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

required
optional
zpid, url

agent_profile

3 cr

An agent's full portfolio.

required
optional
username, profile_url, zuid, url

agents_by_location

2 cr

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

required
location
optional

autocomplete

1 cr

Location autocomplete.

required
query
optional

market_trends

2 cr

Region market metrics.

required
location
optional

walk_transit_bike

1 cr

Zillow Walk Score, Transit Score and Bike Score for a property.

required
optional
zpid, url

home_value_chart

1 cr

Zillow home-value history.

required
optional
zpid, url, time_period

Every parameter, every allowed value →

Zillow API

3 of 14 endpoints, ready to run

View docs ↗

New US inventory straight from Zillow's own published feed.

2 credits0 required · 2 optional
POST/zillow/v1/new_listings
ok660 ms · 5 records · sample
{
  "ok": true,
  "meta": {
    "api": "zillow",
    "endpoint": "new_listings",
    "mode": "live",
    "latency_ms": 659.7,
    "record_count": 5,
    "cache_hit": false
  },
  "data": {
    "listings": [
      {
        "zpid": "452152582",
        "url": "https://www.zillow.com/homedetails/83-W-Lakeway-Blvd-Sylvan-Lake-AB-T4S-2P4/452152582_zpid/",
        "address": "83 W Lakeway Blvd Sylvan Lake AB T4S 2P4",
        "region": "AB",
        "postal_code": "T4S-2P4",
        "country": "CA",
        "changed_at": "2026-08-27T08:00:00Z"
      },
      {
        "zpid": "19877847",
        "url": "https://www.zillow.com/homedetails/22702-Califa-St-Woodland-Hills-CA-91367/19877847_zpid/",
        "address": "22702 Califa St Woodland Hills CA 91367",
        "region": "CA",
        "postal_code": "91367",
        "country": "US",
        "changed_at": "2026-08-27T07:58:00Z"
      },
      {
        "zpid": "98026819",
        "url": "https://www.zillow.com/homedetails/555-Old-Draketown-Pass-Temple-GA-30179/98026819_zpid/",
        "address": "555 Old Draketown Pass Temple GA 30179",
        "region": "GA",
        "postal_code": "30179",
        "country": "US",
        "changed_at": "2026-08-27T07:58:00Z"
      }
    ],
    "category": "for_sale",
    "window": {
      "oldest": "2026-08-24T17:14:00Z",
      "newest": "2026-08-27T08:00:00Z",
      "is_recent_window": true
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Zillow API works

Zillow is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /zillow/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

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.

What people build with Zillow

The jobs this data is most often used for.

14

endpoints

1/2/3

credits per call

01

Real-estate investors call search then comps to find and value properties in a target market.

02

Property dashboards use property_detail and the Zestimate to enrich a listing with price and rent estimates.

03

Lead-gen tools use agent and sold to identify active agents and recent transactions in an area.

What Zillow data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/zillow/v1/new_listings \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"category":"for_sale","max_results":5}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/zillow/v1/new_listings",
    headers={"x-api-key": REEF_KEY},
    json={
  "category": "for_sale",
  "max_results": 5
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Zillow.

Get a free key →
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.

11 Real Estate APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Zillow, you are one call away from the rest of the category — no second contract, no second integration.

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts.