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-p75as the band your locality falls in, not a single guaranteed rate. Use rates withoccupation_code+state, or by-location, to pin one place. occupation_codeis the precise key. Aclassificationsubstring 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.