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
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

EndpointWhat it returns
GET /v1/zillow/propertyOne 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/batchUp 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 (plus streetAddress, unit, city, state, zipcode, latitude, longitude): which property this is.
  • homeStatus, statusText and price: the listing status and listing price. A sold home whose sale price isn't disclosed has price: null, never 0.
  • Apartment buildings (zillow.com/apartments/... links): you get the building, and price, beds, baths, livingArea and unit describe 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.
  • zestimate and rentZestimate: Zillow's estimates, when Zillow shows them.
  • beds, baths, livingArea, lotSize, yearBuilt, homeType: the home facts.
  • daysOnZillow, imgSrc and photos (a list of image URLs).
  • priceHistory, taxHistory and schools: lists of past events, tax years and nearby schools.
  • brokerName, agentName and 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.

FieldUsually null when
priceThe 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).
zestimateZillow doesn't show a Zestimate for this home.
rentZestimateZillow doesn't show a rent Zestimate for this home.
beds, baths, livingArea, lotSize, yearBuiltThe Zillow page doesn't list this fact (common for land and new construction).
daysOnZillowThe home isn't currently listed.
brokerName, agentNameThe 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 response
{
  "error": {
    "code": "not_found",
    "message": "No Zillow property matches this input"
  },
  "meta": {
    "took_ms": 11840
  }
}
StatuscodeWhen
400missing_paramNone of url, address or zpid was sent.
400bad_paramMore 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.
400bad_bodyBatch only: the body isn't JSON, or items is missing or empty.
400too_many_itemsBatch only: more than 50 items.
401missing_api_keyThe x-api-key header is missing.
401invalid_api_keyThe key is unknown.
402credits_exhaustedThe 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.
402spend_limit_reachedOnly 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.
404not_foundNo Zillow property matches the URL, address or zpid. details.reason may say why.
409address_ambiguousZillow'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.
422unprocessable_inputThe data provider rejected this input. Check the Zillow URL or address.
500internalSomething failed on our side. Safe to retry with backoff.
502upstream_errorThe data provider failed (also upstream_unreachable, upstream_bad_response, upstream_run_failed). Safe to retry with backoff.
502upstream_cost_capThe 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.
503upstream_busyThe 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.
503live_lookups_cappedToday'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).
503store_unavailableOur usage and cache store is unreachable, so live lookups are refused rather than run unmetered. Retry after retry-after seconds (30).
504upstream_timeoutThe 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:

HeaderMeaning
x-cacheGET /v1/zillow/property only: HIT when served from the 24-hour cache (free), MISS when fetched live.
x-api-versionAlways v1.
cache-controlno-store.
retry-afterOn 503 upstream_busy, live_lookups_capped and store_unavailable: seconds to wait before retrying.
x-credits-overage-remainingPaid 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-usdPaid 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:

PlanPriceLookupsAfter the included lookups
Free$050 lookups, one-time trialNone (one-time trial)
Starter$29 / month2,500 lookups a monththen $11.60 per 1,000
Pro$79 / month7,500 lookups a monththen $10.53 per 1,000
Business$199 / month20,000 lookups a monththen $9.95 per 1,000
Scale$499 / month65,000 lookups a monththen $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.