Prevailing-wage rates by occupation
The search and by-location endpoints answer which wage determinations apply. This one answers what they pay: it returns the individual rate lines inside the determinations, one row per labor classification, each carrying the hourly base wage and fringe a contractor is bound to pay for that classification. Query them across every determination at once ("what does an Electrician earn in a determination covering California") or pull every line on a single determination.
Rates cover the two rate-bearing determination types, DBA (Davis-Bacon construction trades) and SCA (Service Contract Act service occupations). CBAs carry no rate rows: a collective bargaining agreement points to its own negotiated union schedule rather than a published rate table, so a CBA determination returns an empty rates list on the detail endpoint.
What a rate row is
Each row is one labor classification's hourly obligation: a base wage (base_rate) plus a fringe (fringe_rate). Loaded hourly cost is the two added together, so a San Francisco electrician at 91.25 + 48.05 is $139.30/hr and a janitor at 22.38 + 5.55 is $27.93/hr. The remaining fields identify where the rate came from, the determination and revision (wd_number, revision_number), and, depending on type, either the DBA rate identifier (rate_group) or the SCA occupation code (occupation_code). How those differ by type is below.
DBA and SCA carry their rates differently
The two statutes structure their rate tables differently, and the difference shows up in which fields are populated:
- DBA (construction). Classifications sit under a rate identifier (
rate_group, e.g.PLUM0467-001) and each carries its own fringe. A determination spans many counties and pay zones, and the county or scope is in the classification text itself (ELECTRICIAN (SAN FRANCISCO COUNTY),ELECTRICIAN ZONE B: ...), not a separate field, so there is nocountyfilter.occupation_codeis null on DBA rows. - SCA (services). Classifications are standardized occupation codes (
occupation_code, e.g.11150Janitor,23210Elevator Repairer) with clean titles, and the fringe is a single Health & Welfare value published once for the whole determination and applied to every occupation on it. The current standard H&W rate is$5.36/hr; older or locality determinations carry their own.rate_groupis null on SCA rows.
Which revision governs
A determination is revised over time, and the source keeps every superseded revision. Pass active_only=true for the rates on the revision currently in force. Without it you get every retained revision. Rates are keyed to wd_number and revision_number, so a rate row always ties back to the exact revision it came from.
Quick start
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://govconapi.com/api/v1/wage-determinations/rates?classification=Electrician&state=CA&active_only=true&limit=1"
{
"data": [
{
"wd_number": "CA20260019",
"revision_number": 5,
"wd_type": "DBA",
"classification": "ELECTRICIAN: ALL OTHER WORK (SAN FRANCISCO COUNTY:)",
"occupation_code": null,
"base_rate": 91.25,
"fringe_rate": 48.05,
"rate_group": "ELEC0006-009"
}
],
"pagination": { "limit": 1, "offset": 0, "total": 166, "total_is_estimate": false, "has_next": true },
"filters_applied": { "classification": "Electrician", "state": "CA", "active_only": true, "sort_by": "base_rate", "sort_order": "desc" },
"_sources": ["sam_wage_determinations"]
}
No window block: the full set is queryable on every plan.
Parameters
| Param | Type | Description |
|---|---|---|
classification |
string | Trade or occupation name substring (for example Electrician, Janitor). Wildcards are escaped and matched literally. |
type |
string | DBA or SCA. CBA returns a 400 (CBAs have no rate table). Invalid values return a 400 with the valid list. |
occupation_code |
string | SCA occupation code, exact match (for example 11150). SCA rows only. |
wd_number |
string | Exact WD number (for example CA20260019), to pull every rate line on one determination. |
state |
string | 2-letter US state or territory code. Returns rates on determinations that cover that jurisdiction. |
active_only |
bool | Only rates on the currently-effective revision. Default false. |
sort_by |
string | base_rate (default), classification, or wd_number. |
sort_order |
string | asc or desc (default). |
limit / offset |
int | Page size (default 100; maximum 100 on the free trial, 1,000 on paid plans) and offset. |
fields |
string | Comma-list of response fields to return. classification is always included. |
total_is_estimate means the count hit the ceiling; page off has_next.
Response fields
| Field | Meaning |
|---|---|
wd_number |
The determination this rate belongs to. Use it against search or the detail endpoint for the determination's full context and jurisdictions. |
revision_number |
The revision the rate came from. With wd_number, the stable key for a rate line. |
wd_type |
DBA or SCA. |
classification |
The trade (DBA) or occupation title (SCA). On DBA rows this can also carry the county, zone, or work-scope qualifier. |
occupation_code |
SCA standardized occupation code. Null on DBA rows. |
base_rate |
Hourly base wage, in dollars. |
fringe_rate |
Hourly fringe. On DBA, per-classification. On SCA, the determination's document-level Health & Welfare value. May be null on the rare determination that publishes no fringe. |
rate_group |
DBA rate identifier (union or survey schedule code, for example ELEC0006-009). Null on SCA rows. |
Errors
| Status | When |
|---|---|
400 |
type=CBA; invalid type, sort_by, or sort_order; unknown query parameter; a null byte in a parameter. |
401 |
Missing or invalid API key. |
422 |
limit below 1; negative offset. A limit above your plan maximum is a 402. |
Examples
The whole rate table for a determination you were handed (a WD number off a solicitation):
GET /api/v1/wage-determinations/rates?wd_number=CA20260019
One occupation across the country. The same SCA Janitor (11150) runs from $9.65 to $22.38 base by locality:
GET /api/v1/wage-determinations/rates?occupation_code=11150&active_only=true&sort_by=base_rate
Electrician rates in determinations covering California, in force, highest first:
GET /api/v1/wage-determinations/rates?classification=Electrician&state=CA&active_only=true
For the determination a rate belongs to (its jurisdictions, construction types, and, for CBAs, contractor and union), pass its wd_number to the detail endpoint; that record also returns these rate lines inline as a rates block. To find which determinations apply to a job, start at by-location.