Open data
US wage bands and price-adjusted pay
Three datasets derived from federal sources, free to download and reuse under CC BY 4.0. They answer questions the published tables do not: how much pay varies inside one job in one place, what a salary is worth once local prices are taken out of it, and whether the states that force employers to publish a salary range have narrower pay bands.
Built from the BLS Occupational Employment and Wage Statistics and the BEA Regional Price Parities. The build scripts are open: github.com/AndreySoloviev/us-wage-atlas. Archived and citable under doi.org/10.5281/zenodo.21827449.
Pay Band Width by occupation and metro area (OEWS May 2025)
How far apart the middle-of-the-market earners are inside one occupation in one place: the p25–p75 gap expressed as a ratio, as dollars and as a share of the median, for every published occupation-by-metro cell.
- 64,511
- Rows
- CSV
- UTF-8, comma
- CC BY 4.0
- Attribution only
- May 2025
- Reference period
Columns
| area_code, area_name | OEWS area, "US" for the national row |
| soc_code, occupation | SOC code and title |
| p10 … p90 | published annual wage percentiles |
| band_ratio_p75_p25 | p75 divided by p25 |
| band_width_usd, band_pct_of_median | the same gap in dollars and against the median |
| band_regime | narrow / typical / wide, cut at 1.45 and 1.75 |
| interval_collapse_flag | adjacent percentiles collapsed onto one value — excluded from analysis |
| residual_soc_flag | "All Other" catch-all SOC bucket |
| base_pay_only_flag | occupation where equity or bonuses are a large share of pay |
Price-adjusted pay by occupation and metro area (OEWS May 2025 × BEA RPP 2024)
Wages converted into national-average dollars by dividing each metro figure by that metro’s Regional Price Parity, with the housing component kept as its own column so it can be read separately from the all-items index.
- 47,380
- Rows
- CSV
- UTF-8, comma
- CC BY 4.0
- Attribution only
- May 2025 wages × 2024 price parities
- Reference period
Columns
| area_code, cbsa, area_name | OEWS area, its CBSA code and name |
| soc_code, occupation, employment | SOC code, title and metro employment |
| p25, p50, p75 | published annual wage percentiles, nominal |
| rpp_all_items, rpp_goods, rpp_housing | BEA price parities, US average = 100 |
| real_p25, real_p50, real_p75 | the same percentiles in national-average dollars |
| band_ratio_p75_p25 | unchanged by the adjustment, and that is the point |
| oews_period, rpp_year | reference period of each source, because they differ |
Pay band width by occupation and state, with pay-transparency status (OEWS May 2025)
The same band measures at state level, with each jurisdiction tagged by whether a salary range must appear in the job posting, when that requirement took effect, and how many of the survey’s six collection panels it covers. Built to test whether posting mandates narrow the band; they do not, on this data.
- 35,446
- Rows
- CSV
- UTF-8, comma
- CC BY 4.0
- Attribution only
- May 2025
- Reference period
Columns
| area_code, state, state_usps | OEWS state-level area and its postal code |
| soc_code, occupation, employment | SOC code, title and state employment |
| p10 … p90 | published annual wage percentiles |
| posting_status | in_force_long / in_force_recent / enacted_not_in_force / on_request / no_mandate |
| law_effective_date, panels_covered_of_6 | when the posting requirement began, and how much of the estimate it covers |
| band_ratio_p75_p25, decile_ratio_p90_p10 | band width as ratios |
| band_width_usd, band_pct_of_median | the same gap in dollars and against the median |
| in_fixed_basket | occupation published in ≥90% of jurisdictions — the comparable set |
| flag_residual_occupation, flag_interval_collapse, flag_thin_cell, used_in_analysis | every exclusion as a flag rather than a deletion |
What these numbers are not
- The pay band is not negotiating room. A wide p25–p75 gap mixes employer effects, seniority, industry mix and worker characteristics, and aggregate survey data cannot separate them. It describes dispersion, and every causal reading of it is the reader’s.
- Price parities are spatial, not temporal. They compare places within one year and say nothing about inflation.
- The two sources are one year apart. Wages are May 2025; the newest price parities are 2024. Both reference periods ship as columns rather than being smoothed over.
- Base pay only. The wage survey excludes equity and non-production bonuses, which matters most in the highest-paying markets.
- Some cells are artefacts. Where two adjacent published percentiles collapse onto the same value the derived ratio is meaningless, and the files handle that differently. In the two built from the OEWS metro dataset — pay band width and price-adjusted pay — those cells are removed as that dataset is built (3,840 of 67,953, 5.7%), so they appear in no row; the filter is in
scripts/build-comp-dataset.mjsand runs on the public BLS release. The state file keeps them instead: 1,990 cells carryflag_interval_collapseand sit outside the headline figures rather than being dropped.
Citing and reusing
CC BY 4.0 asks only for attribution. Suggested form:
Soloviev, A. (2026). US Wage Atlas: pay-band width and price-adjusted pay by occupation and metro area. Voiced. https://doi.org/10.5281/zenodo.21827449
That is the concept DOI and always resolves to the newest version. Cite 10.5281/zenodo.21827450 for the specific v2025.1 snapshot.
The state-level table is newer than that snapshot and is not in it yet — cite it by its page URL until the next archive version lands.
The underlying BLS and BEA data are US federal works in the public domain; the derived measures, flags and joins in these files are what CC BY covers. Reproduction code and the source files are in the companion repository.