Skip to content

compare_estaite_submarkets

Description

Compares 2–10 submarkets side-by-side in a single call. Accepts names (partial match) or numeric ids — no separate search step required. Returns partial results with a warnings array if any name failed to match.

Two response shapes:

  • Slice mode — pass property_type AND bedrooms to get a flat metrics block per submarket for that one segment.
  • Summary mode (default — omit one or both) — returns a multi-segment segments block per submarket (3 property types × 4 bedrooms).

Inputs

NameTypeRequiredDescription
submarketsarray of string | number, length 2–10yesSubmarket names (partial match supported) or numeric ids.
property_typeenum (apt, sfr, ct)noSet together with bedrooms to get slice mode.
bedroomsinteger 1–5noSame — set both to get slice mode.
includeobjectnoFlags controlling which metric families to return. See below.

include flags

Valid keys and defaults:

KeyDefaultEffect
pricetrueMedian price and YoY/listing block. Currently always present in the metrics output regardless.
listingstrueListing counts.
trendtrueAdds mom_change to the metrics.
affordabilityfalseAdds rent_to_income and affordability_index.
domfalseAdds avg_dom.
markettrueAlways emits market_health block.

Response — Slice mode

{
"attribution": "Data via Estaite Submarket Index",
"powered_by": "Estaite.com",
"api_version": "v1",
"request_id": "f0a4e9c2-7f8e-4d11-9a7e-7a2f1b4c8e91",
"warnings": ["No match found for: notarealmarket"],
"as_of": "2026-05-11T19:42:08.115Z",
"mode": "slice",
"count": 2,
"data": [
{
"submarket_name": "Buckhead",
"city": "Atlanta",
"state": "GA",
"mode": "slice",
"parameters": { "property_type": "apt", "bedrooms": 2 },
"metrics": {
"median_price": 2348,
"yoy_change": 5.0,
"listings": 276,
"mom_change": 0.4
},
"market_health": { "vacancy": 5.5, "saturation": 17.6 }
},
{
"submarket_name": "Roswell / Sandy Springs",
"city": "Atlanta",
"state": "GA",
"mode": "slice",
"parameters": { "property_type": "apt", "bedrooms": 2 },
"metrics": {
"median_price": 1675,
"yoy_change": -4.3,
"listings": 686,
"mom_change": -0.2
},
"market_health": { "vacancy": 5.5, "saturation": 10.0 }
}
]
}

Response — Summary mode

{
"attribution": "Data via Estaite Submarket Index",
"powered_by": "Estaite.com",
"api_version": "v1",
"request_id": "f0a4e9c2-7f8e-4d11-9a7e-7a2f1b4c8e91",
"as_of": "2026-05-11T19:42:08.115Z",
"mode": "summary",
"count": 2,
"data": [
{
"submarket_name": "Buckhead",
"city": "Atlanta",
"state": "GA",
"mode": "summary",
"segments": {
"apartments": {
"br1": { "median_price": 1800, "yoy_change": 4.1, "listings": 130 },
"br2": { "median_price": 2348, "yoy_change": 5.0, "listings": 276 },
"br3": { "median_price": 3100, "yoy_change": 3.6, "listings": 80 },
"br4": { "median_price": 4200, "yoy_change": 2.4, "listings": 24 }
},
"single_family": { "br1": { }, "br2": { }, "br3": { }, "br4": { } },
"condo_townhome": { "br1": { }, "br2": { }, "br3": { }, "br4": { } }
},
"market_health": { "vacancy": 5.5, "saturation": 17.6 }
}
]
}

Fields

Top level

FieldTypeDescription
attributionstringRequired attribution. Echo verbatim.
powered_bystringAlways "Estaite.com".
api_versionstringAlways "v1".
request_idstringPer-request UUID.
warningsstring[]Present only when one or more submarket names failed to match. Each entry is a human-readable note.
as_ofstringISO timestamp of when the response was generated.
modestring"slice" or "summary".
countnumberNumber of matched submarkets returned (≤ length of submarkets input).
data[]arrayPer-submarket records.

data[] — Slice mode

PathTypeDescription
submarket_name, city, statestringSubmarket identity.
modestringAlways "slice".
parametersobjectEchoes the property_type and bedrooms used.
metrics.median_pricenumberMedian monthly rent for the slice, USD.
metrics.yoy_changenumberYear-over-year change in whole-percent.
metrics.listingsnumberListing count.
metrics.mom_changenumberMonth-over-month change. Present when include.trend is true (default).
metrics.rent_to_incomenumberRent-to-income in whole-percent. Present when include.affordability is true.
metrics.affordability_indexnumberAffordability index. Present when include.affordability is true.
metrics.avg_domnumberAverage days on market. Present when include.dom is true.
market_health.vacancynumberVacancy in whole-percent.
market_health.saturationnumberSaturation in whole-percent.

data[] — Summary mode

PathTypeDescription
submarket_name, city, statestringSubmarket identity.
modestringAlways "summary".
segments[label][br_key].median_pricenumberMedian monthly rent, USD.
segments[label][br_key].yoy_changenumberYear-over-year change in whole-percent.
segments[label][br_key].listingsnumberListing count.
market_healthobjectSame as slice mode.

Errors

CodeHTTPMeaning
MINIMUM_TWO_SUBMARKETS_REQUIRED400Fewer than 2 entries supplied.
TOO_MANY_SUBMARKETS400More than 10 entries supplied.
INVALID_PROPERTY_TYPE400Slice property_type invalid.
INVALID_BEDROOM_COUNT400Slice bedrooms outside 1–5. The error response includes valid_values: [1,2,3,4,5].
INSUFFICIENT_MATCHES404No supplied submarket matched. The error response includes a warnings array describing which names failed.

Notes

  • Partial matches resolve to the most specific submarket. Passing "Sandy Springs" may return "Roswell / Sandy Springs" if that’s the canonical record. Pass numeric ids when precision matters.
  • warnings is at the top level, not on the individual record. Failed matches don’t appear in data[] at all — only as a warning string.
  • All percent values are whole-percent. A yoy_change of 5.0 means +5.0%, not 500%.
  • Slice mode is denser; summary mode is wider. Pick slice when you know which segment matters; summary when you want the whole 12-cell grid (apt/sfr/ct × 1–4 BR) at once.