Zillow API docs
Send a Zillow link or an address. Get back the listing price, status, Zestimate, rent Zestimate, home facts, photos, price history, tax history and broker as JSON.
Preview. Field names and limits may change before general availability. Data is provided as-is, as shown on public Zillow pages. It isn't official and isn't guaranteed.
Base URL and authentication
All endpoints live under https://api.propertiesapi.com/v1. Send your key in the x-api-key header. Requests without a key get 401 missing_api_key; an unknown key gets 401 invalid_api_key.
curl -G "https://api.propertiesapi.com/v1/zillow/property" \
-H "x-api-key: $PROPERTIESAPI_KEY" \
--data-urlencode "address=1600 Main St, Austin, TX 78701"Endpoints
| Endpoint | What it returns |
|---|---|
| GET /v1/zillow/property | One property by Zillow URL or address: listing price and status, Zestimate, rent Zestimate, beds, baths, living area, lot, year built, home type, photo URLs, days on Zillow, price history, tax history, schools, broker and agent. |
| POST /v1/zillow/batch | Up to 50 Zillow URLs or addresses in one request. Each item is looked up exactly as GET /v1/zillow/property would, and comes back with its own ok flag. |
The response
A successful lookup returns { data, meta }. data is the property, with camelCase fields. The main ones:
zpid,detailUrl,address(plusstreetAddress,unit,city,state,zipcode,latitude,longitude): which property this is.homeStatus,statusTextandprice: the listing status and listing price. A sold home whose sale price isn't disclosed hasprice: null, never 0.- Apartment buildings (
zillow.com/apartments/...links): you get the building, andprice,beds,baths,livingAreaandunitdescribe its lowest-priced unit available now (no move-in date, or one on or before the lookup date; if none is available yet, its lowest-priced unit). The other units aren't returned yet. zestimateandrentZestimate: Zillow's estimates, when Zillow shows them.beds,baths,livingArea,lotSize,yearBuilt,homeType: the home facts.daysOnZillow,imgSrcandphotos(a list of image URLs).priceHistory,taxHistoryandschools: lists of past events, tax years and nearby schools.brokerName,agentNameand their phones: who listed it.
meta has credits, cached, cache_key, fetched_at, source and took_ms. See every field on the property endpoint page.
Null fields
If Zillow doesn't show a field for a property, it comes back as null. Lists come back empty. Don't treat null as zero.
| Field | Usually null when |
|---|---|
price | The home isn't listed for sale or rent, the listing doesn't show a price, or a sold home's sale price isn't disclosed (some states don't publish sale prices). |
zestimate | Zillow doesn't show a Zestimate for this home. |
rentZestimate | Zillow doesn't show a rent Zestimate for this home. |
beds, baths, livingArea, lotSize, yearBuilt | The Zillow page doesn't list this fact (common for land and new construction). |
daysOnZillow | The home isn't currently listed. |
brokerName, agentName | The listing doesn't name a broker or agent, or the home isn't listed. |
Latency
A live lookup (x-cache: MISS) 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. For many properties, use batch instead of calling one at a time.
Errors
Errors use standard HTTP status codes and one JSON shape, { error: { code, message, details? }, meta: { took_ms } }:
{
"error": {
"code": "not_found",
"message": "No Zillow property matches this input"
},
"meta": {
"took_ms": 11840
}
}| Status | code | When |
|---|---|---|
| 400 | missing_param | None of url, address or zpid was sent. |
| 400 | bad_param | More than one of url, address, zpid; url isn't a zillow.com property link or is too long; address is outside 5-200 characters, has no house number, or has neither a city and state nor a ZIP code (US addresses only; checked before any lookup, so it's free); zpid isn't digits; status isn't for_sale, sold or for_rent; raw isn't true or false. |
| 400 | bad_body | Batch only: the body isn't JSON, or items is missing or empty. |
| 400 | too_many_items | Batch only: more than 50 items. |
| 401 | missing_api_key | The x-api-key header is missing. |
| 401 | invalid_api_key | The key is unknown. |
| 402 | credits_exhausted | The account's lookups are used up: the Free plan's one-time lookups, or a paid plan's included lookups while usage past the plan is off (it pauses while a payment is failing). Not billed, no lookup made. details.upgrade_url links to pricing. Cached properties still work. |
| 402 | spend_limit_reached | Only if you set an optional monthly spending limit (there is none by default, and usage past the plan isn't capped): a paid plan went past its included lookups at its own per-lookup rate and reached that limit. Not billed, no lookup made. details has the limit (spend_limit_usd), your plan's overage rate, the overage used so far and dashboard_url, where you can raise or remove the limit. Cached properties still work; the limit resets with your billing period. |
| 404 | not_found | No Zillow property matches the URL, address or zpid. details.reason may say why. |
| 409 | address_ambiguous | Zillow's closest match for the address is a different home (another house number, street, directional, unit, ZIP, city or state). Not billed. details.candidate.detailUrl is that home's Zillow link and details.mismatch says what differed. Repeating the same address within an hour returns the same 409 without a new lookup. If the candidate is the home you meant, look it up with url=detailUrl (a normal, billed lookup); otherwise add the unit, city, state or ZIP. |
| 422 | unprocessable_input | The data provider rejected this input. Check the Zillow URL or address. |
| 500 | internal | Something failed on our side. Safe to retry with backoff. |
| 502 | upstream_error | The data provider failed (also upstream_unreachable, upstream_bad_response, upstream_run_failed). Safe to retry with backoff. |
| 502 | upstream_cost_cap | The lookup was stopped at its per-lookup upstream cost limit before it found the home. Not billed. Retry at most once, with status=for_sale, sold or for_rent if you know it. |
| 503 | upstream_busy | The data provider is busy. Wait for retry-after seconds. Other 503 codes (no_api_keys, live_lookups_disabled, upstream_auth, upstream_quota, upstream_actor_missing, upstream_misconfigured) mean live lookups are unavailable on our side. |
| 503 | live_lookups_capped | Today's service-wide safety limit on live lookups is reached: our daily upstream budget (for paid plans, details.scope is paid_daily_budget). It is our limit, not one on your account, and nothing is billed. Cached properties still work; new lookups resume at 00:00 UTC (retry-after has the seconds until then). |
| 503 | store_unavailable | Our usage and cache store is unreachable, so live lookups are refused rather than run unmetered. Retry after retry-after seconds (30). |
| 504 | upstream_timeout | The live lookup took too long. Safe to retry. In a batch, batch_deadline means the item didn't start in time. |
Retry 500, 502, 503 and 504 with exponential backoff (on 503, honor retry-after). Don't retry 4xx errors without changing the request. Errors aren't billed.
Headers and plans
Responses carry these headers:
| Header | Meaning |
|---|---|
x-cache | GET /v1/zillow/property only: HIT when served from the 24-hour cache (free), MISS when fetched live. |
x-api-version | Always v1. |
cache-control | no-store. |
retry-after | On 503 upstream_busy, live_lookups_capped and store_unavailable: seconds to wait before retrying. |
x-credits-overage-remaining | Paid plans with usage past the plan on and an optional monthly spending limit set: lookups still allowed past the included ones before that limit. Absent when no limit is set (no cap). |
x-spend-limit-usd | Paid plans with an optional monthly spending limit set: the limit in US dollars (usage past the included lookups, at your plan's own rate). Absent when no limit is set. |
Plans:
| Plan | Price | Lookups | After the included lookups |
|---|---|---|---|
| Free | $0 | 50 lookups, one-time trial | None (one-time trial) |
| Starter | $29 / month | 2,500 lookups a month | then $11.60 per 1,000 |
| Pro | $79 / month | 7,500 lookups a month | then $10.53 per 1,000 |
| Business | $199 / month | 20,000 lookups a month | then $9.95 per 1,000 |
| Scale | $499 / month | 65,000 lookups a month | then $7.68 per 1,000 |
Overage on paid plans: your plan's own per-lookup rate ($11.60 per 1,000 on Starter, down to $7.68 on Scale). When paid plans open, there will be no cap on usage: after your included lookups, each lookup will be billed at your plan's rate, and you'll be able to set an optional monthly limit. Repeat lookups of the same home within 24 hours come from our cache and are free. Zillow links and addresses cost the same: 1 credit per successful lookup. Batch takes up to 50 items per request. See pricing for details.
OpenAPI spec
Download /openapi.json (OpenAPI 3.1). It's generated from the same definitions as these pages.
Acceptable use
The data is provided as-is, without any guarantee of accuracy or completeness. Don't use it for consumer reports or decisions covered by the FCRA, such as credit, insurance, employment or tenant screening.
Zillow is a trademark of Zillow, Inc. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow.
Docs questions
Is this Zillow's official API?+
No. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow. The data comes from public Zillow pages and is provided as-is.
How do I authenticate?+
Send your key in the x-api-key header on every request. Keep the key on your server.
Why is a lookup slow?+
A live lookup fetches the property from Zillow at request time, so it takes typically 8 seconds, up to about 20. Repeat lookups of the same home within 24 hours come from cache without a live lookup, for free. Use the batch endpoint for many properties.
Why are some fields null?+
Because Zillow doesn't show that field for that property. For example, a home that isn't listed has no listing price, and some homes have no Zestimate.
Do failed lookups cost anything?+
No. Only successful live lookups are billed. Errors and cache hits use no credits; meta.credits tells you what each call cost.
Is there an OpenAPI spec?+
Yes. /openapi.json is an OpenAPI 3.1 document for every endpoint. Import it into Postman, Insomnia or a code generator.
What can't I use it for?+
No consumer reports or decisions covered by the FCRA, such as credit, insurance, employment or tenant screening.
What about public-records data like owners and comps?+
That's a separate property data API we plan to release later. It isn't part of the Zillow API.