Methodology
Data Source
All wage data comes directly from the BLS Occupational Employment and Wage Statistics (OEWS) program. We download the official all-data Excel file (all_data_M_2025.xlsx) published at bls.gov/oes and import it into a local SQLite database without modification to the underlying wage figures.
Filtering Applied
We apply two filters during import:
- Cross-industry only — We keep rows where
I_GROUP = 'cross-industry', discarding industry-specific breakdowns (e.g., healthcare workers in the finance sector). This gives the broadest, most representative wage figure for each occupation. - Detailed SOC level only — We keep rows where
O_GROUP = 'detailed', discarding broad/major/minor group aggregates. Detailed occupations are the most granular classification.
Geographic Levels
The BLS file contains data at multiple geographic levels, identified by AREA_TYPE:
- Type 1 — National: U.S. aggregate (one row per occupation)
- Type 2 — State: All 50 states + D.C.
- Types 3, 4, 5, 6 — Metro/Nonmetro areas: Metropolitan Statistical Areas, Metropolitan Divisions, Nonmetropolitan areas, and statewide metro aggregates
Suppressed Values
BLS suppresses some cells (shown as #or * in the source file) when there are too few employers to produce a reliable estimate, or when publishing would risk disclosing individual employer wages. These values are stored as NULLand shown as "N/A" on this site.
No Adjustments
We do not adjust wages for cost of living, inflation, or any other factor. All figures are nominal dollars as published by BLS. The survey reference period is May 2025.
URL Slug Generation
Occupation, state, and metro area URL slugs are generated by lowercasing the official BLS title and replacing non-alphanumeric characters with hyphens. Where two different areas share the same slug (e.g., Guam and Virgin Islands as statewide and nonmetro designations), the BLS area code is appended to ensure uniqueness.