The federal contracting data layer

SAM.gov Wage Determination API: Davis-Bacon, SCA, and CBA

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.

TL;DR: SAM.gov publishes wage determinations across three types (Davis-Bacon, Service Contract Act, and collective bargaining agreements), but not in a form built for pulling the full set. There is no bulk download, the search returns them a page at a time, and the contractor and union detail behind a collective bargaining determination is not in the main listing. Assembling a complete, current index you can query by state, county, and type is real work. Or use GovCon API's wage-determinations endpoint, which does it for you.

What a wage determination is

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.

Davis-Bacon (DBA)

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 Contract Act (SCA)

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.

Collective bargaining agreements (CBA)

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.

TypeStatuteCoversNumber looks likeRecords
DBADavis-Bacon ActConstruction labor, by county and construction typeCA2026000268,737
SCAService Contract ActService workers (guards, custodians, help-desk)2015-45672,666
CBASCA section 4(c)Union rates that carry over to a successor contractCBA-2025-4418,630
Why this matters for compliance: the determination that governs your bid is not a suggestion. Committing to pay less than the applicable DBA rate, or missing that a predecessor's CBA carries over under 4(c), is a documented basis for a sustained protest and for back-wage liability. The reason to pull this data is to answer one question precisely: which determinations apply to a contract in this county, right now.

How SAM.gov structures the data

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.

The listing is thin; the CBA detail is assembled separately

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.

Revisions: most of what you get back is not current

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.

Locations are many-to-one

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.

The three things that make this hard to pull yourself

1. There is no bulk download

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.

2. The search is not built for a full pull

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.

3. The collective-bargaining detail is assembled record by record

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.

None of these are exotic. They are the ordinary cost of turning SAM.gov's compliance search into a complete, queryable, current dataset: traverse it fully, filter revisions down to what is in force, and assemble the collective-bargaining detail. That work is the same whether you do it or we do it.

What the full dataset looks like

90,033
total wage determinations (as of Jul 16, 2026)
68,737
Davis-Bacon (DBA)
18,630
collective bargaining (CBA)
2,666
Service Contract Act (SCA)

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.

Query it through the GovCon API

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.

Search by type, state, and county

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.

Ask what applies in a county

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.

Pull a CBA with its union and term

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.

What is available

Full API documentation →  |  Pricing →

Where the actual hourly rates live

A 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.

Field notes worth knowing before you build

Frequently asked questions

What is a wage determination?

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.

What is the difference between a Davis-Bacon and a Service Contract Act wage determination?

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.

How do I find the wage determination that applies to a federal contract?

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.

How often are wage determinations updated?

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.

Does the API return the actual hourly wage rates?

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.

What is a CBA wage determination?

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.

Related Guides

Community Feedback

Hit a data issue or a flow we did not cover? Press Ctrl+Enter to share, it helps the next developer.