Every property on Zillow has exactly one stable identifier: the ZPID, or Zillow Property ID. If you're building anything on top of Zillow data — a watchlist, a comps tool, a portfolio tracker — the ZPID is the primary key you'll join everything on. This short guide covers what it is, the two manual ways to find one, and how to resolve addresses to ZPIDs programmatically at any scale.
What is a ZPID?
A ZPID is the unique numeric ID Zillow assigns to each property in its database. It's hiding in plain sight in every property page URL:
Three properties of the ZPID make it the right key for developers:
- It's stable. Addresses get reformatted, listings come and go, prices change — the ZPID persists across all of it, including when a home goes off-market.
- It's universal. Nearly every US property in Zillow's database has one, listed or not — including homes that have never been for sale in the internet era.
- It's unit-level. In condos and multi-family buildings, each unit carries its own ZPID. Unit-scoped data — photos especially — hangs off the unit's ZPID, not the building's, so resolving the right ZPID is the difference between getting unit 4B's data and the building's.
Finding a ZPID manually
For one property, you don't need any tooling:
- From the URL: search the address on Zillow, open the property page, and read the digits before
_zpidat the end of the URL. - From the page source: view source and search for
zpid— it appears in the page's embedded data, useful when a URL got shortened or mangled in a spreadsheet.
This stops scaling at about the tenth property. For lists, resolve programmatically.
Address → ZPID, programmatically
Send addresses; get full property records back, ZPID included. Up to 1,000 per request:
Because the resolver returns the whole record, "look up the ZPID" and "get the property data" are the same call — you're not paying twice. Address matching is strict by design: if an input address can't be confidently resolved to the right property, you get an explicit error for that entry rather than a silently wrong house. With messy CRM exports, that guarantee matters more than it sounds.
ZPID → property, the other direction
Already have ZPIDs — from URLs you collected, a previous export, or another dataset? Send them as integers:
Zillow URLs work as inputs too ({"urls": [...]}) — the ZPID is parsed out for you. All three input types can be mixed across a batch, which is convenient when your list is half addresses, half pasted URLs.
What developers build on ZPIDs
| Pattern | How the ZPID is used |
|---|---|
| Watchlists & alerts | Store ZPIDs, re-poll on a schedule, diff price and home_status against the last pull |
| Dataset joins | Use the ZPID as the join key between Zillow fields and county records, rent rolls, or CRM rows — more reliable than address-string matching |
| Comps & analysis | Dedupe candidate lists by ZPID before pulling sold data and price history |
| Condo/unit data | Resolve the unit-level ZPID to get unit-scoped photos and details in multi-family buildings |
Resolve your first address now
Free tier, no credit card. Address in, ZPID and 50+ fields out.
Get API KeyRelated reading
- Zillow API Python tutorial
- Zillow sold data API: sale dates, price history, and comps
- The unofficial Zillow API, explained
- Export Zillow data to Excel or CSV
Final takeaway
The ZPID is Zillow's primary key, and it should be yours too: stable across listings, universal across on- and off-market homes, and precise down to the unit. Read it from a URL when you need one; resolve addresses through the API when you need a thousand.