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 = "01a05fdd-b0e2-715d-9091-aab0b61534af"
# 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 |
| baths | real |
| beds | real |
| builder_name | text |
| business_market_id | text |
| city | text |
| community_name | text |
| country | text |
| created_at | timestamp with time zone |
| data_source_id | text |
| days_on_market | text |
| description | text |
| full_baths | text |
| garage_spaces | text |
| has_3d_tour | bigint |
| has_floorplan | bigint |
| has_video_tour | bigint |
| has_virtual_tour | bigint |
| hoa_fee | text |
| hoa_frequency_known | bigint |
| id | uuid |
| is_hot | bigint |
| is_new_construction | bigint |
| is_redfin_listing | bigint |
| key_facts | text |
| last_sold_date | text |
| latitude | real |
| listing_agent | text |
| listing_broker_phone | text |
| listing_id | text |
| listing_tags | text |
| listing_type_id | text |
| longitude | real |
| lot_size_sqft | text |
| market_id | text |
| mls_id | text |
| mls_status | text |
| neighborhood | text |
| open_house | text |
| open_house_end | text |
| open_house_start | text |
| parking_spaces | text |
| partial_baths | text |
| photo_count | text |
| photos | text |
| pool_type_id | text |
| price | real |
| price_per_sqft | real |
| property_id | bigint |
| property_type_id | text |
| sashes | text |
| sqft | real |
| state | text |
| status | text |
| stories | text |
| street | text |
| time_on_redfin_ms | text |
| time_zone | text |
| ui_property_type_id | text |
| unit | text |
| updated_at | timestamp with time zone |
| url | text |
| year_built | text |
| zip | text |
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)This Redfin dataset gives analysts, developers, and data teams direct access to structured residential real estate listing records in a clean, analysis-ready format. Instead of scraping, parsing, and normalizing listing pages yourself, you get a consistent schema with typed fields, stable identifiers, and full raw payloads preserved for every record.
Each row in the Redfin dataset represents a single property listing, captured with its source URL, property and listing IDs, MLS identifiers and status, and the complete location breakdown — street address, unit, city, state, ZIP, neighborhood, country, plus latitude and longitude for geospatial work. Pricing and property attributes are broken out into their own columns so you can filter, group, and model without additional cleanup.
What's included
Identifiers & source url, property_id, listing_id, mls_id, mls_status, status, data_source_id, market_id, business_market_id
Location address, street, unit, city, state, zip, country, neighborhood, latitude, longitude, time_zone
Pricing & financials price, price_per_sqft, hoa_fee, hoa_frequency_known, last_sold_date
Property characteristics beds, baths, full_baths, partial_baths, sqft, lot_size_sqft, stories, year_built, garage_spaces, parking_spaces, pool_type_id, property_type_id, ui_property_type_id, listing_type_id, is_new_construction, community_name, builder_name
Listing signals & market timing is_redfin_listing, is_hot, days_on_market, time_on_redfin_ms, open_house, open_house_start, open_house_end
Content & media description, key_facts, listing_tags, sashes, photos, photo_count, has_virtual_tour, has_video_tour, has_3d_tour, has_floorplan
Agent & brokerage listing_agent, listing_broker_phone
Who this Redfin dataset is for
Real estate analysts and investors use it to track pricing trends, price-per-square-foot movement, inventory levels, and days-on-market across ZIP codes, cities, and states.
Data scientists and ML engineers use it as training data for price prediction models, valuation engines, recommendation systems, and NLP work on listing descriptions and key facts.
Proptech and startup teams use it to seed a new product, benchmark against market inventory, or power search and comparison features without building a collection pipeline from scratch.
Researchers, journalists, and policy teams use it to study housing affordability, new construction activity, HOA prevalence, and regional supply patterns with reproducible, row-level evidence.
Marketing and lead-generation teams use listing metadata, brokerage details, and geographic segmentation to size markets and target campaigns precisely.
Why use this Redfin dataset Analysis-ready structure. Numeric fields arrive as numbers, booleans as booleans, and dates in a consistent format — no regex cleanup before your first query. Geocoded out of the box. Latitude and longitude on every record make mapping, radius search, and spatial joins immediate. Rich text fields retained. Full listing descriptions, key facts, and listing tags are preserved, which is what makes the dataset useful for NLP and feature extraction rather than just tabular stats. Stable joins. Property and listing IDs let you merge across snapshots, dedupe reliably, and build time series from repeated pulls. Flexible delivery. Export as CSV, JSON, JSONL, Excel, or Parquet, and pull one-off snapshots or scheduled refreshes depending on how current your use case needs to be. Scalable coverage. Filter to a single ZIP code for a focused study, or pull nationwide volume for large-scale modeling.
Getting started
Choose your geography and filters, select an output format, and download. The schema stays consistent between runs, so pipelines you build against one export continue to work against the next. Records can be filtered before delivery by state, city, ZIP, price band, property type, bed and bath count, construction status, or listing status.
A note on usage
This is an independently compiled dataset of publicly visible real estate listing information and is not affiliated with, endorsed by, or an official product of Redfin Corporation. Buyers are responsible for ensuring their use complies with applicable laws, terms, and data protection regulations in their jurisdiction.