If you bid federal construction or service work, the wage determination is not optional reading. It sets the minimum hourly wage and fringe rate you are legally bound to pay by county and job type, and the GAO sustains bid protests when an offeror commits to the wrong one. Getting those determinations programmatically out of SAM.gov is harder than it looks. This guide covers how the data is actually structured, the quirks that trip up every integration, and how to query all 90,033 determinations by state, county, and type.
A wage determination (WD) is a legally binding schedule of minimum wages and fringe benefits for a federal contract, issued by the Department of Labor and published through SAM.gov. It is what the federal contracting world means by the prevailing wage on a specific contract. There are three distinct kinds, and they come from three different statutes, so they are stored and queried separately.
Construction wage rates under the Davis-Bacon Act, set by county and by construction type: Building, Heavy, Highway, or Residential. A single WD number (for example CA20260002) can carry several construction types and apply either to a whole state or to named counties. This is the largest of the three, at 68,737 records.
Service-worker rates under the McNamara-O'Hara Service Contract Act, covering occupations like security guards, custodians, and IT help-desk staff on service contracts. Numbers look like 2015-4567. 2,666 records, the smallest and most stable set.
Under section 4(c) of the Service Contract Act, when a service contract succeeds one whose workers were covered by a union contract, the incoming contractor must pay at least the wages and fringe benefits set in that collective bargaining agreement. SAM publishes those negotiated rates as their own class of determination (numbers like CBA-2025-44), 18,630 of them. A CBA is defined by its union, its contractor, and its term, so it carries fields the other two do not.
| Type | Statute | Covers | Number looks like | Records |
|---|---|---|---|---|
| DBA | Davis-Bacon Act | Construction labor, by county and construction type | CA20260002 | 68,737 |
| SCA | Service Contract Act | Service workers (guards, custodians, help-desk) | 2015-4567 | 2,666 |
| CBA | SCA section 4(c) | Union rates that carry over to a successor contract | CBA-2025-44 | 18,630 |
SAM.gov publishes each determination as a listing: its number, its type, the revision, the active flag, publish and modified dates, and the location it applies to. That is enough to search and filter, but for collective bargaining determinations it is not the whole story.
A CBA's substance (the contractor, the union, the services covered, and the effective dates) is not in the main listing. It has to be assembled separately, record by record, across all 18,630. In our own index, 87.5% come back with full detail; the remaining 12.5% are empty at the source, so a complete-looking CBA count is not the same as a complete-detail count.
SAM keeps every superseded revision of a determination, not just the one in force. In practice that means a naive query for Davis-Bacon determinations returns a revision archive: only about 6% of DBA records are currently active (4,235 of 68,737). If you want the determination that governs a bid today, you have to filter on the active flag explicitly. The default, unfiltered result is history, not current law.
One determination can apply to many jurisdictions. A statewide DBA is stored with a state and no county; a county-specific one lists each county. Answering "what applies in Alameda County, California" means resolving both the county-specific determinations and the statewide ones that cover it, which is a join, not a single filter.
Unlike SAM's exclusions or entity data, there is no bulk wage-determination file: no CSV export and no archive drop. The only programmatic access is the search, one page at a time.
SAM.gov's search is not designed to walk the entire dataset in one pass. Pulling all of it, complete and deduplicated, takes a careful traversal, and a subset of records that carry no location are easy to miss entirely. Getting to a full, current set is more than a single loop over the API.
As above, the contractor and union detail for a CBA is not in the listing and has to be pulled one determination at a time, across all 18,630. It is the single most expensive part of maintaining a wage-determination index, and it has to be repeated to catch newly issued determinations.
Across those determinations, 128,735 location rows map determinations to the states and counties they cover, so a location query resolves both county-specific and statewide coverage in one call.
The wage-determinations endpoint joins all three types into one REST surface, with the location index built and the CBA detail already fetched. Every response below is a real call, not a mock.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://govconapi.com/api/v1/wage-determinations/search?type=DBA&state=CA&active_only=true&limit=1"
{
"data": [
{
"wd_id": "CA20260002",
"wd_number": "CA20260002",
"wd_type": "DBA",
"revision_number": 4,
"is_active": true,
"publish_date": "2026-07-14",
"modified_date": "2026-07-14",
"construction_types": ["Building", "Heavy", "Highway"],
"locations": [{ "state": "CA", "county": "Imperial" }]
}
],
"pagination": { "limit": 1, "offset": 0, "total": 28, "total_is_estimate": false, "has_next": true },
"filters_applied": { "type": "DBA", "state": "CA", "active_only": true, "sort_by": "modified_date", "sort_order": "desc" }
}
Pass active_only=true to filter out the superseded revisions and get only determinations in force. Filter construction_type (Building, Heavy, Highway, Residential) for Davis-Bacon, or date_from / date_to to track revisions issued since a date.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://govconapi.com/api/v1/wage-determinations/by-location?state=CA&county=Alameda"
Returns every active DBA, SCA, and CBA determination that covers the jurisdiction, including the statewide determinations that apply everywhere in the state, not just the county-specific ones. This is the compliance question ("what am I bound to here") answered in one call.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://govconapi.com/api/v1/wage-determinations/search?type=CBA&state=DC&active_only=true&limit=1"
{
"wd_number": "CBA-2025-44",
"wd_type": "CBA",
"locations": [{ "state": "DC", "county": "Washington, D.C." }],
"cba": {
"contract_services": "PSO Services at 400 Maryland Avenue, SW, Washington D.C. (DC0010)",
"contractor_name": "Universal Protection Service LP d/b/a Allied Universal Security Services",
"contractor_union": "Fraternity of American Protective Officers",
"effective_start_date": "2023-12-12",
"effective_end_date": "2026-11-30"
}
}
The cba block carries the contractor, union, covered services, and effective dates. It is present on CBA records and absent on DBA and SCA, so you can tell at a glance whether a determination carries collective-bargaining terms. On DBA and SCA rows there is no cba block.
type, state, county, wd_number, active_only, construction_type, date_from / date_toby-location endpoint that resolves county-specific and statewide coverage togetherwd_id or by WD numberlimit / offset, and ?fields= projectionA common expectation is that a wage determination is a single number. It is not. Each determination is a schedule. A Davis-Bacon determination lists a base wage and a fringe rate for every construction classification it covers (electrician, laborer, equipment operator, and so on). A Service Contract Act determination lists a base hourly rate per occupation, plus a health and welfare (H&W) fringe and vacation and holiday requirements; the occupations follow DOL's SCA Directory of Occupations.
Those per-occupation rate schedules are published as the determination's own document on SAM.gov, one per WD number and revision. This API surfaces the determination listing: which determination applies where, its type, revision, active status, and, for CBAs, the contractor, union, and term. That is the layer that tells you which determination, and therefore which rate schedule, governs a given contract. It does not currently return the parsed per-occupation rate rows; those remain in the SAM.gov document the listing points to.
active_only=true you are searching an archive.date_from filter on modified date will not return them. That is a source characteristic, not a dropped record.CA2026...), SCA use a year-sequence form (2015-4567), and CBA use CBA-YYYY-N. Match on the exact number, not a numeric range.A wage determination is the Department of Labor's binding schedule of minimum hourly wages and fringe benefits for a federal contract, set by location and job classification. On construction it comes from the Davis-Bacon Act; on services from the Service Contract Act. It is what "prevailing wage" refers to on a specific federal contract.
Davis-Bacon (DBA) determinations set construction labor rates by county and construction type (Building, Heavy, Highway, Residential). Service Contract Act (SCA) determinations set rates for service workers such as guards, custodians, and help-desk staff, by area. They come from different statutes, cover different work, and are issued and numbered separately.
The contracting officer incorporates the applicable determination into the solicitation, so it is normally listed in the solicitation's clauses or attachments. You can also look one up by where the work is performed and the type of work: a by-location query returns every active determination covering a given state and county, including the statewide ones.
The Department of Labor revises them on a rolling basis, and SAM retains every revision. Only the latest revision of each is in force, so a query has to filter on the active flag; at any given time only about 6% of Davis-Bacon records are current.
It returns the determination listing: which determination applies where, its type, revision, active status, and, for CBAs, the contractor and union detail. The per-occupation hourly rate schedule is a separate SAM.gov document; the listing is what tells you which determination, and therefore which rate schedule, governs.
Under section 4(c) of the Service Contract Act, a contractor that succeeds a service contract whose workers were unionized must pay at least the wages and fringe benefits in the predecessor's collective bargaining agreement. SAM publishes those as CBA determinations, each carrying its contractor, union, and effective term.
Hit a data issue or a flow we did not cover? Press Ctrl+Enter to share, it helps the next developer.