Skip to content

Prevailing-wage floor for one occupation

The rates endpoint returns the individual county rate lines, one row per determination. This one returns their distribution in a single call: for one occupation, the base hourly wage at the 25th, 50th, and 75th percentiles (plus min and max) and the Health & Welfare fringe you owe on top, aggregated across every wage determination that carries it.

On a Service Contract Act services bid, loaded labor is the real cost driver, far more than the award value, and the floor is set by wage determinations you are legally bound to meet. Reading that floor used to mean pulling a thousand-plus county rate lines and rolling up the percentiles yourself. This returns the rolled-up floor directly, so you can price a bid from one call.

The binding rate on any specific contract is the county-of-performance floor. What this returns is the national distribution across all determinations, the band your labor cost sits in, and how much it moves by locality.

Query parameters

Parameter Type Description
occupation_code string The precise key: an SCA 5-digit occupation code (e.g. 11150 Janitor, 27101 Guard, 11090 Gardener, 11210 Laborer, Grounds Maintenance). Exact match.
classification string A trade/occupation name substring (e.g. Guard), used when you do not have the code. A substring can span several occupations (Guard covers Guard, Guard II, Lifeguard, School Crossing Guard); occupation_code isolates one.
type string SCA (Service Contract Act, the default) or DBA (Davis-Bacon construction). CBAs have no rate table.
state string Optional 2-letter state code: scope to determinations covering that state.

Provide occupation_code or classification (at least one). Aggregating every rate line at once is not meaningful, so a bare call is a 400.

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/wage-determinations/rate-summary?occupation_code=11150"
{
  "wd_type": "SCA",
  "occupation_code": "11150",
  "classification": "Janitor",
  "distinct_classifications": 1,
  "sample_size": 2485,
  "wage_determinations": 1029,
  "base_hourly": {
    "p25": 15.0,
    "median": 17.06,
    "p75": 18.04,
    "min": 9.65,
    "max": 22.4
  },
  "health_and_welfare_hourly": 5.92,
  "as_of": "2026-08-29",
  "basis": "Service Contract Act base hourly wage across every wage determination that carries this occupation; health_and_welfare_hourly is the SCA H&W fringe you owe on top. The binding floor on a specific contract is the county-of-performance rate, so this is the national distribution, not a single number.",
  "filters_applied": { "type": "SCA", "occupation_code": "11150" },
  "_sources": ["sam_wage_determinations"]
}

Read it as: a federal janitorial contract sets a base-wage floor around $17.06/hour (a quarter of localities under $15.00, a quarter over $18.04), and you owe a $5.92/hour Health & Welfare fringe on top of that, so your fully-loaded floor is roughly $22.98/hour before payroll burden. That floor, not the contract ceiling, is what a services bid has to clear.

distinct_classifications tells you how many titles are behind the distribution. It's 1 on an exact occupation_code lookup. A classification substring can span more than one: classification=Guard covers Guard, Guard II, Lifeguard, and School Crossing Guard together:

{
  "classification": "Guard",
  "distinct_classifications": 4,
  "base_hourly": { "p25": 15.99, "median": 17.84, "p75": 19.76, "min": 9.59, "max": 33.86 }
}

Use occupation_code instead of classification when you need one specific title's own floor rather than a blended distribution.

Response fields

Field Meaning
wd_type SCA or DBA.
occupation_code The SCA code queried (null when you searched by classification).
classification The occupation's canonical label (a REPRESENTATIVE label when queried by substring, not a guarantee of one occupation , see distinct_classifications).
distinct_classifications How many genuinely distinct titles are blended into this summary. 1 on an exact occupation_code lookup; can be higher on a classification substring.
sample_size Rate lines behind the distribution.
wage_determinations Distinct determinations (localities) that set this occupation's wage.
base_hourly Base hourly wage: p25, median, p75, min, max.
health_and_welfare_hourly The SCA Health & Welfare fringe (hourly), owed on top of base. For DBA this is the median listed fringe.
as_of The most recent date these rates were confirmed present.
basis How to read the numbers.

Errors

Status When Body
400 Neither occupation_code nor classification given Provide occupation_code (e.g. 11150 for Janitor) or classification (e.g. 'Janitor').
400 type=CBA CBAs have no rate table (they reference a union schedule). Use type=SCA or type=DBA.
400 Invalid type Invalid type 'x'. Valid: DBA, SCA, CBA ...
400 Unknown query parameter Unknown query parameter(s): [...]. Valid parameters include: classification, occupation_code, state, type.
404 No matching rates, or too few (< 20 lines) to summarize No prevailing-wage rates matched, or too few to summarize. ...

More examples

# By occupation name (substring spans Guard, Guard II, Lifeguard, School Crossing Guard):
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/wage-determinations/rate-summary?occupation_code=27101"   # Guard only

# Davis-Bacon construction trade:
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/wage-determinations/rate-summary?classification=Electrician&type=DBA"

Data notes

  • County sets the floor. SCA base rates vary by county; this is the national distribution, so read p25-p75 as the band your locality falls in, not a single guaranteed rate. Use rates with occupation_code + state, or by-location, to pin one place.
  • occupation_code is the precise key. A classification substring can span several distinct occupations; the code isolates exactly one.
  • Base is not loaded cost. Add the Health & Welfare fringe, then payroll burden and overhead, to get a bid-ready labor rate.

Pair it with /api/v1/naics/{code}/simplified-acquisition (the small-buy lane a newcomer bids) and /api/v1/pricing/benchmark (what those awards pay), to weigh the labor floor against the contract value. Free with any key.

A REST API and MCP server for U.S. federal procurement data.

Get a free key, emailed instantly, or follow the quickstart.

Found something wrong, missing or confusing on this page?

Press Ctrl + Enter to send a note. Highlight text first and it travels with your note.