How the salary pages are built
There are 383 metro salary pages on this site. They are generated by a script from a single BLS data release, and this page says exactly which numbers are BLS's, which are ours, and what the data does not tell you.
The source
U.S. Bureau of Labor Statistics, Occupational Employment and Wage Statistics (OEWS), 2025 release, occupation SOC 49-9021, Heating, Air Conditioning, and Refrigeration Mechanics and Installers. Retrieved 2026-08-15 through the BLS public API. One release, one occupation code, no blending of sources.
Read straight from BLS, unmodified
- Employment: the number of people BLS counts in this occupation in that area.
- Annual mean wage.
- The five annual wage percentiles: 10th, 25th, 50th (median), 75th, 90th.
- Hourly median wage.
- The relative standard error BLS publishes for its own mean-wage estimate.
Computed by us, from those figures
- Hourly and annual conversions where we show one and BLS gave the other: the hourly wage at 2,080 hours a year. Stated on every page.
- Comparisons to state and national medians, as percentage differences.
- Pay spread: 90th minus 10th percentile, and 75th minus 25th.
- The mean-versus-median gap, and which way it points.
- Rank by median wage and by employment, computed across the 383 areas on this site only, not against any external ranking.
- Share of national employment.
- The offer evaluator: where an hourly rate you type falls is estimated by interpolating linearly between the five published percentile points. BLS does not publish a continuous distribution, so that is an interpolation and the tool labels it as one. Outside the 10th and 90th we say "at or below" and "at or above" rather than inventing a tail.
What is standardized
The explanatory text around the figures follows a common structure so that any two areas can be read against each other without re-learning the page. The numbers, the comparisons and the conclusions drawn from them are specific to each area, and the wording branches where the data demands it. For example, the 259 larger markets and the 124 areas with fewer than 200 technicians carry different caveats, and the mean-versus-median explanation differs depending on which side of the median the average actually falls.
Which areas get a page
Every metropolitan area for which BLS publishes complete, unsuppressed estimates for this occupation: 383 of them. Areas with suppressed or partial data are excluded rather than estimated. The largest relative standard error on any mean wage shown here is 7.8%.
What this data does not cover
- Self-employed technicians are excluded from OEWS entirely. In a trade with many owner-operators, that is a real gap.
- Wages exclude overtime, and exclude the value of benefits, vehicles, tools and on-call premiums.
- Each release combines survey panels collected over three years, adjusted to the reference period. It is a stable estimate, not a snapshot of this month's postings.
- The employment outlook is national. BLS does not publish this projection by metropolitan area, so the 8% growth figure is never presented as local. Source.
- For multi-state metros, the state compared against is the first listed in the official BLS area title, and each page says which that is.
Corrections
If a figure here does not match what BLS publishes, that is a bug and we want to hear about it: hello@hvacexamlab.com. We have published corrections to our own pages before rather than editing quietly; the passing score page carries one.
Model generated 2026-08-15. Percentiles and employment are BLS OEWS estimates as published. vsNational and vsState are ratios of annual median wage. spread is the p90/p10 ratio. Ranks are computed across the metros in this file only.