How to Read BLS OEWS Wage Data (and Use It for Salary Ranges)
BLS OEWS is the free, legally defensible wage dataset behind compliant salary ranges. Here's how to read its SOC codes, geographies, and percentile columns.
Rovaryn Digital · May 11, 2026

Why BLS OEWS Is the Right Starting Point for a Defensible Salary Range
Your employment attorney isn't asking whether your salary range "feels right." She's asking how you determined it — what data you used, what geography it reflects, and what methodology produced the numbers you posted. That question comes up the moment a pay-transparency complaint lands, and it comes up in discovery if a pay-equity dispute goes further.
The Occupational Employment and Wage Statistics (OEWS) program, produced by the U.S. Bureau of Labor Statistics, is the dataset that answers that question cleanly. It is federal, publicly available, produced from a sample of approximately 1.1 million establishments, and covers more than 800 occupations at the national, state, and metropolitan area level (BLS, May 2025). It is free. It is the same dataset compensation consultants cite when they build salary structures for larger organizations. And because it is a government publication, citing it in your methodology documentation carries a credibility that a crowd-sourced job-board estimate simply cannot match.
This walkthrough shows you exactly how to read BLS OEWS wage data — what each column means, how to choose the right geography and occupation code, and how to turn the percentile figures into a salary range your organization can post and defend. By the end, you will be able to open a BLS OEWS spreadsheet, identify the right row for any role, and anchor a range minimum, midpoint, and maximum in sourced data.
What the OEWS Program Actually Publishes
The BLS releases OEWS estimates once per year. The May 2025 OEWS national, state, and metropolitan area estimates — the most recent as of this writing — were released on May 15, 2026 (BLS, 2026). Confirm the newest live release at bls.gov/oes before you use any specific figures, because wage estimates are updated annually and older releases should be retired from your documentation once a new one is available.
For each occupation and geography combination, the OEWS publishes five things you need to understand:
Employment — an estimate of how many workers are employed in that occupation in that geography. Useful context, not the number you use in your salary range.
Hourly wage percentiles — wages at the 10th, 25th, 50th, 75th, and 90th percentile of the hourly wage distribution for that occupation and geography.
Annual wage percentiles — the same five points, expressed as annual figures. For most salaried roles you will work from the annual columns.
The mean wage — the arithmetic average. Means are skewed upward by high earners; for range-setting purposes, the median (the 50th percentile — the wage below which half of workers in that occupation and geography earn) is the more stable and more commonly used anchor.
A top-code flag — BLS caps reported wages at a top-code ceiling (currently $239,200 annually for the highest percentiles in high-wage occupations). If you see $239,200 at the 90th percentile, that is a top-code, not the actual 90th-percentile wage. Note it as such in your documentation.
You can learn more about how percentile wages work and why the median is the right anchor for most SMB salary structures in our plain-English guide to percentile wages.
Understanding SOC Codes: The Bridge Between a Job Title and BLS Data
Before you can pull a wage figure, you need to know which BLS occupation your role maps to. The BLS organizes all occupations using the Standard Occupational Classification (SOC) system — a six-digit code that groups similar jobs together. SOC codes are the rows in the OEWS spreadsheet.
A SOC code looks like this: 15-1252 (Software Developers). The first two digits are the major group (15 = Computer and Mathematical Occupations). The next four narrow it to a specific occupation.
The mapping from your internal job title to the right SOC code is not always obvious. A "People Operations Generalist" does not appear in the BLS taxonomy by that name. You need to read the SOC occupational description and decide which code most closely matches the actual duties — not the title — of the role. For a detailed walkthrough of that decision process, see our guide to how to map SOC codes to job titles.
A few practical notes on SOC mapping:
- Broad vs. detailed codes. Some SOC codes are very broad (e.g., 11-1021, General and Operations Managers, which covers an enormous range of roles). If your role is specialized enough, look for a narrower code within the same major group.
- One code per range-build cycle. Pick the single most representative code. If the role genuinely spans two distinct occupations, note that judgment call in your methodology documentation.
- Verify the code is in the OEWS. Not every SOC code in the broader O*NET taxonomy appears in every OEWS geographic file. If a code is missing in a metro file, fall back to the statewide estimate, then the national estimate.
Choosing the Right Geography: National, State, or Metro
The OEWS publishes wage estimates at three geographic levels: national, state, and metropolitan statistical area (MSA). Using the right level matters both for accuracy and for compliance documentation — a pay-transparency law in a specific state is not satisfied by a national median that happens to be in the ballpark.
National estimates are appropriate when: the role is fully remote with no specific location requirement, your hiring pool is genuinely nationwide, or no state or metro estimate exists for that SOC code.
State estimates are appropriate when: the role is based in a specific state, or when a state's pay-transparency law applies and you want the wage figure to reflect that labor market.
Metro area (MSA) estimates are appropriate when: the role is based in or predominantly draws applicants from a specific metro area. Metro wages often differ substantially from statewide averages — a software developer salary in San Jose looks very different from the California statewide figure.
For multi-location or remote roles that trigger multiple jurisdictions simultaneously, you may need to document multiple geographic anchors and disclose the range that covers the full spread. Our article on geographic pay differentials covers that scenario in detail.
A practical note on data availability: Metro-level OEWS files are large and not every occupation has a publishable estimate at the MSA level (sample size suppression). When an estimate is suppressed, BLS will show it as blank or with an asterisk. In that case, step up to the statewide file.
Reading the OEWS Spreadsheet: Column by Column
When you download an OEWS file from bls.gov/oes, you will typically find a flat Excel or CSV file with one row per occupation. Here are the columns you need and what they mean:
| Column label | What it means |
|---|---|
OCC_CODE |
The six-digit SOC code |
OCC_TITLE |
The BLS occupation title |
TOT_EMP |
Estimated total employment in this occupation/geography |
H_PCT10 |
10th percentile hourly wage |
H_PCT25 |
25th percentile hourly wage |
H_MEDIAN |
Median (50th percentile) hourly wage |
H_PCT75 |
75th percentile hourly wage |
H_PCT90 |
90th percentile hourly wage |
A_PCT10 |
10th percentile annual wage |
A_PCT25 |
25th percentile annual wage |
A_MEDIAN |
Median (50th percentile) annual wage |
A_PCT75 |
75th percentile annual wage |
A_PCT90 |
90th percentile annual wage |
Annual vs. hourly. For salaried exempt positions, use the annual (A_) columns. For hourly or non-exempt roles, use the hourly (H_) columns. If you need to convert an hourly figure to an annual full-time equivalent for a posting that requires an annual range, multiply the hourly figure by 2,080 (52 weeks × 40 hours) — but label that arithmetic clearly as a full-time-equivalent calculation in your documentation, not as a separate BLS-published figure.
What each percentile tells you. The 10th percentile is the wage below which 10% of workers in that occupation and geography earn — roughly the floor of the market. The 25th percentile is the wage below which 25% earn — the lower-middle of the market. The median (50th percentile) is the midpoint of the distribution. The 75th percentile is the upper-middle. The 90th percentile is near the ceiling of what the market pays for that role.
For a deeper explanation of how to interpret and apply these five points, see our guide to percentile wages explained.
Turning OEWS Percentiles Into a Salary Range: A Worked Example
Once you have the right SOC code, geography, and release year, you have the raw material. Now you need a methodology to convert five percentile points into a posted range with a defensible minimum, midpoint, and maximum.
Here is how that works in practice, using BLS OEWS data for a real occupation.
Step 1 — Identify your anchor percentile. Most compensation methodologies use the market median (50th percentile) as the range midpoint — the wage that sits exactly in the middle of the market distribution. Some organizations set their compensation philosophy above or below median (e.g., "we pay at the 60th percentile to attract strong candidates"); that is a legitimate policy choice, but you should document it explicitly.
Step 2 — Choose a range spread. The range spread is how wide your salary band is, expressed as a percentage of the midpoint. A narrow band (e.g., 20%) suits highly standardized roles with limited growth trajectory. A wider band (e.g., 50%–80%) suits senior, technical, or highly variable roles. The formula: if you want a band with a 50% spread anchored at a $100,000 midpoint, your minimum is $100,000 ÷ 1.25 = $80,000 and your maximum is $80,000 × 1.50 = $120,000. (The 1.25 and 1.50 multipliers are the standard formula for a symmetric spread around the midpoint.)
Step 3 — Apply real OEWS figures. Take accountants and auditors (SOC 13-2011) as an example. The BLS OOH reports a national median annual wage of $81,680 (BLS OOH, May 2024). Using a 50% range spread:
- Range midpoint: $81,680 (market median, national)
- Range minimum: $81,680 ÷ 1.25 = $65,344
- Range maximum: $65,344 × 1.50 = $98,016
Your documented posting range for a nationally-benchmarked accountant role might therefore read: $65,000–$98,000 (rounded to a clean number, with documentation showing the underlying BLS median and spread methodology). Note that rounding is a legitimate step — but document the pre-rounding figures.
Step 4 — Adjust for geography if applicable. The national median is your baseline. If the role is based in a high-cost metro area, the relevant state or MSA OEWS estimate will generally be higher; if it is in a lower-wage market, it may be lower. Pull the state or MSA file and substitute the geography-specific median as your anchor. Our full walkthrough on how to build a salary range covers this adjustment in detail.
Step 5 — Document everything. Your documentation should record: the SOC code used and why, the OEWS release year and geography, the anchor percentile and its dollar value, the range spread chosen and the rationale, and the resulting min/mid/max before and after rounding. This is the paper trail your attorney is asking for.
Common Mistakes When Reading BLS OEWS Data
Knowing how to read BLS OEWS data also means knowing where practitioners regularly go wrong.
Using the mean instead of the median. Because high-wage earners pull the mean upward, the mean wage is almost always higher than the median. If you anchor a range on the mean and your methodology comes under scrutiny, you may have difficulty explaining why your range is systematically above the midpoint of the market. Use the median unless you have a specific, documented reason not to.
Mismatching geography. Pulling a national figure for a role in a high-cost metro, or a California statewide figure for a role in San Francisco, will produce a range that is systematically misaligned with the local labor market. Geography matching is one of the most consequential methodological choices you make.
Treating the 90th percentile as a maximum. The 90th percentile is a data point, not a ceiling. Your range maximum is a policy decision — where you are willing to pay the most senior, fully experienced incumbent in that role. Anchoring the maximum to the 90th percentile is defensible, but anchoring it to the 75th percentile for a role where you genuinely do not pay at the top of the market is equally defensible (and more honest if that reflects your pay philosophy).
Ignoring the top-code. If you see $239,200 in the 90th percentile column, flag it. That is the BLS reporting ceiling, not the actual 90th-percentile wage. Note it in your documentation.
Failing to record the release year. OEWS data is updated annually. If you build a range from the May 2023 release and post it in 2026, you are using wage data that is three years old. Document the release year and set a calendar reminder to refresh your ranges when a new OEWS release comes out each year.
For a complete end-to-end look at the range-building process — from SOC selection through compliance formatting — visit our salary range resource hub.
From OEWS Data to a Posted Range: Your Next Step
Learning how to read BLS OEWS data is the foundation. Turning it into a consistently formatted, audit-ready posted range for every role in your organization — across multiple geographies, with a documented methodology — is where most HR generalists and people-ops leads run out of time.
Our Compensation Benchmarking Spreadsheet is built to do the mechanical work for you: it maps SOC codes to your job titles, pulls the relevant OEWS percentile columns into a structured template, applies your chosen range spread, and outputs a formatted range with the release year, geography, and methodology watermarked in — the documentation your attorney needs, in a format you can email the same day you build the range.
If you are ready to move beyond the spreadsheet and need a full pay-transparency compliance workflow — range building, posting documentation, and multi-jurisdiction formatting — see our pricing for the plan that fits your organization's size and jurisdictional exposure.
The BLS data is free. The time it takes to read it correctly, apply the right methodology, and produce a defensible output is not. That is the problem we built Salary Range Builder to solve.
Get new guides in your inbox
One email when a new article goes live. Unsubscribe with one click.


