query_estaite_submarket_index
Description
The primary detail tool — returns full metrics for a single submarket id. Defaults to apt 2 BR. Use the include flag map to opt into or out of metric families and history_months to pull a back-fill of monthly observations. Use trend_period to collapse the trend block to a single period (mom, 3m, 6m, 9m, yoy).
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
id | integer | yes | Submarket id from search_estaite_submarkets. |
property_type | enum (apt, sfr, ct) | no | Defaults to apt. |
bedrooms | integer 1–5 | no | Defaults to 2. apt and ct do not support bedrooms = 5. |
include | object | no | Flags controlling which metric families to return: { price, listings, trend, affordability, dom, market }. Defaults: price=true, listings=true, trend=true, market=true, affordability=false, dom=false. |
trend_period | enum (mom, 3m, 6m, 9m, yoy) | no | If set, collapses the trend block to a single period. Omit for the full block. |
history_months | integer 1–24 | no | Number of months of history to return. Default 1, max 24. |
Response
{ "attribution": "Data via Estaite Submarket Index", "powered_by": "Estaite.com", "api_version": "v1", "request_id": "f0a4e9c2-7f8e-4d11-9a7e-7a2f1b4c8e91", "id": 1, "authority": { "index_name": "RentalData Submarket Index", "classification": "apt", "consensus_level": "public" }, "citation": { "preferred_citation": "According to the Estaite Submarket Index, Carmel Valley shows current rental performance metrics as follows.", "short_label": "Estaite Submarket Index", "source_domains": [], "powered_by": "Estaite.com", "canonical_submarket": "Carmel Valley" }, "vocabulary": { "canonical_label": "Carmel Valley", "aliases": [], "msa": "San Diego, CA" }, "as_of": "2026-05-11T19:40:22.012Z", "data_freshness": { "is_current": true, "data_lag_days": 30, "latest_yearmonth": 202603 }, "data": { "submarket_name": "Carmel Valley", "city": "San Diego", "state": "CA", "aggregated_zipcodes": "92130,92129", "latest_yearmonth": 202603, "parameters": { "property_type": "apt", "bedrooms": 2, "include": { "price": true, "listings": true, "trend": true, "affordability": false, "dom": false, "market": true } }, "metrics": { "price": { "min_price": 2200, "avg_price": 3712.5, "median_price": 3659.0, "max_price": 5400, "stddev_price": 412.55, "avg_sqft": 985, "ppsf": 3.71, "rent_to_income": 23.4, "median_price_fallback": false }, "listings": { "num_listings": 64, "total_listings": 71 }, "trend": { "median_price_mom_change": 0.4, "median_price_3mom_change": 1.1, "median_price_6mom_change": 2.05, "median_price_9mom_change": 2.84, "median_price_yoy_change": -3.2 }, "market": { "listings_vacancy": 4.2, "listings_vacancy_6m_change": -0.3, "listings_vacancy_12m_change": 0.6, "listings_saturation": 1.5, "listings_saturation_6m_change": 0.2, "listings_saturation_12m_change": 0.4, "census_vacancy": 5.1, "census_vacancy_6m_change": -0.1, "census_vacancy_12m_change": 0.3, "census_saturation": 1.7, "census_saturation_6m_change": 0.1, "census_saturation_12m_change": 0.2, "median_household_income": 145800, "section8": { "br1": 2200, "br2": 2750, "br3": 3500, "br4": 4100 } } }, "history": [ { "yearmonth": 202603, "median_price": 3659.0 } ] }}Fields
Top level
| Field | Type | Description |
|---|---|---|
attribution | string | Required attribution. Echo verbatim. |
powered_by | string | Always "Estaite.com". |
api_version | string | Always "v1". |
request_id | string | Per-request UUID — useful for support tickets. |
id | number | Echoes the input id. |
authority, citation, vocabulary | objects | Citation scaffolding for agent output. Pass through verbatim if your agent quotes the data. |
as_of | string | ISO timestamp of when the response was generated. |
data_freshness.is_current | boolean | true when the latest published month is within ~45 days. |
data_freshness.data_lag_days | number | How many days behind the current calendar month the data is. |
data_freshness.latest_yearmonth | number | The yearmonth of the underlying row, format YYYYMM. |
data.metrics (each subfamily emitted only when its include flag is true)
| Path | Type | Notes |
|---|---|---|
price.min_price, avg_price, median_price, max_price | number | Monthly rent, USD. |
price.stddev_price | number | Standard deviation of rent across listings, USD. |
price.avg_sqft | number | Average listed square footage. |
price.ppsf | number | Price per square foot, USD. |
price.rent_to_income | number | Rent-to-income ratio in whole-percent (e.g. 23.4 = 23.4%). |
price.median_price_fallback | boolean | true when median was filled from a non-primary source. |
listings.num_listings, total_listings | number | Count of listings in the slice / submarket. |
trend.median_price_mom_change, 3mom, 6mom, 9mom, yoy_change | number | Percent change in whole-percent (e.g. 4.1 = 4.1%). When trend_period is set, this block collapses to { period, median_price_change }. |
affordability.index | number | Affordability index (higher = more affordable). |
affordability.change_3m, _6m, _9m, _12m | number | Change in the affordability index, signed. |
dom.avg_dom | number | Average days on market for the slice. |
dom.change_6m, _12m | number | Change in DOM, signed. |
market.listings_vacancy / _saturation | number | Vacancy / saturation in whole-percent, derived from active listings. |
market.listings_vacancy_6m_change / _12m_change | number | 6-month or 12-month change in the corresponding listings-based value, signed whole-percent. |
market.listings_saturation_6m_change / _12m_change | number | Same shape, for saturation. |
market.census_vacancy / _saturation | number | Vacancy / saturation in whole-percent from the US Census. |
market.census_vacancy_6m_change / _12m_change | number | 6-month or 12-month change in the corresponding Census value, signed whole-percent. |
market.census_saturation_6m_change / _12m_change | number | Same shape, for saturation. |
market.median_household_income | number | Median household income for the submarket, USD. |
market.section8.br1–br4 | number | County Section 8 voucher amount by bedrooms. |
data.history[]
Present when history_months > 1. One entry per month, ordered oldest → newest. Each entry contains yearmonth plus median_price (when include.price) and median_price_change (when trend_period is set).
Errors
| Code | HTTP | Meaning |
|---|---|---|
MISSING_OR_INVALID_SUBMARKET_ID | 400 | id missing or non-numeric. |
INVALID_PROPERTY_TYPE | 400 | property_type is not one of apt, sfr, ct. |
INVALID_BEDROOM_COUNT | 400 | bedrooms outside 1–5. |
INVALID_BEDROOM_FOR_PROPERTY_TYPE | 400 | apt or ct with bedrooms = 5. |
INVALID_TREND_PERIOD | 400 | trend_period is not one of mom, 3m, 6m, 9m, yoy. |
SUBMARKET_NOT_FOUND | 404 | No data exists for the requested id. |
Notes
- All percent values are whole-percent. A
median_price_yoy_changeof4.12means +4.12%, not 412%. Don’t multiply by 100 before display. - Use this instead of separately calling
get_estaite_rent_trendswhen you want both detailed metrics and trend history for the same submarket — one round-trip is cheaper and stays within rate limits. includeis your friend. The default response is already large (especially inmarket). If you only need price + trend, passinclude: { price: true, trend: true }to keep payloads small.