{
  "title": "Highest-paying US metros for skilled trades",
  "generated": "2026-06-01",
  "dataSource": "BLS OEWS May 2025 metropolitan files",
  "notes": [
    "Raw BLS OEWS May 2025 metropolitan medians (p50). Not cost-of-living adjusted: expensive metros rank higher partly because they are expensive. These are highest-PAYING metros, not \"best places to work.\"",
    "Metros are ranked by the median wage across the consistent basket of trades BLS reports in every covered metro (apples-to-apples). Ranking on each metro's own trade mix would inflate metros that simply lack their low-paying trades.",
    "Some metro x trade cells are suppressed by BLS (thin sample) and excluded entirely - never imputed. Per-trade leaders show how many metros reported the trade.",
    "Metro set is the 50 US metros with the most skilled-trades employment; not every US metro is covered."
  ],
  "summary": {
    "metroCount": 50,
    "tradeCount": 30,
    "basketSize": 15,
    "basketTrades": [
      "Carpenter",
      "Cement Mason",
      "Construction Equipment Operator",
      "Construction Laborer",
      "Electrician",
      "Hazardous Materials Removal Worker",
      "HVAC Technician",
      "Industrial Machinery Mechanic",
      "Painter",
      "Plumber",
      "Power-Line Worker",
      "Roofer",
      "Sheet Metal Worker",
      "Telecom Line Installer",
      "Welder"
    ],
    "cellsPossible": 1500,
    "cellsPresent": 1302,
    "cellsSuppressed": 198,
    "coveragePct": 86.8,
    "top": {
      "metroName": "San Jose, CA",
      "primState": "CA",
      "basketMedian": 82050
    },
    "bottom": {
      "metroName": "San Antonio, TX",
      "primState": "TX",
      "basketMedian": 48900
    },
    "spread": 33150
  },
  "rankings": [
    {
      "rank": 1,
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "basketMedian": 82050,
      "basketMean": 90076,
      "tradesPresent": 25
    },
    {
      "rank": 2,
      "metroSlug": "chicago-il",
      "metroName": "Chicago, IL",
      "primState": "IL",
      "basketMedian": 80440,
      "basketMean": 82739,
      "tradesPresent": 29
    },
    {
      "rank": 3,
      "metroSlug": "seattle-wa",
      "metroName": "Seattle, WA",
      "primState": "WA",
      "basketMedian": 79920,
      "basketMean": 82972,
      "tradesPresent": 28
    },
    {
      "rank": 4,
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "basketMedian": 78490,
      "basketMean": 87166,
      "tradesPresent": 29
    },
    {
      "rank": 5,
      "metroSlug": "new-york-ny",
      "metroName": "New York, NY",
      "primState": "NY",
      "basketMedian": 76400,
      "basketMean": 78833,
      "tradesPresent": 30
    },
    {
      "rank": 6,
      "metroSlug": "boston-ma",
      "metroName": "Boston, MA",
      "primState": "MA",
      "basketMedian": 75210,
      "basketMean": 76256,
      "tradesPresent": 25
    },
    {
      "rank": 7,
      "metroSlug": "minneapolis-mn",
      "metroName": "Minneapolis, MN",
      "primState": "MN",
      "basketMedian": 74800,
      "basketMean": 76147,
      "tradesPresent": 28
    },
    {
      "rank": 8,
      "metroSlug": "portland-or",
      "metroName": "Portland, OR",
      "primState": "OR",
      "basketMedian": 73710,
      "basketMean": 75669,
      "tradesPresent": 29
    },
    {
      "rank": 9,
      "metroSlug": "milwaukee-wi",
      "metroName": "Milwaukee, WI",
      "primState": "WI",
      "basketMedian": 72680,
      "basketMean": 70423,
      "tradesPresent": 24
    },
    {
      "rank": 10,
      "metroSlug": "san-diego-ca",
      "metroName": "San Diego, CA",
      "primState": "CA",
      "basketMedian": 72510,
      "basketMean": 73443,
      "tradesPresent": 28
    },
    {
      "rank": 11,
      "metroSlug": "los-angeles-ca",
      "metroName": "Los Angeles, CA",
      "primState": "CA",
      "basketMedian": 72090,
      "basketMean": 74131,
      "tradesPresent": 30
    },
    {
      "rank": 12,
      "metroSlug": "sacramento-ca",
      "metroName": "Sacramento, CA",
      "primState": "CA",
      "basketMedian": 66670,
      "basketMean": 73380,
      "tradesPresent": 27
    },
    {
      "rank": 13,
      "metroSlug": "st-louis-mo",
      "metroName": "St. Louis, MO",
      "primState": "MO",
      "basketMedian": 66080,
      "basketMean": 69641,
      "tradesPresent": 26
    },
    {
      "rank": 14,
      "metroSlug": "detroit-mi",
      "metroName": "Detroit, MI",
      "primState": "MI",
      "basketMedian": 65810,
      "basketMean": 68847,
      "tradesPresent": 27
    },
    {
      "rank": 15,
      "metroSlug": "providence-ri",
      "metroName": "Providence, RI",
      "primState": "RI",
      "basketMedian": 64770,
      "basketMean": 68523,
      "tradesPresent": 25
    },
    {
      "rank": 16,
      "metroSlug": "philadelphia-pa",
      "metroName": "Philadelphia, PA",
      "primState": "PA",
      "basketMedian": 64580,
      "basketMean": 69785,
      "tradesPresent": 29
    },
    {
      "rank": 17,
      "metroSlug": "columbus-oh",
      "metroName": "Columbus, OH",
      "primState": "OH",
      "basketMedian": 64440,
      "basketMean": 63762,
      "tradesPresent": 24
    },
    {
      "rank": 18,
      "metroSlug": "riverside-ca",
      "metroName": "Riverside, CA",
      "primState": "CA",
      "basketMedian": 64300,
      "basketMean": 69617,
      "tradesPresent": 27
    },
    {
      "rank": 19,
      "metroSlug": "denver-co",
      "metroName": "Denver, CO",
      "primState": "CO",
      "basketMedian": 63150,
      "basketMean": 64759,
      "tradesPresent": 27
    },
    {
      "rank": 20,
      "metroSlug": "cincinnati-oh",
      "metroName": "Cincinnati, OH",
      "primState": "OH",
      "basketMedian": 62990,
      "basketMean": 63267,
      "tradesPresent": 25
    },
    {
      "rank": 21,
      "metroSlug": "cleveland-oh",
      "metroName": "Cleveland, OH",
      "primState": "OH",
      "basketMedian": 62790,
      "basketMean": 63117,
      "tradesPresent": 27
    },
    {
      "rank": 22,
      "metroSlug": "kansas-city-mo",
      "metroName": "Kansas City, MO",
      "primState": "MO",
      "basketMedian": 62250,
      "basketMean": 65323,
      "tradesPresent": 27
    },
    {
      "rank": 23,
      "metroSlug": "indianapolis-in",
      "metroName": "Indianapolis, IN",
      "primState": "IN",
      "basketMedian": 62160,
      "basketMean": 64109,
      "tradesPresent": 27
    },
    {
      "rank": 24,
      "metroSlug": "pittsburgh-pa",
      "metroName": "Pittsburgh, PA",
      "primState": "PA",
      "basketMedian": 62140,
      "basketMean": 63943,
      "tradesPresent": 26
    },
    {
      "rank": 25,
      "metroSlug": "baltimore-md",
      "metroName": "Baltimore, MD",
      "primState": "MD",
      "basketMedian": 61920,
      "basketMean": 63955,
      "tradesPresent": 26
    },
    {
      "rank": 26,
      "metroSlug": "washington-dc",
      "metroName": "Washington, DC",
      "primState": "DC",
      "basketMedian": 61270,
      "basketMean": 66196,
      "tradesPresent": 27
    },
    {
      "rank": 27,
      "metroSlug": "salt-lake-city-ut",
      "metroName": "Salt Lake City, UT",
      "primState": "UT",
      "basketMedian": 60790,
      "basketMean": 62944,
      "tradesPresent": 26
    },
    {
      "rank": 28,
      "metroSlug": "phoenix-az",
      "metroName": "Phoenix, AZ",
      "primState": "AZ",
      "basketMedian": 60320,
      "basketMean": 58851,
      "tradesPresent": 28
    },
    {
      "rank": 29,
      "metroSlug": "las-vegas-nv",
      "metroName": "Las Vegas, NV",
      "primState": "NV",
      "basketMedian": 60040,
      "basketMean": 61133,
      "tradesPresent": 29
    },
    {
      "rank": 30,
      "metroSlug": "grand-rapids-mi",
      "metroName": "Grand Rapids, MI",
      "primState": "MI",
      "basketMedian": 59540,
      "basketMean": 60430,
      "tradesPresent": 24
    },
    {
      "rank": 31,
      "metroSlug": "virginia-beach-va",
      "metroName": "Virginia Beach, VA",
      "primState": "VA",
      "basketMedian": 59470,
      "basketMean": 55869,
      "tradesPresent": 25
    },
    {
      "rank": 32,
      "metroSlug": "nashville-tn",
      "metroName": "Nashville, TN",
      "primState": "TN",
      "basketMedian": 59220,
      "basketMean": 58086,
      "tradesPresent": 25
    },
    {
      "rank": 33,
      "metroSlug": "austin-tx",
      "metroName": "Austin, TX",
      "primState": "TX",
      "basketMedian": 59040,
      "basketMean": 57441,
      "tradesPresent": 23
    },
    {
      "rank": 34,
      "metroSlug": "louisville-ky",
      "metroName": "Louisville, KY",
      "primState": "KY",
      "basketMedian": 58930,
      "basketMean": 59187,
      "tradesPresent": 25
    },
    {
      "rank": 35,
      "metroSlug": "baton-rouge-la",
      "metroName": "Baton Rouge, LA",
      "primState": "LA",
      "basketMedian": 58210,
      "basketMean": 58016,
      "tradesPresent": 22
    },
    {
      "rank": 36,
      "metroSlug": "boise-city-id",
      "metroName": "Boise City, ID",
      "primState": "ID",
      "basketMedian": 56940,
      "basketMean": 60006,
      "tradesPresent": 23
    },
    {
      "rank": 37,
      "metroSlug": "richmond-va",
      "metroName": "Richmond, VA",
      "primState": "VA",
      "basketMedian": 55280,
      "basketMean": 56676,
      "tradesPresent": 24
    },
    {
      "rank": 38,
      "metroSlug": "omaha-ne",
      "metroName": "Omaha, NE",
      "primState": "NE",
      "basketMedian": 53110,
      "basketMean": 59350,
      "tradesPresent": 25
    },
    {
      "rank": 39,
      "metroSlug": "houston-tx",
      "metroName": "Houston, TX",
      "primState": "TX",
      "basketMedian": 51870,
      "basketMean": 55705,
      "tradesPresent": 28
    },
    {
      "rank": 40,
      "metroSlug": "miami-fl",
      "metroName": "Miami, FL",
      "primState": "FL",
      "basketMedian": 51800,
      "basketMean": 56182,
      "tradesPresent": 27
    },
    {
      "rank": 41,
      "metroSlug": "dallas-tx",
      "metroName": "Dallas, TX",
      "primState": "TX",
      "basketMedian": 51630,
      "basketMean": 55824,
      "tradesPresent": 29
    },
    {
      "rank": 42,
      "metroSlug": "charlotte-nc",
      "metroName": "Charlotte, NC",
      "primState": "NC",
      "basketMedian": 50960,
      "basketMean": 55017,
      "tradesPresent": 24
    },
    {
      "rank": 43,
      "metroSlug": "raleigh-nc",
      "metroName": "Raleigh, NC",
      "primState": "NC",
      "basketMedian": 50820,
      "basketMean": 54085,
      "tradesPresent": 20
    },
    {
      "rank": 44,
      "metroSlug": "atlanta-ga",
      "metroName": "Atlanta, GA",
      "primState": "GA",
      "basketMedian": 50680,
      "basketMean": 54921,
      "tradesPresent": 25
    },
    {
      "rank": 45,
      "metroSlug": "tampa-fl",
      "metroName": "Tampa, FL",
      "primState": "FL",
      "basketMedian": 50300,
      "basketMean": 53794,
      "tradesPresent": 26
    },
    {
      "rank": 46,
      "metroSlug": "orlando-fl",
      "metroName": "Orlando, FL",
      "primState": "FL",
      "basketMedian": 50200,
      "basketMean": 52492,
      "tradesPresent": 25
    },
    {
      "rank": 47,
      "metroSlug": "birmingham-al",
      "metroName": "Birmingham, AL",
      "primState": "AL",
      "basketMedian": 49930,
      "basketMean": 54179,
      "tradesPresent": 23
    },
    {
      "rank": 48,
      "metroSlug": "jacksonville-fl",
      "metroName": "Jacksonville, FL",
      "primState": "FL",
      "basketMedian": 49350,
      "basketMean": 53575,
      "tradesPresent": 24
    },
    {
      "rank": 49,
      "metroSlug": "oklahoma-city-ok",
      "metroName": "Oklahoma City, OK",
      "primState": "OK",
      "basketMedian": 48940,
      "basketMean": 54366,
      "tradesPresent": 25
    },
    {
      "rank": 50,
      "metroSlug": "san-antonio-tx",
      "metroName": "San Antonio, TX",
      "primState": "TX",
      "basketMedian": 48900,
      "basketMean": 53787,
      "tradesPresent": 25
    }
  ],
  "tradeLeaders": [
    {
      "tradeSlug": "elevator-installer",
      "tradeName": "Elevator Installer",
      "socCode": "47-4021",
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "annualP50": 173920,
      "hourlyP50": 83.62,
      "metrosPresent": 36
    },
    {
      "tradeSlug": "lineworker",
      "tradeName": "Power-Line Worker",
      "socCode": "49-9051",
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "annualP50": 157620,
      "hourlyP50": 75.78,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "insulation-worker",
      "tradeName": "Insulation Worker",
      "socCode": "47-2132",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 136460,
      "hourlyP50": 65.6,
      "metrosPresent": 35
    },
    {
      "tradeSlug": "boilermaker",
      "tradeName": "Boilermaker",
      "socCode": "47-2011",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 135290,
      "hourlyP50": 65.05,
      "metrosPresent": 15
    },
    {
      "tradeSlug": "equipment-operator",
      "tradeName": "Construction Equipment Operator",
      "socCode": "47-2073",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 124750,
      "hourlyP50": 59.97,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "ironworker",
      "tradeName": "Ironworker",
      "socCode": "47-2221",
      "metroSlug": "boston-ma",
      "metroName": "Boston, MA",
      "primState": "MA",
      "annualP50": 120840,
      "hourlyP50": 58.1,
      "metrosPresent": 49
    },
    {
      "tradeSlug": "plasterer",
      "tradeName": "Plasterer",
      "socCode": "47-2161",
      "metroSlug": "new-york-ny",
      "metroName": "New York, NY",
      "primState": "NY",
      "annualP50": 120180,
      "hourlyP50": 57.78,
      "metrosPresent": 31
    },
    {
      "tradeSlug": "rebar-worker",
      "tradeName": "Rebar Worker",
      "socCode": "47-2171",
      "metroSlug": "seattle-wa",
      "metroName": "Seattle, WA",
      "primState": "WA",
      "annualP50": 118970,
      "hourlyP50": 57.2,
      "metrosPresent": 24
    },
    {
      "tradeSlug": "millwright",
      "tradeName": "Millwright",
      "socCode": "49-9044",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 113490,
      "hourlyP50": 54.56,
      "metrosPresent": 43
    },
    {
      "tradeSlug": "taper",
      "tradeName": "Taper",
      "socCode": "47-2082",
      "metroSlug": "chicago-il",
      "metroName": "Chicago, IL",
      "primState": "IL",
      "annualP50": 113180,
      "hourlyP50": 54.41,
      "metrosPresent": 21
    },
    {
      "tradeSlug": "sheet-metal-worker",
      "tradeName": "Sheet Metal Worker",
      "socCode": "47-2211",
      "metroSlug": "seattle-wa",
      "metroName": "Seattle, WA",
      "primState": "WA",
      "annualP50": 109830,
      "hourlyP50": 52.8,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "glazier",
      "tradeName": "Glazier",
      "socCode": "47-2121",
      "metroSlug": "boston-ma",
      "metroName": "Boston, MA",
      "primState": "MA",
      "annualP50": 107610,
      "hourlyP50": 51.74,
      "metrosPresent": 48
    },
    {
      "tradeSlug": "plumber",
      "tradeName": "Plumber",
      "socCode": "47-2152",
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "annualP50": 107560,
      "hourlyP50": 51.71,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "telecom-installer",
      "tradeName": "Telecom Line Installer",
      "socCode": "49-9052",
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "annualP50": 107310,
      "hourlyP50": 51.59,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "floor-layer",
      "tradeName": "Floor Layer",
      "socCode": "47-2042",
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "annualP50": 105280,
      "hourlyP50": 50.61,
      "metrosPresent": 39
    },
    {
      "tradeSlug": "electrician",
      "tradeName": "Electrician",
      "socCode": "47-2111",
      "metroSlug": "portland-or",
      "metroName": "Portland, OR",
      "primState": "OR",
      "annualP50": 105090,
      "hourlyP50": 50.53,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "brickmason",
      "tradeName": "Brickmason",
      "socCode": "47-2021",
      "metroSlug": "minneapolis-mn",
      "metroName": "Minneapolis, MN",
      "primState": "MN",
      "annualP50": 97960,
      "hourlyP50": 47.1,
      "metrosPresent": 49
    },
    {
      "tradeSlug": "pipelayer",
      "tradeName": "Pipelayer",
      "socCode": "47-2151",
      "metroSlug": "milwaukee-wi",
      "metroName": "Milwaukee, WI",
      "primState": "WI",
      "annualP50": 93550,
      "hourlyP50": 44.98,
      "metrosPresent": 43
    },
    {
      "tradeSlug": "industrial-mechanic",
      "tradeName": "Industrial Machinery Mechanic",
      "socCode": "49-9041",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 90580,
      "hourlyP50": 43.55,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "carpenter",
      "tradeName": "Carpenter",
      "socCode": "47-2031",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 89200,
      "hourlyP50": 42.89,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "tile-setter",
      "tradeName": "Tile & Stone Setter",
      "socCode": "47-2044",
      "metroSlug": "boston-ma",
      "metroName": "Boston, MA",
      "primState": "MA",
      "annualP50": 82230,
      "hourlyP50": 39.54,
      "metrosPresent": 43
    },
    {
      "tradeSlug": "drywall-installer",
      "tradeName": "Drywall Installer",
      "socCode": "47-2081",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 82160,
      "hourlyP50": 39.5,
      "metrosPresent": 49
    },
    {
      "tradeSlug": "roofer",
      "tradeName": "Roofer",
      "socCode": "47-2181",
      "metroSlug": "chicago-il",
      "metroName": "Chicago, IL",
      "primState": "IL",
      "annualP50": 82090,
      "hourlyP50": 39.47,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "hvac-technician",
      "tradeName": "HVAC Technician",
      "socCode": "49-9021",
      "metroSlug": "san-jose-ca",
      "metroName": "San Jose, CA",
      "primState": "CA",
      "annualP50": 82050,
      "hourlyP50": 39.45,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "cement-mason",
      "tradeName": "Cement Mason",
      "socCode": "47-2051",
      "metroSlug": "chicago-il",
      "metroName": "Chicago, IL",
      "primState": "IL",
      "annualP50": 81020,
      "hourlyP50": 38.95,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "welder",
      "tradeName": "Welder",
      "socCode": "51-4121",
      "metroSlug": "baton-rouge-la",
      "metroName": "Baton Rouge, LA",
      "primState": "LA",
      "annualP50": 78170,
      "hourlyP50": 37.58,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "hazmat-removal-worker",
      "tradeName": "Hazardous Materials Removal Worker",
      "socCode": "47-4041",
      "metroSlug": "new-york-ny",
      "metroName": "New York, NY",
      "primState": "NY",
      "annualP50": 74060,
      "hourlyP50": 35.61,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "construction-laborer",
      "tradeName": "Construction Laborer",
      "socCode": "47-2061",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 72610,
      "hourlyP50": 34.91,
      "metrosPresent": 50
    },
    {
      "tradeSlug": "solar-installer",
      "tradeName": "Solar Installer",
      "socCode": "47-2231",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 72150,
      "hourlyP50": 34.69,
      "metrosPresent": 27
    },
    {
      "tradeSlug": "painter",
      "tradeName": "Painter",
      "socCode": "47-2141",
      "metroSlug": "san-francisco-ca",
      "metroName": "San Francisco, CA",
      "primState": "CA",
      "annualP50": 63600,
      "hourlyP50": 30.58,
      "metrosPresent": 50
    }
  ]
}
