Datasets API endpoint
Searches monthly Redfin housing-market statistics per region and property type since 2012, joined to Census ACS income for affordability metrics. region_type enum: `national`, `metro`, `county`, `city`, `zip`. property_type enum: `All Residential`, `Single Family Residential`, `Condo/Co-op`, `Townhouse`, `Multi-Family (2-4 Unit)`, `Single Units Only`. Sort enum: `relevance`, `price_desc`, `price_asc`, `list_price_desc`, `list_price_asc`, `price_to_income_desc`, `price_to_income_asc`, `salary_to_buy_desc`, `salary_to_buy_asc`, `dom_asc`, `dom_desc`, `inventory_desc`, `homes_sold_desc`, `period_desc`. Use `latest=true` for the most recent period per region series. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/housing-markets/searchSearches monthly US housing-market statistics per Redfin region and property type since 2012, sourced from Redfin's public data-center tracker files (no crawling) and joined to Census ACS 5-year median household income for affordability metrics (price-to-income ratio, salary needed to buy, the affordability gap).
Dataset id enum:
housing-marketsQuery parameters:
q: optional full-text query over region name and city, max 256 characters.region_type: optional region level. Allowed values: national, metro, county, city, zip.state_code: optional exact two-letter state code filter, e.g. CA.property_type: optional property type. Allowed values: All Residential, Single Family Residential, Condo/Co-op, Townhouse, Multi-Family (2-4 Unit), Single Units Only (national file only).parent_metro_code: optional exact parent metro (CBSA) code filter, e.g. 16980 for Chicago.zip_code: optional exact zip code filter (zip-level rows only), e.g. 60616.period: optional exact period start date filter, YYYY-MM-DD (Redfin periods start on the first of the month).latest: optional; true keeps only the most recent period per region and property type.min_median_sale_price / max_median_sale_price: optional median sale price bounds in USD.min_median_list_price / max_median_list_price: optional median list price bounds in USD.min_price_to_income / max_price_to_income: optional price-to-income ratio bounds (median sale price over ACS median household income).min_salary_to_buy / max_salary_to_buy: optional bounds on the salary needed to buy the median home, USD per year.min_median_dom / max_median_dom: optional median days-on-market bounds.min_inventory / max_inventory: optional active-inventory bounds.min_homes_sold: optional minimum homes sold in the period.sort: optional sort enum: relevance, price_desc, price_asc, list_price_desc, list_price_asc, price_to_income_desc, price_to_income_asc, salary_to_buy_desc, salary_to_buy_asc, dom_asc, dom_desc, inventory_desc, homes_sold_desc, period_desc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
is_latest marks each series' most recent month — combine latest=true with region_type for current-market rankings.median_sale_price_yoy etc.) are fractions as published by Redfin (0.05 = +5%).median_household_income, price_to_income, salary_to_buy, affordability_gap) exist only where the Census income geography matched and a median sale price is present; salary_to_buy assumes 20% down, a 30-year fixed mortgage at mortgage_rate_pct, 1.5%/yr taxes+insurance, and a 28% payment-to-income ratio.income_vintage is acs2024_5yr; ACS incomes lag current prices by ~2 years.relevance sort with q, price_to_income_desc with latest=true, otherwise period_desc.null, never 0 — Redfin leaves thin-market cells empty.10000; page * page_size must not exceed 10000.items array (not an error) when the dataset has no matches yet.1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| region_type | 20 | |
| region_type_id | 20 | |
| table_id | 20 | |
| region | 20 | |
| state | 20 | |
| state_code | 20 | |
| zip_code | 20 | |
| parent_metro | 20 | |
| parent_metro_code | 20 | |
| property_type | 20 | |
| property_type_id | 20 | |
| period_begin | 20 | 2025-12-01 to 2026-03-01 |
| period_end | 20 | 2026-02-28 to 2026-05-31 |
| is_latest | 20 | true in 5 of 20 |
| median_sale_price | 20 | 348,000 to 753,500, median 510,000 |
| median_sale_price_mom | 20 | -0.39 to 0.4, median 0.01 |
| median_sale_price_yoy | 20 | -0.29 to 0.64, median 0.14 |
| median_list_price | 20 | 317,500 to 760,000, median 560,000 |
| median_list_price_mom | 20 | -0.12 to 0.25, median -0.01 |
| median_list_price_yoy | 20 | -0.31 to 0.22, median -0.05 |
| median_ppsf | 20 | 234.67 to 325, median 285.81 |
| median_ppsf_mom | 20 | -0.16 to 0.37, median 0 |
| median_ppsf_yoy | 20 | -0.22 to 0.38, median 0.04 |
| median_list_ppsf | 20 | 254 to 318.48, median 308.57 |
| median_list_ppsf_mom | 20 | -0.16 to 0.11, median 0 |
| median_list_ppsf_yoy | 20 | -0.3 to 0.15, median -0.01 |
| homes_sold | 20 | 2 to 141, median 10 |
| pending_sales | 20 | 4 to 179, median 14 |
| new_listings | 20 | 8 to 201, median 17 |
| inventory | 20 | 9 to 158, median 13 |
| median_dom | 20 | 40.5 to 94, median 68 |
| avg_sale_to_list | 20 | 0.92 to 1.03, median 0.99 |
| sold_above_list | 20 | 0 to 0.5, median 0.29 |
| off_market_in_two_weeks | 20 | 0.25 to 0.64, median 0.44 |
| median_household_income | 20 | 73,819 |
| income_geo_id | 20 | |
| income_vintage | 20 | |
| price_to_income | 20 | 4.71 to 10.21, median 6.91 |
| list_price_to_income | 20 | 4.3 to 10.3, median 7.59 |
| salary_to_buy | 20 | 93,979 to 203,486, median 137,728 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text query over region name and city, max 256 characters | ||
| region_type | string | No | Region level enum: national, metro, county, city, zip Allowed values: national, metro, county, city, zip. | ||
| state_code | string | No | Exact two-letter state code filter, e.g. CA | ||
| property_type | string | No | Property type enum: All Residential, Single Family Residential, Condo/Co-op, Townhouse, Multi-Family (2-4 Unit), Single Units Only | ||
| parent_metro_code | string | No | Exact parent metro (CBSA) code filter, e.g. 16980 | ||
| zip_code | string | No | Exact zip code filter (zip-level rows only), e.g. 60616 | ||
| period | string | No | Exact period start date filter, YYYY-MM-DD | ||
| latest | boolean | No | Filter for the most recent period per region and property type | ||
| min_median_sale_price | number | No | Minimum median sale price in USD | ||
| max_median_sale_price | number | No | Maximum median sale price in USD | ||
| min_median_list_price | number | No | Minimum median list price in USD | ||
| max_median_list_price | number | No | Maximum median list price in USD | ||
| min_price_to_income | number | No | Minimum price-to-income ratio | ||
| max_price_to_income | number | No | Maximum price-to-income ratio | ||
| min_salary_to_buy | integer | No | Minimum salary needed to buy in USD per year | ||
| max_salary_to_buy | integer | No | Maximum salary needed to buy in USD per year | ||
| min_median_dom | number | No | Minimum median days on market | ||
| max_median_dom | number | No | Maximum median days on market | ||
| min_inventory | integer | No | Minimum active inventory | ||
| max_inventory | integer | No | Maximum active inventory | ||
| min_homes_sold | integer | No | Minimum homes sold in the period | ||
| sort | string | No | Sort enum: relevance, price_desc, price_asc, list_price_desc, list_price_asc, price_to_income_desc, price_to_income_asc, salary_to_buy_desc, salary_to_buy_asc, dom_asc, dom_desc, inventory_desc, homes_sold_desc, period_desc Allowed values: relevance, price_desc, price_asc, list_price_desc, list_price_asc, price_to_income_desc, price_to_income_asc, salary_to_buy_desc, salary_to_buy_asc, dom_asc, dom_desc, inventory_desc, homes_sold_desc, period_desc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/housing-markets/search?q=coffee®ion_type=national&latest=true&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "housing-markets",
"items": [
{
"region_type": "metro",
"region_type_id": -2,
"table_id": 41940,
"region": "San Jose, CA metro area",
"state_code": "CA",
"property_type": "All Residential",
"property_type_id": -1,
"period_begin": "2026-05-01",
"period_end": "2026-05-31",
"is_latest": true,
"median_sale_price": 1650000,
"median_sale_price_yoy": 0.041,
"median_list_price": 1498000,
"homes_sold": 812,
"inventory": 1421,
"median_dom": 12,
"median_household_income": 153202,
"income_geo_id": "0400000US06",
"income_vintage": "acs2024_5yr",
"price_to_income": 10.77,
"salary_to_buy": 322403,
"affordability_gap": 169201,
"mortgage_rate_pct": 6.49,
"source": "redfin_data_center",
"run_id": "housing-20260711",
"schema_version": 1
}
],
"page": 1,
"page_size": 20,
"total": 934,
"sort": "price_to_income_desc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.housingMarketsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.HousingSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | HousingMarketRecord record, 50 fields: affordability_gap, avg_sale_to_list, city, homes_sold, income_geo_id, income_vintage, inventory, is_latest, last_updated, list_price_to_income, loaded_at, median_dom and 38 more. Described under US housing markets dataset item API. | |||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.sort | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/housing-markets/search?q=coffee®ion_type=national&latest=true&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"