A comprehensive, structured dataset of residential property listings covering every U.S. state, sourced from Zillow listing data. Each record captures pricing, valuation, physical attributes, location coordinates, listing status, and media availability — making it ready for market analysis, price prediction models, and investment research without heavy cleaning.
What's inside (45+ fields):
Location — full address, street, city, state, ZIP code, unit, latitude/longitude, state ID Pricing & valuation — list price, price label, price change amount, price reduction flag, date of price change, Zestimate, Rent Zestimate, tax assessed value Property attributes — bedrooms, bathrooms, living area (sq ft), lot area value and unit, home type (single-family, condo, townhouse, multi-family, land) Listing intelligence — home status, status text, marketing status, listing sub-type, days on Zillow, time on Zillow Agent & broker — broker name, agent name, detail URL Media & flags — primary image, has image, 3D model, video walkthrough, showcase listing, Zillow-owned, new construction, open house Record tracking — created_at, updated_at timestamps
Who this is for:
Real estate investors screening markets, data analysts and BI professionals, machine learning practitioners building home-price prediction models, proptech developers, market researchers, and students working on housing economics projects.
Example use cases:
Compare median list price vs. Zestimate to spot over- and under-priced markets Calculate rent-to-price ratios by ZIP code for cash-flow analysis Track price reductions and days-on-market as demand indicators Map property density and price heat by latitude/longitude Analyze new construction share by state Benchmark tax assessed value against market price
Learn how to interact with this dataset using the Ouro SDK or REST API.
API access requires an API key. Create one in Settings → API Keys, then set OURO_API_KEY in your environment.
Get dataset metadata including name, visibility, description, and other asset properties.
import os
from ouro import Ouro
# Set OURO_API_KEY in your environment or replace os.environ.get("OURO_API_KEY")
ouro = Ouro(api_key=os.environ.get("OURO_API_KEY"))
dataset_id = "01a0052f-0b7a-7a3c-b0bb-cdfe0dd5926a"
# Retrieve dataset metadata
dataset = ouro.datasets.retrieve(dataset_id)
print(dataset.name, dataset.visibility)
print(dataset.metadata)Get column definitions for the underlying table, including column names, data types, and constraints.
| Column | Type |
|---|---|
| address | text |
| agent_name | text |
| baths | real |
| beds | real |
| broker_name | text |
| city | text |
| created_at | text |
| date_price_changed | text |
| days_on_zillow | integer |
| detail_url | text |
| has_3d_model | integer |
| has_image | integer |
| has_open_house | integer |
| has_video | integer |
| home_status | text |
| home_type | text |
| id | uuid |
| img_src | text |
| is_showcase | integer |
| is_zillow_owned | integer |
| latitude | real |
| listing_sub_type | text |
| living_area | real |
| living_area_imputed | integer |
| longitude | real |
| lot_area_unit | text |
| lot_area_value | real |
| marketing_status | text |
| new_construction | text |
| open_house_desc | text |
| open_house_end | text |
| open_house_start | text |
| price | integer |
| price_change | real |
| price_imputed | integer |
| price_label | text |
| price_reduction | text |
| rent_zestimate | real |
| rent_zestimate_imputed | integer |
| state | text |
| state_id | integer |
| status_text | text |
| street_address | text |
| tax_assessed_value | real |
| tax_assessed_value_imputed | integer |
| time_on_zillow | real |
| unit | text |
| unnamed_44 | real |
| updated_at | text |
| zestimate | integer |
| zestimate_imputed | integer |
| zipcode | integer |
| zpid | integer |
Fetch the dataset's rows. Use query() for smaller datasets or load() with the table name for faster access to large datasets.
Update dataset metadata (visibility, description, etc.) and optionally write new rows to the table. Writing new data will replace the existing data in the table. Requires write or admin permission on the dataset.
# Get column definitions for the underlying table
columns = ouro.datasets.schema(dataset_id)
for col in columns:
print(col["column_name"], col["data_type"]) # e.g., age integer, name text# Option 1: All rows as a Pandas DataFrame
df = ouro.datasets.query(dataset_id)
print(df.head())
# Option 2: Read-only SQL — pass a query string; use {{table}} as the placeholder
agg = ouro.datasets.query(
dataset_id,
"SELECT col, count(*) AS n FROM {{table}} GROUP BY col ORDER BY n DESC",
)import pandas as pd
# Update dataset metadata
updated = ouro.datasets.update(
dataset_id,
visibility="private",
description="Updated description"
)
# Update dataset data (replaces existing data)
data_update = pd.DataFrame([
{"name": "Charlie", "age": 33},
{"name": "Diana", "age": 28},
])
updated = ouro.datasets.update(dataset_id, data=data_update)