BLS Real Estate
Metro labor, county wages, regional rent CPI, national JOLTS — five BLS programs in one skill.
Jobs drive rent. A BLS skill teaches Claude which metro-level employment and wage series lead the housing-demand read, and how to pull them from BLS's v2 API (LAUS + CES + CPI-U + JOLTS) and the QCEW CSV-slice endpoint directly — at the grain FRED aggregates past. Ships 11 metrics across 5 program families with Florida + US benchmarks wherever BLS publishes natively.
Reference US labor-market, wages, rent inflation, and job-openings data from BLS (U.S. Bureau of Labor Statistics, Public Data API v2 + QCEW CSV slices) for real estate investment decisions. Use this skill whenever a user asks about BLS data, Bureau of Labor Statistics, LAUS, unemployment rate, labor force, Tampa MSA unemployment, Hillsborough unemployment, county unemployment rate, metro labor force, CES, nonfarm payrolls, Tampa payrolls, construction employment, leisure and hospitality employment, metro sector jobs, QCEW, Quarterly Census of Employment and Wages, county wages, Hillsborough wages, average weekly wage, county private employment, CPI-U, Consumer Price Index, South CPI, rent of primary residence, owners equivalent rent, OER, regional rent inflation, JOLTS, Job Openings and Labor Turnover Survey, job openings rate, labor market tightness, or which BLS programs inform a residential RE decision at the metro, county, region, or national grain against Florida and US benchmarks. Maps 11 BLS metrics across 5 program families (LAUS, CES, QCEW, CPI-U, JOLTS) to investor use-cases. Progressive disclosure — decision playbooks and the full 11-metric reference live in `references/`.
BLS for Real Estate
What is BLS
BLS is the U.S. Bureau of Labor Statistics — bls.gov. The Department of Labor's statistical arm, publisher of the monthly jobs report, CPI, JOLTS, and the county-level wage and employment data that Tampa-area investors actually need. For US residential real estate, it's the authoritative single stop for labor-market tightness, metro/county employment, regional rent inflation, and wage levels — the demand-side fuel behind every rent and absorption story.
BLS publishes at national, Census region (CPI-U only), state, MSA, and county grains, but coverage varies per program family — LAUS has county, CES is MSA-native with no county, QCEW is county-native, CPI-U rent subindexes only publish at the four Census Divisions + national, JOLTS is national-only at the finest useful cut. Pair with Census ACS for tract-level demographics and with FRED for macro aggregates.
Bundled resources
| File | When to load |
|---|---|
references/metrics.md | When a user asks about a specific BLS metric, needs a seriesID or QCEW CSV URL to pull, or any decision playbook below points here. Full 11-metric list grouped by program family, with one-line rationale each. |
references/bls-datasets.yaml | When you need richer metadata than metrics.md provides — per-program api_path dispatch, full benchmark series IDs, copy-pasteable Python snippets. The canonical catalog, 100% field coverage. |
Progressive disclosure rule: start with this file and the program-family table below. Read references/metrics.md only when a specific metric or seriesID is actually needed. Read the YAML only when the markdown is insufficient.
Getting an API key
- Register for a free v2 key at data.bls.gov/registrationEngine. Instant; no approval.
- Set environment variable:
BLS_API_KEY=your_key_here - Install:
pip install requests python-dotenv - Rate limit: 500 queries/day on the registered v2 tier (vs 25/day unregistered). Not a concern for catalog-scale pulls.
- QCEW CSV-slice endpoint is keyless and separate from the v2 query quota.
Minimal Python example
import os
import requests
BLS_API_KEY = os.environ["BLS_API_KEY"]
payload = {
"seriesid": ["LAUMT124530000000003"], # Tampa MSA unemployment rate
"startyear": "2025",
"endyear": "2026",
"registrationkey": BLS_API_KEY,
}
r = requests.post(
"https://api.bls.gov/publicAPI/v2/timeseries/data/",
json=payload,
timeout=30,
)
data = list(reversed(r.json()["Results"]["series"][0]["data"]))
for row in data[-12:]:
print(f"{row['year']}-{row['period']}: {row['value']}%")Swap the seriesid for any series ID from references/metrics.md. For QCEW metrics (bls_hillsborough_avg_weekly_wage / bls_hillsborough_private_employment), use the CSV-slice endpoint instead — see references/metrics.md for the keyless URL pattern.
The 5 program families
| Program | Purpose | Grain | Count |
|---|---|---|---|
LAUS | Local Area Unemployment Statistics — household-survey unemployment rate + labor force | MSA + county | 3 |
CES | Current Employment Statistics — establishment-survey nonfarm payrolls + sector employment | MSA (metro-native, no county cut) | 3 |
QCEW | Quarterly Census of Employment and Wages — near-full count of UI-covered workers + wages | County-native | 2 |
CPI-U | Consumer Price Index for All Urban Consumers — rent + owners' equivalent rent subindexes | Census Division region + national (no state, no MSA for rent subindexes) | 2 |
JOLTS | Job Openings and Labor Turnover Survey — national labor-market tightness | National-only at the useful cut | 1 |
Total: 11 metrics. See references/metrics.md for the full list with seriesIDs and benchmarks.
Decision playbooks
Concrete "the user asked X — here's the metric set to pull." Use these as starting points; extend when the question demands it. If a playbook names a metric, references/metrics.md has the one-line rationale.
"Is Tampa at full employment?"
→ bls_tampa_unemployment_rate, bls_hillsborough_unemployment_rate, bls_national_jolts_openings_rate
MSA + county unemployment rates read the supply side of the labor market; JOLTS openings rate reads the demand side. When all three are low, labor is tight — expect wage pressure and rent-growth tailwind. When openings fall sharply but unemployment stays low, that's the soft-landing signal.
"Can the market absorb a rent bump?"
→ bls_hillsborough_avg_weekly_wage, bls_south_cpi_rent_primary, bls_hillsborough_private_employment
County wage growth is the denominator behind every affordability check; regional rent inflation shows what the market is already doing; private employment trajectory says whether the paying tenant base is expanding. If wages are outpacing rent inflation, you have room; if rent CPI is running hot against flat wages, you don't.
"Where's the Tampa jobs pipeline headed?"
→ bls_tampa_nonfarm_payrolls, bls_tampa_construction_employment, bls_tampa_leisure_hospitality_employment
Total MSA payrolls is the headline; construction is the supply-side leading indicator (payrolls roll over before housing completions); leisure/hospitality is the tourism-exposed piece that falls hardest in a downturn and rebounds fastest.
"Is the Fed about to ease / tighten?"
→ bls_south_cpi_rent_primary, bls_south_cpi_oer, bls_national_jolts_openings_rate
OER is ~33% of headline CPI — when OER decelerates, headline CPI follows and the Fed's hawkish cover weakens. JOLTS openings rate is the labor-market thermometer the Fed watches. Regional rent CPI leads OER by ~6 months (BLS smooths OER), so South rent primary is the early read.
"How does Tampa's labor market compare to FL + US?"
→ Any LAUS or CES entry + its benchmark_geos[]
Every LAUS + CES + QCEW entry ships with Florida + US benchmarks (series[] role-tagged: primary, benchmark, benchmark). Chart renders 3-line; reading cites at least one benchmark by name. When Tampa diverges from FL + US in the same direction, that's a local story — not a macro one.
Gotchas
- Per-program featured geo. Forcing "Hillsborough County payrolls" when BLS only publishes Tampa MSA payrolls fabricates data that doesn't exist. LAUS has MSA + county; CES is MSA-native with no county; QCEW is county-native; CPI-U rent subindexes are region-only. Always match the query to what the program publishes.
- SA vs NSA doesn't always match between primary and benchmarks. Tampa MSA LAUS unemployment is NSA (LAUMT prefix); FL state + US benchmarks use SA series (LASST / LNS). Acceptable when the cycle story is what matters, problematic when month-over-month precision does.
- CES at metro × sector is NSA only.
SMSprefix (SA) publishes total nonfarm at MSA;SMUprefix (NSA) publishes every sector at MSA. All-three-line charts use NSA everywhere (SMU for metro + state, CEU for national) to keep adjustment consistent. - QCEW lag is ~5 months. The 2024 annual file publishes in September 2025. The most-recent-year pull may 404 temporarily — fetch module walks back until it finds a published year.
- QCEW series-ID format is a bear trap. Sprint 5 tried the 17-character
ENUR[state][county][own][industry][datatype]format and every permutation returned "Invalid Series ID." Skill uses the CSV-slice endpoint instead (decision #122):https://data.bls.gov/cew/data/api/{year}/a/area/{area_fips}.csv, filterown_code=5+industry_code=10for private all-industries. - CPI-U rent subindexes don't publish at state or MSA. Only the four Census Divisions (Northeast / Midwest / South / West) + national. For Tampa, South Region is the finest cut. Tampa all-items CPI-U does publish (series
CUUSA323SA0), but its rent-of-primary and OER subindexes don't — don't guess at an MSA rent-subindex series ID. - JOLTS regional cuts mix geographies. BLS publishes JOLTS at 4 regions (Northeast / Midwest / South / West) but the South rollup bundles Tampa's service-sector-exposed economy with manufacturing-heavy Southeast. National JOLTS is the cleanest read for a metro-level narrative.
- BLS v2 data array is newest-first. Reverse to ascending before trimming to last N. Easy to forget and silently ship a chart that reads right-to-left.
- M13 period code is "annual average," not a monthly observation. Skip it when parsing — BLS includes it in the monthly-period response alongside M01–M12.
- 500 queries/day is per key, not per IP. Batching up to 50 series per POST keeps the quota healthy; each BLS catalog entry's primary + benchmarks fit in one POST.
Source of truth
This skill is derived from TiRE's canonical catalog at agents/data/bls-datasets.yaml. The YAML is hand-curated; every entry has a why_it_matters rationale that feeds both this skill and TiRE's research agents.
When the upstream catalog changes, regenerate references/metrics.md and references/bls-datasets.yaml. v1 is hand-curated; build script deferred until drift is observed.