Quickstart
1. Sign in and create a key
Sign in with your email. We’ll send a magic link — no passwords. Once you land on the dashboard, go to API keys → Create new key. Copy the plaintext that appears. You will not see it again.
Keys look like zk_AbCdEf… and act as bearer tokens.
2. Make your first call
Get a single property by URL:
curl https://api.zillapi.com/v1/properties/by-url \ -H "Authorization: Bearer $ZILLOW_API_KEY" \ --data-urlencode "url=https://www.zillow.com/homedetails/17-Zelma-Dr-Greenville-SC-29617/11026031_zpid/" \ -Gconst res = await fetch( `https://api.zillapi.com/v1/properties/by-url?url=${encodeURIComponent(zillowUrl)}`, { headers: { authorization: `Bearer ${process.env.ZILLOW_API_KEY}` } });const { data } = await res.json();console.log(data.zpid, data.address, data.price);import os, requestsr = requests.get( "https://api.zillapi.com/v1/properties/by-url", params={"url": zillow_url}, headers={"Authorization": f"Bearer {os.environ['ZILLOW_API_KEY']}"}, timeout=60,)r.raise_for_status()print(r.json()["data"]["zpid"])req, _ := http.NewRequest("GET", "https://api.zillapi.com/v1/properties/by-url?url="+url.QueryEscape(zillowURL), nil)req.Header.Set("Authorization", "Bearer " + os.Getenv("ZILLOW_API_KEY"))res, _ := http.DefaultClient.Do(req)A successful response:
{ "data": { "zpid": "11026031", "address": { "streetAddress": "17 Zelma Dr", "city": "Greenville", "state": "SC", "zipcode": "29617" }, "price": 295000, "bedrooms": 3, "bathrooms": 2, "livingArea": 1432, "yearBuilt": 1965, "homeType": "SINGLE_FAMILY", "homeStatus": "FOR_SALE", "latitude": 34.882, "longitude": -82.428, "zestimate": 305100, "rentZestimate": 1850 }, "request_id": "8f7a3b…"}3. Search for listings
curl https://api.zillapi.com/v1/listings/for-sale \ -H "Authorization: Bearer $ZILLOW_API_KEY" \ -H "content-type: application/json" \ -d '{ "filters": { "status": "for_sale", "location": "San Francisco, CA", "price": { "min": 500000, "max": 1500000 }, "beds": { "min": 2 } }, "maxItems": 50 }'Up to 50 results return inline. For more, set async: true and poll
the job_id (see Async jobs) or register a webhook.
4. Get sub-resources
The detail response is large. If you only want photos:
curl https://api.zillapi.com/v1/properties/11026031/photos \ -H "Authorization: Bearer $ZILLOW_API_KEY"Or just the Zestimate:
curl https://api.zillapi.com/v1/properties/11026031/zestimate \ -H "Authorization: Bearer $ZILLOW_API_KEY"These are served from cache (24h TTL) — they don’t burn extra units when fresh.
Next
- Authentication — key rotation
- Async jobs — for batches and large searches
- Webhooks — replace polling
- API reference — every endpoint, every field