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 prevailing hourly wage and fringe rate by county and job type. Two things make it more complicated than a single number: the rate that actually binds is the higher of the determination and the Executive Order 14026 minimum, per FAR 22.1002-5; and the determination that binds a given contract is the one the contracting officer incorporated into it, not whichever one matches the county. 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, and returns the per-classification wage and fringe rates as structured rows.

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 answers "which determinations cover this place and type of work" in one call. It does not tell you which one governs your contract. GSA is explicit that determinations published on SAM.gov are "available to the public for information purposes only" and that "the only WDs applicable to a specific solicitation or contract are those the contracting officer has incorporated in that contract" (FSD KB0017461). Where this endpoint earns its keep is the duty in FAR 22.404-6(a)(3): during a solicitation the contracting officer must monitor SAM.gov for revisions, and a revision published 10 or more days before bid opening is effective. The FAR prescribes polling; this is how you automate it.

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.

Get the rates on a determination

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/wage-determinations/rates?wd_number=CA20260018&classification=Electrician&limit=1"
{ "data": [ { "wd_number": "CA20260018", "revision_number": 6, "wd_type": "DBA", "classification": "ELECTRICIAN (SAN FRANCISCO COUNTY)", "occupation_code": null, "base_rate": 91.25, "fringe_rate": 48.05, "rate_group": "ELEC0006-007" } ], "pagination": { "limit": 1, "offset": 0, "total": 11, "total_is_estimate": false, "has_next": true }, "filters_applied": { "classification": "Electrician", "wd_number": "CA20260018", "sort_by": "base_rate", "sort_order": "desc" } }

Each row is one classification's base wage and fringe; add them for the loaded cost, $91.25 + $48.05 = $139.30. Drop the classification filter for the determination's whole schedule, or query by occupation_code across determinations.

What is available

Full API documentation →  |  Rates endpoint →  |  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.

The GovCon API returns those rate lines as structured rows, roughly 495,000 across the active Davis-Bacon and Service Contract Act determinations. Each row is one classification, a Davis-Bacon trade or a Service Contract Act occupation, with its hourly base wage and its fringe, tied to the determination and revision it belongs to. Query them across every determination by occupation or trade ("what does an electrician earn in a determination covering California"), or pull the full schedule for a single determination. The listing tells you which determination governs a contract; the rate lines tell you what it pays. See the prevailing-wage rates endpoint.

Collective bargaining determinations are the exception: a CBA references its own negotiated union schedule rather than a published rate table, so it carries the contractor, union, and term instead of rate rows.

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?

Yes. Alongside the determination listing, it returns the per-classification rate lines: each Davis-Bacon trade or Service Contract Act occupation with its hourly base wage and fringe, queryable by occupation across determinations or as the full schedule for a single determination. Collective bargaining determinations reference a separate union schedule, so they carry no rate rows.

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.