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 documentedmortgage_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 scope on every block — most of this tool’s data is national, not metro-specific; only metro_hpi and zillow vary by metro. Read scope before reporting a national figure as if it were local to the metro you asked about.
  • metro_hpi.series naming 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). Use bls_get_series directly as a workaround.
  • Most fields are national, not metro-specific. Only metro_hpi and zillow actually vary by the metro you pass — check each block’s scope field 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_shiller is national. For local drilldown, use the already metro-scoped metro_hpi block (FHFA), or attom_sales_trend at ZIP grain.

Last reviewed August 6, 2026