Quickstart

Your first Zillow lookup. Paste a Zillow link or an address, get the listing back as JSON.

1. Get a key

Join the waitlist; keys go out as we open accounts. The free plan includes 50 free lookups (a one-time trial) with no card. Keep the key on your server. Don't ship it in browser code.

2. Make a call

Send a Zillow property link as url:

curl
export PROPERTIESAPI_KEY="your-key"

curl -G "https://api.propertiesapi.com/v1/zillow/property" \
  -H "x-api-key: $PROPERTIESAPI_KEY" \
  --data-urlencode "url=https://www.zillow.com/homedetails/1600-Main-St-Austin-TX-78701/0000000_zpid/"

Or send a plain address. We find the matching Zillow property first:

curl (address)
curl -G "https://api.propertiesapi.com/v1/zillow/property" \
  -H "x-api-key: $PROPERTIESAPI_KEY" \
  --data-urlencode "address=1600 Main St, Austin, TX 78701"
JavaScript (Node 18+)
const url = new URL("https://api.propertiesapi.com/v1/zillow/property");
url.searchParams.set("url", "https://www.zillow.com/homedetails/1600-Main-St-Austin-TX-78701/0000000_zpid/");

const res = await fetch(url, {
  headers: { "x-api-key": process.env.PROPERTIESAPI_KEY },
  signal: AbortSignal.timeout(120_000),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { data, meta } = await res.json();

console.log(data.homeStatus, data.price, data.zestimate, data.rentZestimate);
console.log(data.photos.length, "photos", meta.cached ? "(from cache, free)" : "");
Python
import os, requests

r = requests.get(
    "https://api.propertiesapi.com/v1/zillow/property",
    params={"url": "https://www.zillow.com/homedetails/1600-Main-St-Austin-TX-78701/0000000_zpid/"},
    headers={"x-api-key": os.environ["PROPERTIESAPI_KEY"]},
    timeout=120,
)
r.raise_for_status()
data = r.json()["data"]

print(data["homeStatus"], data["price"], data["zestimate"])
if data["rentZestimate"] is None:
    print("No rent Zestimate shown for this home")

A live lookup takes typically 8 seconds, up to about 20. Set a client timeout of at least 120 seconds: an occasional lookup takes longer. Repeat lookups of the same home within 24 hours come from our cache and are free. The x-cache header says HIT or MISS.

3. Read the response

You get { data, meta }. data is the property: homeStatus, price, zestimate, rentZestimate, beds, baths, livingArea, photos, daysOnZillow, priceHistory, taxHistory, brokerName and more. meta has credits, cached and fetched_at. See every field on the property endpoint page.

4. Handle nulls

If Zillow doesn't show a field for a property, it's null. A home that isn't listed has no price. Some homes have no zestimate. Check for null before you use a value, and don't treat it as zero.

5. Handle errors

  • 400 missing_param or 400 bad_param: send exactly one valid url or address.
  • 404 not_found: no Zillow property matched. Check the address, or send the Zillow URL instead.
  • 502 upstream_error or 504 upstream_timeout: the live fetch didn't work this time. Retry with backoff. You aren't billed.
  • 503 upstream_busy: wait for retry-after seconds.

All codes are on the overview.

6. Go bulk

Send up to 50 URLs or addresses in one request. Each result comes back in data with its own ok flag:

curl (batch)
curl "https://api.propertiesapi.com/v1/zillow/batch" \
  -H "x-api-key: $PROPERTIESAPI_KEY" \
  -H "content-type: application/json" \
  --max-time 300 \
  -d '{"items":["https://www.zillow.com/homedetails/1600-Main-St-Austin-TX-78701/0000000_zpid/","456 Oak Ave, Austin, TX 78702"]}'

Next steps

Data is provided as-is, as shown on public Zillow pages, without any guarantee of accuracy or completeness. Zillow is a trademark of Zillow, Inc. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow.