~ / guides / Zillow Research Data Explained: ZHVI & ZORI Downloads (and When You Need the API)

Zillow Research Data Explained: ZHVI & ZORI Downloads (and When You Need the API)

DC
Dana Cole
Zillow data engineer · about the author
the short version
  • Zillow research data is free aggregate data, published at zillow.com/research/data as CSV downloads. The two headline series are ZHVI (Zillow Home Value Index, typical home value) and ZORI (Zillow Observed Rent Index, typical market-rate rent).
  • I pulled the Metro ZHVI file in June 2026: 895 rows, 322 columns, monthly from January 2000 to May 2026. The US row read $370,320. The Metro ZORI file read $1,950 for the US in the same month.
  • ZHVI and ZORI ship at the ZIP, city, county, metro, state and national level. The ZIP-level ZHVI file alone is 26,274 rows. Pick the cut by use case, there is no single correct one.
  • Use the static CSVs for trends and benchmarks. When you need a single property's current value, rent estimate, or live listing fields, the research files do not have it. That is where a property data API comes in.

I needed a rent-vs-value benchmark for a few hundred metros last month, so I went straight to Zillow’s research data downloads instead of scraping anything. Within a few minutes I had the full Metro ZHVI and ZORI history as CSV files and parsed them in Python. The data is genuinely good, it is free, and most people never realize it exists separately from the listings on zillow.com.

This guide covers what the Zillow research data actually contains, how to download the ZHVI and ZORI files, what every column means, and the one thing these files cannot do. Everything below comes from files I pulled and parsed in June 2026, so every row count and value here is something I measured directly.

What is Zillow research data?

Zillow research data is the free, aggregate housing dataset that Zillow’s economics team publishes at zillow.com/research/data, separate from the for-sale listings on the main site. It is delivered as downloadable CSV files, organized by metric and by geography, and it powers most of the housing-market charts you see cited in the press.

The data is aggregate, meaning each row is a region: a metro, a city, or a ZIP code. Individual addresses never appear in these files. The two headline metrics are the Zillow Home Value Index (ZHVI) and the Zillow Observed Rent Index (ZORI), and the page also carries for-sale inventory, new listings, days to pending, sale prices, and the Zillow Home Value Forecast. Under Zillow’s Terms of Use, you may display and redistribute derivative works of this aggregate data as long as you cite “Data Provided by Zillow Group” on every page that shows it.

Here is what a typical Zillow research download gives you versus what it does not, because the gap is the whole reason the second half of this guide exists:

QuestionResearch CSV answers it?Where the answer lives
What is the typical home value in Austin, TX over time?YesZHVI metro/city file
What is typical rent in ZIP 78704 right now?YesZORI ZIP file
How has inventory moved month over month?YesFor-sale inventory file
What is the Zestimate for 123 Main St?NoProperty data API
What is this specific listing asking, and how many beds?NoListings scraper
Who is the listing agent and their phone number?NoAgent scraper

The research files are built for trends and regional benchmarks. The moment your question is about one address, you have left the dataset. I come back to that distinction near the end, after the downloads.

What is the Zillow Home Value Index (ZHVI)?

The Zillow Home Value Index (ZHVI) is a smoothed, seasonally adjusted measure of the typical home value across a region and housing type. It reflects the value for homes in the 35th to 65th percentile range, so it tracks the middle third of the market. A handful of mansions cannot skew it the way they would a simple average.

ZHVI is published in several cuts, and Zillow is explicit in its ZHVI methodology that no single cut is more correct than another, the right one depends on your use case. The most-cited version is “all homes, middle tier, smoothed and seasonally adjusted,” which is the one Zillow uses for its own consumer-facing numbers. You can read the breakdown of cuts and codes in the ZHVI User Guide.

When I downloaded the Metro all-homes file in June 2026, the United States row (RegionID 102001, RegionType country) read $370,320 for May 2026. The same file’s largest metro by size rank, New York, read $727,625. The St. Louis Fed mirrors this exact series, so you can cross-check the national figure on FRED.

What do the ZHVI file name codes mean?

The ZHVI file names encode the cut, so you can pick the right file without opening it. The codes come straight from the methodology and appear in the download filename itself. Here is how the pieces decode:

Code in filenameMeaning
uc_sfrcondoAll homes: single-family residences plus condos and co-ops
uc_sfrSingle-family residences only
uc_condoCondo and co-op only
tier_0.33_0.67Middle tier (the 33rd to 67th percentile of value)
tier_0.0_0.33Bottom tier
tier_0.67_1.0Top tier
smSmoothed
saSeasonally adjusted

So the file Metro_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv is the metro-level, all-homes, middle-tier, smoothed and seasonally adjusted, monthly time series. Swap uc_sfrcondo for uc_sfr and you get the single-family-only cut, which matters if your analysis excludes condos. The smoothed and seasonally adjusted version strips calendar-driven swings, which is why it reads more cleanly for trend work. A raw version exists for anyone who wants to do their own adjustment. The codes carry over to rents, which is the next index.

What is the Zillow Observed Rent Index (ZORI)?

The Zillow Observed Rent Index (ZORI) is a smoothed measure of the typical market-rate rent across a region, built as a repeat-rent index that is weighted to the rental housing stock. Where a plain median of listed rents drifts whenever the mix of available units changes, ZORI tracks the price change of the same units over time, which is closer to how rents actually move.

Zillow computes ZORI on the mean of listed rents in the 40th to 60th percentile, then weights it to the full rental stock using Census data so the index represents the whole market and not only the homes listed for rent that month. The full repeat rent construction is documented in the ZORI repeat-rent methodology. An exponentially weighted moving average smooths the final time series.

The Metro ZORI file I pulled in June 2026 held 739 rows and 142 columns, with monthly data starting January 2015. The United States row read $1,950 for May 2026. ZORI history is shorter than ZHVI history (2015 versus 2000), which matters if you are joining the two series for a price-to-rent ratio. Here is how the two indices line up side by side:

AttributeZHVIZORI
MeasuresTypical home valueTypical market-rate rent
Percentile band35th to 65th (middle third)40th to 60th
MethodSmoothed, seasonally adjusted indexRepeat-rent, stock-weighted, smoothed
Metro file history (as I pulled it)Jan 2000 onwardJan 2015 onward
US value, May 2026 (my download)$370,320$1,950
Download tab on the data pageHome ValuesRentals

Both indices share the same file layout and the same geography options, which is what makes them easy to join once you have them downloaded.

How do you download Zillow ZHVI and ZORI data?

You download Zillow ZHVI and ZORI data as CSV files from zillow.com/research/data, choosing a metric, a geography, and a data type from the dropdowns before clicking the download link. ZHVI lives under the Home Values tab and ZORI under the Rentals tab. Each combination resolves to a direct CSV URL on Zillow’s file server.

For a one-off, the dropdowns are fine. For anything repeatable, pull the file in code. Here is the exact Python I ran in June 2026 to fetch the Metro ZHVI file and read its shape, using only the standard library plus requests so it runs anywhere:

import csv
import io
import requests

# Metro, all homes, middle tier, smoothed + seasonally adjusted, monthly
URL = (
    "https://files.zillowstatic.com/research/public_csvs/zhvi/"
    "Metro_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv"
)

resp = requests.get(URL, timeout=90)
resp.raise_for_status()

rows = list(csv.reader(io.StringIO(resp.text)))
header = rows[0]
print("columns:", len(header), "rows:", len(rows) - 1)
print("id columns:", header[:5])
print("latest month:", header[-1])

# Pull the national row and its most recent value
idx = {name: i for i, name in enumerate(header)}
latest = header[-1]
for row in rows[1:]:
    if row[idx["RegionName"]] == "United States":
        print("US ZHVI", latest, "=", round(float(row[idx[latest]])))
        break

When I ran this, it printed columns: 322 rows: 895, a latest month of 2026-05-31, and a US value of 370320. The first five columns are always the identifiers, then every remaining column is a month. Reading rents is the identical pattern against the ZORI URL:

# Metro ZORI: all homes + multifamily, smoothed, monthly
ZORI_URL = (
    "https://files.zillowstatic.com/research/public_csvs/zori/"
    "Metro_zori_uc_sfrcondomfr_sm_month.csv"
)
resp = requests.get(ZORI_URL, timeout=90)
resp.raise_for_status()
rows = list(csv.reader(io.StringIO(resp.text)))
# same RegionName lookup -> US ZORI 2026-05-31 = 1950

One caveat worth building around: Zillow changes these download paths periodically. A URL that works today can return a 404 after a data refresh, which is Zillow’s own stated reason for recommending the Econ Data API to anyone ingesting on a schedule (more on that below). Wrap the request in a status check so a moved file fails loudly instead of writing an HTML error page into your data folder.

Which geography levels are available?

ZHVI and ZORI publish at six geographic levels, so you can work at whatever resolution your analysis needs. Per the ZHVI User Guide, the index is generated for neighborhood, ZIP code, city, county, metro, state and the nation. The file you download depends on the prefix in its name:

GeographyFilename prefixWhat I measured
National + MetroMetro_895 rows (includes the US row and all metros)
ZIP codeZip_26,274 rows in the ZHVI ZIP file
CityCity_one row per city
CountyCounty_one row per county
StateState_51 rows
NeighborhoodNeighborhood_one row per Zillow neighborhood

The ZIP-level files are the large ones. The ZIP ZHVI file I pulled was 326 columns by 26,274 rows and carried extra State, City, Metro and CountyName columns so you can roll ZIPs up to any parent geography without a separate crosswalk. If you only want a handful of ZIPs, download the ZIP file once and filter the RegionName column locally. Re-fetching the whole file each run wastes bandwidth on data you already have.

When should you use the Econ Data API instead of the CSVs?

Use Zillow’s Econ Data API instead of the static CSVs when you ingest the research data on a schedule and cannot afford a hard-coded path to break. The API exposes the same metrics as the downloads, including ZHVI and ZORI, but behind stable identifiers, so a data refresh does not move the goalposts under your pipeline. Zillow documents it through the Bridge platform, with the API base URL and full endpoint spec published on Postman.

In the Econ Data API, each ZHVI cut is addressed by a cutTypeKey. The middle-tier all-homes cut I have been using carries the key uc_sfrcondo_tier_0.33_0.67_sm_sa, the same string you saw inside the CSV filename. That symmetry makes it easy to move from a prototype built on downloads to a production job on the API without relearning the data model.

Here is the decision in one table:

Your situationBest access method
One-time analysis, a few geographiesCSV download from the data page
Recurring ingest of indices on a scheduleEcon Data API (stable keys)
Need a single property’s value or rentProperty data API
Need live listing fields, beds, price, statusListings scraper / API

The Econ Data API and the CSVs solve the same problem at different scales. Neither one returns property-level data, which is the gap I flagged at the top and the subject of the last section.

What if you need a single property’s value instead of a regional index?

When you need one property’s value, rent estimate, or live listing details, the research data cannot help, because every row in those files is a region and not an address. ZHVI tells you the typical value in a ZIP code. It will not tell you the Zestimate for a specific home, its current asking price, its bed and bath count, or whether it just went pending. For that, you query the live Zillow page for that property.

That is a different technical problem. A property page is rendered behind anti-bot defenses, so a plain request often returns a challenge instead of the data, which I cover in detail in how to scrape Zillow without getting blocked. A property data API handles the fetch and parsing for you and returns structured fields from a single URL. Shaped like the rest of the examples here, the call is one request:

curl "https://chocodata.com/api/v1/zillow/property?url=https://www.zillow.com/homedetails/2092-zpid/&api_key=$CHOCO_API_KEY"

In Python, the same call returns parsed JSON you can drop next to your research-data analysis:

import os
import requests

resp = requests.get(
    "https://chocodata.com/api/v1/zillow/property",
    params={
        "url": "https://www.zillow.com/homedetails/2092-zpid/",
        "api_key": os.environ["CHOCO_API_KEY"],
    },
    timeout=60,
)
resp.raise_for_status()
home = resp.json()
print(home.get("address"), home.get("price"), home.get("zestimate"))

This is the piece the static files leave out: per-address price, Zestimate, rent estimate, and listing status for a specific home, returned without you maintaining proxies or a headless browser. You can get a ChocoData key and run the request above against any Zillow property URL. Before you collect property data at any volume, it is worth knowing where the legal line sits, which I walk through in is scraping Zillow legal.

The clean split: use the free ZHVI and ZORI research downloads for market trends and regional benchmarks, and use a property API for the address-level numbers those files were never built to hold.

FAQ

What is the difference between ZHVI and ZORI?

ZHVI (Zillow Home Value Index) is a smoothed, seasonally adjusted measure of typical home value for the middle third of the market (the 35th to 65th percentile). ZORI (Zillow Observed Rent Index) is a smoothed measure of typical market-rate asking rent, built as a repeat-rent index weighted to the rental stock. ZHVI tracks for-sale values, ZORI tracks rents.

Is Zillow research data free to download?

Yes. The CSV files at zillow.com/research/data are free aggregate data. Zillow's Terms of Use require that you cite Zillow Group as the source wherever you display the data and prohibit implying any relationship with Zillow. There is no fee and no API key for the static downloads.

Can I get Zillow research data by ZIP code?

Yes. Both ZHVI and ZORI publish a ZIP-code cut. The ZIP-level ZHVI file I downloaded held 26,274 rows, one per ZIP, with the same monthly columns as the metro file plus extra State, City, Metro and CountyName columns. Filter the RegionName or RegionType column to the ZIPs you want.

Does Zillow research data include individual property values or listings?

No. The research CSVs are aggregate indices, one row per region. They do not contain a single home's Zestimate, its current asking price, bed/bath counts, photos, or agent details. For property-level fields you need to query a live page through a Zillow price data API or listings scraper.

Why does my Zillow CSV download code keep breaking?

Zillow changes the file paths on its download server periodically, so a hard-coded CSV URL can start returning a 404 after a data refresh. Zillow's own guidance is to switch to the Econ Data API if you ingest the data on a schedule, since the API keeps stable identifiers. For property data, an API call by URL is more stable than scraping the rendered page yourself.

DC
Dana Cole
I've built Zillow data pipelines for years. On zillowscraperapi.com I run Zillow scraping methods against live pages and publish what actually holds up.