Skip to content

get_estaite_zip_metrics

Description

Returns rental metrics for a specific 5-digit US ZIP code, including median price, year-over-year change, listing count, vacancy, saturation, and median household income. Use this when the user provides a ZIP and you want point-of-interest metrics without resolving a submarket id.

Two response shapes:

  • Slice mode (when both property_type and bedrooms are passed) — a flat per-slice metrics object.
  • Summary mode (when either is omitted) — a multi-segment grid under segments.

Inputs

NameTypeRequiredDescription
zipstringyes5-digit US ZIP code, e.g. "90210". Must be exactly 5 digits.
property_typeenum (apt, sfr, ct)noApartment, single-family rental, or condo/townhome. Omit for full summary.
bedroomsinteger 1–5noBedroom count. Omit for full summary.

Both property_type and bedrooms must be set together to trigger slice mode. If only one is supplied the tool returns the summary anyway.

Response — Slice mode

{
"attribution": "Data via Estaite Submarket Index",
"powered_by": "Estaite.com",
"source_domains": [],
"api_version": "v1",
"request_id": "f0a4e9c2-7f8e-4d11-9a7e-7a2f1b4c8e91",
"as_of": "2026-03-01",
"data": {
"mode": "slice",
"zipcode": "90210",
"city": "Beverly Hills",
"state": "CA",
"property_type": "apt",
"bedrooms": 2,
"median_price": 4250.0,
"median_price_yoy_change": 3.4,
"num_listings": 87,
"vacancy_rate": 4.1,
"saturation": 1.62,
"median_household_income": 112450.0
}
}

Response — Summary mode

{
"attribution": "Data via Estaite Submarket Index",
"powered_by": "Estaite.com",
"source_domains": [],
"api_version": "v1",
"request_id": "f0a4e9c2-7f8e-4d11-9a7e-7a2f1b4c8e91",
"as_of": "2026-03-01",
"data": {
"mode": "summary",
"zipcode": "90210",
"city": "Beverly Hills",
"state": "CA",
"vacancy_rate": 4.1,
"saturation": 1.62,
"median_household_income": 112450.0,
"segments": {
"apartments": {
"br1": { "median_price": 3100, "yoy_change": 2.8, "listings": 41 },
"br2": { "median_price": 4250, "yoy_change": 3.4, "listings": 87 },
"br3": { "median_price": 5800, "yoy_change": 2.1, "listings": 36 },
"br4": { "median_price": 7200, "yoy_change": 1.5, "listings": 18 }
},
"single_family": { "br1": { }, "br2": { }, "br3": { }, "br4": { } },
"condo_townhome": { "br1": { }, "br2": { }, "br3": { }, "br4": { } }
}
}
}

Fields

Top level (both modes)

FieldTypeDescription
attributionstringRequired attribution. Echo verbatim.
powered_bystringAlways "Estaite.com".
source_domainsstring[]Contributing data-provider domains.
api_versionstringAlways "v1".
request_idstringPer-request UUID.
as_ofstringLatest published month, formatted as YYYY-MM-DD (first of the month).
dataobjectThe payload. data.mode is "slice" or "summary".

data — Slice mode

FieldTypeDescription
modestringAlways "slice".
zipcode, city, statestringZIP identity.
property_type, bedroomsstring / numberEchoes the slice.
median_pricenumberMedian monthly rent for the slice, USD.
median_price_yoy_changenumberYoY change in whole-percent. Note the longer field name in slice mode.
num_listingsnumberListing count for the slice.
vacancy_ratenumberVacancy in whole-percent.
saturationnumberSaturation in whole-percent.
median_household_incomenumberMedian household income for the ZIP, USD.

data — Summary mode

PathTypeDescription
modestringAlways "summary".
zipcode, city, statestringZIP identity.
vacancy_rate, saturationnumberZIP-level market health (same as slice mode).
median_household_incomenumberZIP-level income (same as slice mode).
segments[label][br_key].median_pricenumberMedian rent for the cell, USD.
segments[label][br_key].yoy_changenumberYoY change in whole-percent. ⚠️ Field name differs from slice mode — here it’s just yoy_change, not median_price_yoy_change.
segments[label][br_key].listingsnumberListing count.

Errors

CodeHTTPMeaning
MISSING_ZIP400zip was not provided or is empty.
INVALID_ZIP400zip is not a 5-digit numeric string.
INVALID_PROPERTY_TYPE400property_type is not one of apt, sfr, ct. Only thrown when both property_type and bedrooms are passed (slice mode).
INVALID_BEDROOM_COUNT400bedrooms is outside 1–5. Only thrown in slice mode. The error response includes valid_values: [1,2,3,4,5].
ZIP_NOT_FOUND404No data exists for the requested ZIP.

Notes

  • All percent values are whole-percent. A vacancy_rate of 4.1 means 4.1%, not 410%.
  • Field names differ between slice and summary modes. Slice uses median_price_yoy_change; summary uses just yoy_change. Branch on data.mode when parsing or you’ll silently read undefined.
  • A ZIP can have data even when its containing submarket is sparse, and vice versa. This tool reads the underlying RentalData_Combined view directly rather than going through submarket aggregation.