Recipe: Housing market brief
The task
You want a structured housing brief for a US metro — current 30-year mortgage rate, national and metro-level home price trends, and Zillow inventory/rent signals — in one call.
Tool used: housing_market_snapshot (primary), optionally attom_sales_trend and
altos_market_stats for paid drilldowns.
Calls: 1 (compound) for the free-data brief; +2 if you have ATTOM/Altos keys.
Copy-paste prompt
Give me a housing market brief for <metro> using Pipeworx: current 30-year mortgage rate, home
price trend (national and metro), and inventory/rent signals. Flag clearly if the employment leg
of the compound tool comes back unavailable rather than silently omitting it.
What a good answer looks like
housing_market_snapshot({ metro_name: "Denver" })
returns (live call, 2026-08-06 — trimmed):
{
"snapshot_date": "2026-08-06",
"metro": "Denver",
"note": "Mortgage rate, housing starts, Case-Shiller, unemployment, OER, and construction employment are national. metro_hpi is metro-specific (FHFA). zillow is metro- or national-scoped depending on metro_name.",
"mortgage_rate": { "scope": "national", "current": 6.69, "4wk_ago": 6.55, "trend": "rising" },
"case_shiller": { "scope": "national", "current": 331.02, "3mo_trend": [ "..." ] },
"unemployment": { "scope": "national", "error": "unavailable" },
"owners_equiv_rent": { "scope": "national", "error": "unavailable" },
"construction_employment": { "scope": "national", "error": "unavailable" },
"metro_hpi": {
"series": "ATNHPIUS19740Q", "metro": "Denver", "current": 496.42, "trend": "stable",
"yoy": { "change": 2.07, "pctChange": 0.42 }
},
"zillow": {
"scope": "metro", "region": "Denver, CO",
"home_value_index": { "date": "2026-06-30", "value": 572681.56, "note": "ZHVI — smoothed seasonally-adjusted mid-tier all-homes (USD)" },
"median_sale_price": { "date": "2026-07-04", "value": 599000 },
"inventory": { "date": "2026-06-30", "value": 15080 }
}
}
Note this response shape is not what an older draft of this recipe documented —
mortgage_rate_30y/home_price_index don’t exist; the real fields are mortgage_rate and
case_shiller, and every block carries its own scope ("national" vs "metro") rather than a
single top-level _meta.sources list.
A trustworthy answer has:
- a
scopeon every block — most of this tool’s data is national, not metro-specific; onlymetro_hpiandzillowvary by metro. Readscopebefore reporting a national figure as if it were local to the metro you asked about. metro_hpi.seriesnaming the exact FHFA CBSA series behind the metro figure, so it’s re-fetchable.- Zillow fields each carrying their own
date, since ZHVI/ZORI/median-sale-price update on different cadences.
A plausible-sounding failure looks like three data fields present, populated, and consistently
empty — every single call. Live-verified 2026-08-06 with fresh (uncached) calls across two
different metros: unemployment, owners_equiv_rent, and construction_employment came back as
{"scope": "national", "error": "unavailable"} every time, despite the underlying BLS series
(LNS14000000, CUUR0000SEHC, CES2000000001) resolving instantly and correctly when queried
directly — either via bls_get_series({series_id: "LNS14000000"}) on this gateway, or via a raw
curl to api.bls.gov from a non-Cloudflare IP (142ms response, real data). The recipe’s own
headline promise — mortgage rates, home prices, inventory, and employment — is currently
false for the employment leg on every call. This isn’t a data-availability gap; it’s a
reproducible Cloudflare-egress failure in the compound tool’s internal BLS sub-call, filed as
fleet task #159. Until it’s fixed, get employment data directly:
bls_get_series({ series_id: "LNS14000000" }) // national unemployment rate — works today
Step-by-step tool calls
Fast path: one call
housing_market_snapshot({ metro_name: "Denver" })
Wraps FRED (mortgage rate, Case-Shiller, metro HPI), BLS (unemployment, OER, construction employment — currently broken, see above), and Zillow (home value/rent/inventory, via our own hosted mirror) into one response.
Manual path
If you want to control which series directly:
fred_get_series({ series_id: "MORTGAGE30US" }) // 30Y mortgage rate, weekly
fred_get_series({ series_id: "CSUSHPISA" }) // national home price index
bls_get_series({ series_id: "LAUMT081974000000003" }) // Denver-Aurora-Lakewood MSA unemployment
fred_get_series({ series_id: "HOUST" }) // national housing starts
On the metro unemployment series ID: an earlier version of this recipe used
LAUMT080000000000003, which BLS rejects outright ("Series does not exist for Series LAUMT080000000000003") — a bare, well-formed-looking series ID that simply isn’t real. The
correct BLS LAUS code for the Denver-Aurora-Lakewood, CO metro area is
LAUMT081974000000003 (the 1974 matches the same CBSA code, 19740, that
housing_market_snapshot’s metro_hpi.series uses for Denver — a useful way to cross-check a
metro series ID before trusting it).
Each fred_get_series/bls_get_series call works anonymously; FRED calls also accept _apiKey
for a BYO key if you’re hitting the shared-key rate limit.
With ATTOM / Altos (paid, BYO key)
attom_sales_trend({ geoid: "ZI80202", interval: "quarterly", startYear: "2023", endYear: "2026", _apiKey: "..." })
// → average/median sale price, sales volume, price changes per period, at ZIP grain
// (geoid is the ZIP prefixed with "ZI")
altos_market_stats({ region: "us-co-denver", _apiKey: "..." })
// → real-time inventory, weekly trend, single-family vs condo
Both currently require a BYO key — live-verified: calling either without _apiKey returns a
clear tool_error naming where to get one, not a silent partial result.
Or hit the housing-intel pack directly, scoped to just its tools:
gateway.pipeworx.io/housing-intel/mcp
Citation pattern
Denver housing market: 30Y mortgage 6.69% (national, FRED MORTGAGE30US), national Case-Shiller index 331.0. Denver metro HPI (FHFA, series ATNHPIUS19740Q) 496.4, +2.1% YoY. Zillow median sale price $599,000 (2026-07-04), for-sale inventory 15,080 (2026-06-30). Employment data currently unavailable — see caveat.
Use the prompt
prompts/get({ name: "housing_market_brief", arguments: { metro: "Denver" } })
Returns a substituted prompt that orchestrates the snapshot tool, layers ATTOM/Altos when available, and concludes with a buyer-vs-seller-vs-balanced verdict.
Caveats
- Employment data (
unemployment,owners_equiv_rent,construction_employment) is currently unavailable on every call — a Cloudflare-egress issue in the tool’s BLS sub-call, not a data gap (fleet task #159). Usebls_get_seriesdirectly as a workaround. - Most fields are national, not metro-specific. Only
metro_hpiandzillowactually vary by the metro you pass — check each block’sscopefield before treating a national figure as local. - Metro names need to match Census MSA naming. “Denver” auto-resolves; local nicknames may not. Use the canonical MSA name when in doubt.
- FRED data lag. MORTGAGE30US updates weekly (Thursdays); home price indexes lag ~2 months.
- National vs metro home-price indexes.
case_shilleris national. For local drilldown, use the already metro-scopedmetro_hpiblock (FHFA), orattom_sales_trendat ZIP grain.