Skip to content

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 no county filter. occupation_code is null on DBA rows.
  • SCA (services). Classifications are standardized occupation codes (occupation_code, e.g. 11150 Janitor, 23210 Elevator 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_group is 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.

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.