# Davis-Bacon & SCA Prevailing Wage Determinations (SAM.gov) (`wishbone_data/davis-bacon-wage-determinations`) Actor

Search SAM.gov wage determinations by state, county and construction type, and get every craft's prevailing hourly rate and fringe as clean rows - for bid estimating, certified payroll and compliance.

- **URL**: https://apify.com/wishbone\_data/davis-bacon-wage-determinations.md
- **Developed by:** [Walter Washburn](https://apify.com/wishbone_data) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Davis-Bacon Prevailing Wage Rates Scraper (SAM.gov Wage Determinations)

Pull **Davis-Bacon prevailing wage rates** - every craft's base hourly rate and fringe - from SAM.gov wage determinations, as clean spreadsheet rows. Search by **state, county and construction type** (Building, Heavy, Highway, Residential), or fetch exact WD numbers. Service Contract Act (SCA) wage determinations are supported too.

No SAM.gov account or API key needed.

### Why this exists

A Davis-Bacon wage determination is a long text document. An estimator bidding a federally funded job in King County, WA has to open WA20260108, scroll through 60+ crafts, and retype rates into a spreadsheet - then do it again when a modification is published. This Actor does the lookup and the parsing for you:

- finds the active determinations that cover your state/county/construction type,
- downloads each one,
- **parses every classification into `craft`, `rate`, `fringe`, `rateIdentifier`, `effectiveDate`**,
- tells you whether each rate is union (CBA), survey (SU) or union average (UAVG).

### Who uses it?

- **Estimators and bid teams** on federally funded or assisted construction (IIJA/BIL, FHWA highway, HUD, USACE, EPA SRF, DOE) - drop current rates straight into the bid.
- **Certified payroll and compliance teams** - check that pay rates meet the determination in the contract.
- **Payroll software, HR-tech and construction-tech products** - keep a rates table in sync automatically.
- **Labor-market researchers, unions and contractor associations** - compare prevailing rates across counties and trades.
- **Government contractors on service contracts** - SCA occupational rates plus health & welfare.

### How to use it

#### By location

```json
{
  "states": ["WA"],
  "counties": ["King"],
  "constructionTypes": ["Building"],
  "maxDeterminations": 5
}
```

#### Only certain trades across a state

```json
{
  "states": ["TX", "FL"],
  "constructionTypes": ["Highway"],
  "classificationKeywords": ["laborer", "carpenter", "operator"]
}
```

#### Exact determinations, one row each with rates nested

```json
{ "wdNumbers": ["WA20260002", "TX20260010"], "outputMode": "determinations" }
```

#### Service Contract Act

```json
{ "states": ["WA"], "wdTypes": ["SCA"], "counties": ["Pierce"], "maxDeterminations": 2 }
```

### Output example (rates mode)

```json
{
  "wdNumber": "WA20260108",
  "revision": 1,
  "wdType": "DBA",
  "state": "WA",
  "counties": "King",
  "constructionTypes": "Building",
  "publishDate": "2026-05-18",
  "samUrl": "https://sam.gov/wage-determination/WA20260108/1",
  "classification": "TILE SETTER",
  "craft": "TILE SETTER",
  "rate": 49.7,
  "rateUnit": "hourly",
  "fringe": 18.62,
  "rateIdentifier": "BRWA0001-013",
  "effectiveDate": "2025-06-01",
  "rateSource": "Union (CBA)"
}
```

Long power-equipment and truck-driver groups keep a short label in `classification` (e.g. `POWER EQUIPMENT OPERATOR: GROUP 8`) and the full group description in `classificationFull`. Fringes that aren't a flat dollar amount (e.g. `25%+3.40`) are kept as text in `fringeText`.

### Output fields

| Field | Meaning |
|---|---|
| `wdNumber`, `revision`, `wdType` | Determination number, modification, DBA/SCA |
| `state`, `counties`, `constructionTypes` | Coverage |
| `publishDate`, `modifiedDate`, `isActive`, `samUrl` | Status and link |
| `classification`, `craft`, `classificationFull` | Trade / occupation |
| `rate`, `rateUnit`, `fringe`, `fringeText` | Base rate (`hourly`, or `per shift` / `per day` for tunnel and diver crafts that SAM.gov publishes that way) and fringe |
| `rateIdentifier`, `effectiveDate`, `rateSource` | Where the rate comes from (union CBA, survey, union average) |
| `occupationCode` | SCA occupation code |

### Pricing

Pay-per-event - you pay only for rows delivered:

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| `wage-rate-row` (rates mode) | **$2.00 per 1,000 rate rows** |
| `wage-determination` (determinations mode) | **$5.00 per 1,000 determinations** |

Typical costs: one county Building determination (~60-200 crafts) is **$0.12-$0.40**; all Highway rates for a state is usually under $2. Use **Max output rows** or the run's maximum cost to cap spend.

### FAQ

**Is this legal?** Yes. Wage determinations are issued by the U.S. Department of Labor and published on SAM.gov for the public; as federal government works they are in the public domain. The Actor reads the same public JSON endpoints the SAM.gov website uses, at a slow, polite rate, without logging in.

**Are these the official rates for my contract?** The rates are copied verbatim from SAM.gov, but the governing determination is the one incorporated in your contract (by number and modification). Always confirm the WD number and revision in `samUrl`. This Actor is not legal advice.

**Why do some Texas rates show $7.25?** Some determinations still carry very old survey rates (for example `SUTX1992-004`, surveyed in 1992) published at $7.25 with $0.00 fringe. That is what SAM.gov publishes and the Actor reports it exactly - `rateIdentifier` and `effectiveDate` show how old a rate is. Check the linked document and your contract for any other wage requirements that apply.

**County search found nothing?** Many states group counties into one determination. Statewide determinations are always kept, and you can leave `counties` empty and filter afterwards.

**How current is it?** Every run queries SAM.gov live, so new modifications show up the day DOL publishes them. Schedule a weekly run to track changes.

# Actor input Schema

## `states` (type: `array`):

Two-letter state codes, e.g. WA, TX. Leave empty to search all states (use a limit).

## `counties` (type: `array`):

Keep only determinations covering these counties (name contains, case-insensitive), e.g. King, Pierce. Statewide determinations are always kept.

## `constructionTypes` (type: `array`):

Building, Heavy, Highway, Residential. Leave empty for all.

## `wdTypes` (type: `array`):

DBA = Davis-Bacon (construction). SCA = Service Contract Act (services). CBA = collective-bargaining successor determinations (metadata only).

## `classificationKeywords` (type: `array`):

Keep only rate rows whose classification contains one of these words, e.g. carpenter, laborer, electrician, operator.

## `outputMode` (type: `string`):

'rates' = one row per craft rate (best for spreadsheets). 'determinations' = one row per wage determination with all rates nested.

## `wdNumbers` (type: `array`):

Fetch these exact determinations, e.g. WA20260001 or 2015-5533. Overrides the search filters.

## `query` (type: `string`):

Passed to the SAM.gov search box, e.g. a county name or WD number.

## `activeOnly` (type: `boolean`):

Skip archived/inactive determinations.

## `includeFullText` (type: `boolean`):

Adds the complete WD document text (determinations output only).

## `maxDeterminations` (type: `integer`):

How many determinations to download and parse. 0 = no limit.

## `maxItems` (type: `integer`):

Hard cap on dataset rows (and cost). 0 = no limit.

## Actor input object example

```json
{
  "states": [
    "WA"
  ],
  "counties": [
    "King"
  ],
  "constructionTypes": [
    "Building"
  ],
  "wdTypes": [
    "DBA"
  ],
  "outputMode": "rates",
  "activeOnly": true,
  "includeFullText": false,
  "maxDeterminations": 20,
  "maxItems": 0
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "states": [
        "WA"
    ],
    "counties": [
        "King"
    ],
    "constructionTypes": [
        "Building"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wishbone_data/davis-bacon-wage-determinations").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "states": ["WA"],
    "counties": ["King"],
    "constructionTypes": ["Building"],
}

# Run the Actor and wait for it to finish
run = client.actor("wishbone_data/davis-bacon-wage-determinations").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "states": [
    "WA"
  ],
  "counties": [
    "King"
  ],
  "constructionTypes": [
    "Building"
  ]
}' |
apify call wishbone_data/davis-bacon-wage-determinations --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wishbone_data/davis-bacon-wage-determinations"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vhUxaLhg6gXp5fYOg/builds/jfbD0CLtTyKazhQid/openapi.json
