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:
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 -G "https://api.propertiesapi.com/v1/zillow/property" \
-H "x-api-key: $PROPERTIESAPI_KEY" \
--data-urlencode "address=1600 Main St, Austin, TX 78701"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)" : "");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_paramor400 bad_param: send exactly one validurloraddress.404 not_found: no Zillow property matched. Check the address, or send the Zillow URL instead.502 upstream_erroror504 upstream_timeout: the live fetch didn't work this time. Retry with backoff. You aren't billed.503 upstream_busy: wait forretry-afterseconds.
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 "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
- Browse the endpoints in the sidebar, or import openapi.json into Postman.
- Language guides: JavaScript, Python and Google Sheets.
- Moving from the retired Zillow API? Read the migration guide.
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.