ParseForge Scrapers

SAM.gov Wage Determinations Scraper

parseforge/sam-gov-wage-determinations-scraper

Lead generationDeveloper tools

Scrape SAM.gov wage determinations: 95,000 Service Contract Act, Davis-Bacon and collective bargaining agreement determinations with the states and counties they cover, the occupation rates and the fringe benefits.

Run this scraper See the API call
Total runs
12
Bookmarked
0
Last modified
8 days ago

This scraper was last updated on .

What does the SAM.gov Wage Determinations Scraper return?

ParseForge

Prevailing Wage Scraper - Davis-Bacon & SCA Rates

Every wage determination on SAM.gov as data: 85,426 Davis-Bacon construction decisions and 10,124 active Service Contract Act and collective bargaining determinations, with the counties they cover and every hourly rate they set. No login, no API key, no proxy, no browser. Export to CSV, JSON, Excel, or XML.

SAM.gov shows wage determinations one at a time and serves the rates as the Department of Labor's fixed-width text. This Actor reads the index, keeps what your filters ask for, and parses each determination into rows: occupation code, title and rate for Service Contract Act registers, or classification, rate, fringes and union agreement code for Davis-Bacon decisions.

Who uses it What they use wage determinations for
Federal contractors and subcontractors Bidding a job at the right labour rate before the solicitation closes
Construction estimators Davis-Bacon classification rates and fringes by county and construction type
Payroll and compliance teams Checking that certified payroll matches the determination in force
Labour economists and unions Prevailing rates by trade, county and year, with the union agreement behind each rate
GovCon software and data vendors A normalised feed of determinations and revisions with stable numbers

What it does

The Department of Labor issues two kinds of determination, and SAM.gov indexes them separately:

  • Davis-Bacon (DBA): 85,426 general decisions for construction, one per state, county set and construction type (Building, Residential, Highway, Heavy). Rates come grouped under the union agreement or survey code that set them.
  • Service Contract Act (SCA) and collective bargaining agreements (CBA): 10,124 active determinations for service contracts, with a register of occupation codes and rates plus health and welfare, vacation and holiday requirements.

Every row carries the determination itself:

  • 🧾 Identity: number, short reference, type, revision number, active, standard and latest-revision flags, publication, modification and index dates.
  • πŸ—ΊοΈ Coverage: the states and counties the determination applies to, a statewide flag and the county count, plus the construction types for Davis-Bacon.
  • πŸ”— Links: the SAM.gov page and the API URL for the exact revision.
  • πŸ“„ The document (optional): the full determination text with the covered area as the Department writes it.
  • πŸ’΅ The rates (optional): every occupation or classification with its hourly rate, the fringes and the union agreement code, plus the lowest, median and highest rate in the determination. A Tennessee SCA register parsed to 346 occupation rates; a Pittsburgh Davis-Bacon decision to 35 classifications from $22.37 to $61.07.
  • πŸ₯ Fringe benefits (optional): the health and welfare hourly rate, the vacation schedule and the paid holidays.
  • πŸ“œ Executive order minimums (optional): the orders cited and the contractor minimum wage they set.
  • πŸ•“ Revision history (optional): every published revision with its date and whether it is still in force.

Every row contains: wdNumber, shortReferenceNumber, wdType, wdTypeCode, revisionNumber, isLatestRevision, isActive, isStandard, publishDate, modifiedDate, indexedDate, determinationYear, states, stateNames, counties, countyCount, isStatewide, constructionTypes, cbaNumber, alternateNumbers, wdUrl, apiUrl and scrapedAt.

What you can do with wage determination data

Price a construction bid.

Filter to Davis-Bacon, your state and county, and the construction type, then turn on the rates. Each classification comes with its base rate, its fringe rate and the union agreement code and date behind it, so the estimate traces back to a source.

Watch a determination for changes.

Revision history returns every published revision with its date. Schedule a weekly run on the determinations you follow and compare the revision number.

Build a rate table for a service contract.

Service Contract Act registers list every occupation code from Accounting Clerk I upward. Export them with the health and welfare rate and the holiday count and you have the labour section of the proposal.

Compare counties or trades.

Pull a state's decisions and use the lowest, median and highest rate on each row for a quick spread by county, or explode the rate rows to compare one trade across the state.

Why choose this scraper

What you get
Both registers Davis-Bacon and Service Contract Act in one schema, filtered together
Rates as rows The fixed-width text parsed into occupation and classification records, not left as a blob
The union agreement behind the rate Davis-Bacon rows carry the agreement code and its effective date
Wrapped names kept whole A classification that runs over three lines comes back as one name, not a fragment
No key, no proxy Plain HTTP against SAM.gov's public endpoints; 300 determinations with rates in 11 seconds
Past the 10,000 ceiling SAM.gov caps a query at 10,000 records, so a state list is searched state by state

How it compares

No Apify Actor covers wage determinations. The SAM.gov actors on the Store return contract opportunities or entity registrations, which is a different file. Against SAM.gov's own site the difference is export and the parsed rate table.

Feature ParseForge sam.gov SAM.gov opportunity actors
Davis-Bacon and SCA in one feed Yes Separate searches Not covered
Occupation and classification rates parsed Yes Fixed-width text No
Fringe benefits and holidays parsed Yes In the text No
Revision history Yes One page per revision No
County coverage as data Yes Prose No
Price per row $0.005 Free, manual $0.003 to $0.008

What a wage determination looks like

{
  "wdNumber": "PA20260001",
  "shortReferenceNumber": "PA1",
  "wdType": "Davis-Bacon Act",
  "wdTypeCode": "DBA",
  "revisionNumber": 6,
  "isActive": "Yes",
  "isStandard": "Yes",
  "publishDate": "2026-08-20",
  "modifiedDate": "2026-08-20",
  "determinationYear": 2026,
  "states": ["PA"],
  "stateNames": ["Pennsylvania"],
  "counties": ["Allegheny"],
  "countyCount": 1,
  "isStatewide": "No",
  "constructionTypes": ["Building"],
  "alternateNumbers": ["PA260001", "PA261", "PA20261", "PA0001"],
  "wdUrl": "https://sam.gov/wage-determination/PA20260001/6",
  "apiUrl": "https://sam.gov/api/prod/wdol/v1/wd/PA20260001/6",
  "coveredArea": "Pennsylvania Counties of Allegheny",
  "lastRevisionDate": "08/20/2026",
  "rateLineCount": 35,
  "lowestRateUsd": 22.37,
  "medianRateUsd": 37.93,
  "highestRateUsd": 61.07,
  "classificationRates": [
    {
      "classification": "ASBESTOS WORKER/INSULATOR (INCLUDES THE APPLICATION OF ALL INSULATING MATERIALS, PROTECTIVE COVERINGS, COATINGS AND FINISHINGS TO ALL TYPES OF MECHANICAL SYSTEMS)",
      "rateUsd": 46.5,
      "fringesUsd": 29.43,
      "group": "ASBE0002-001 (08/01/2024)"
    },
    {
      "classification": "BOILERMAKER",
      "rateUsd": 48.28,
      "fringesUsd": 33.17,
      "group": "BOIL0154-001 (01/01/2025)"
    }
  ],
  "executiveOrders": ["Executive Order 13658"],
  "minimumWageUsd": 13.65,
  "scrapedAt": "2026-08-27T19:19:20.148Z"
}

A Service Contract Act row looks the same down to wdUrl, then carries occupationRates (346 of them on determination 2015-4653), healthAndWelfareHourlyUsd (5.92), vacationText, holidaysText and holidayCount instead of the classification table.

Configure the run

Run it with no input for the newest determinations across both registers. Determination numbers, search terms and states go to SAM.gov's index; county, construction type and date filters are applied as each record is read.

The 100 most recently modified determinations:

{ "maxItems": 100 }

Davis-Bacon building rates for two states, with the classification table:

{
  "wdTypes": ["DBA"],
  "states": ["PA", "TX"],
  "constructionTypes": ["Building"],
  "includeOccupationRates": true,
  "maxItems": 500
}

One determination with everything, including its revision history:

{
  "wdNumbers": ["2015-4653"],
  "includeDocument": true,
  "includeOccupationRates": true,
  "includeFringeBenefits": true,
  "includeExecutiveOrders": true,
  "includeRevisionHistory": true
}

Service Contract Act determinations covering one county:

{
  "wdTypes": ["SCA"],
  "states": ["TN"],
  "countyContains": "Lawrence",
  "includeFringeBenefits": true,
  "maxItems": 200
}

Free users

Free-plan runs return up to 10 determinations as a preview. Upgrade your Apify plan to pull a whole state or register.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the SAM.gov Wage Determinations Scraper.
  3. Pick a type, a state or a determination number, tick the rate blocks, then click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab, or schedule a weekly run to catch revisions.

Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent the prevailing wage registers through the Model Context Protocol:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/sam-gov-wage-determinations-scraper"

Then ask: "What is the Davis-Bacon electrician rate in Allegheny County, Pennsylvania?", "Which SCA determination covers Lawrence County, Tennessee, and what is the health and welfare rate?" or "How many revisions has determination 2015-4653 had?"

Troubleshooting

Why did my state filter return fewer rows than SAM.gov shows?

Each state is searched as its own query, which is what keeps a slice under SAM.gov's 10,000 record ceiling. If a state has more active determinations than your maxItems, raise it or add a county or construction-type filter.

Why are the occupation rates empty on a Davis-Bacon row?

Davis-Bacon decisions have classifications, not occupation codes, so those rows fill classificationRates instead. Service Contract Act registers fill occupationRates. Neither block is charged when it found nothing.

Why is there no health and welfare rate on a construction decision?

Davis-Bacon carries fringes per classification rather than as a benefits section, so fringesUsd on each classification is where that money is. In a 300 row Davis-Bacon run the fringe block fired on 17 rows, which are the ones that do state a benefits section.

Why does a determination have no counties?

Statewide determinations cover the whole state; isStatewide says so and counties is empty by design.

Why is the run slow with the rate blocks on?

Each determination's document is a separate request. Index-only runs read 100 rows per request; with the rate blocks it is one request per row, and 300 determinations with rates took 11 seconds.

FAQ

Question Answer
What is a wage determination? The Department of Labor's ruling on the minimum wages and fringe benefits a federal contractor must pay for a class of work in a place. Davis-Bacon covers construction, the Service Contract Act covers services.
How many are there? 85,426 Davis-Bacon decisions and 10,124 active Service Contract Act and collective bargaining determinations at the time of the build.
Do I need a SAM.gov account or API key? No. Everything here comes from SAM.gov's public search index and its public wage determination endpoint.
Are superseded revisions included? Turn off "only active" to reach them, and use the revision history block to list every revision of a determination.
Can I get the rates as rows? Yes. Each determination carries occupationRates or classificationRates with one entry per rate line, plus the lowest, median and highest.
What is the group on a Davis-Bacon rate? The union agreement or survey code that set it, with the effective date, for example ELEC0005-004 (06/01/2025).
How current is the data? The index is live. During testing it carried determinations modified the same day.
Can I look up one determination number? Yes, with wdNumbers, or paste the SAM.gov URL into startUrls.
How many rows per run? Free plan: 10. Paid: as many as your filters match.
Is this an official SAM.gov product? No. It is unofficial and reads only public data.

πŸ†˜ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by SAM.gov, the General Services Administration or the Department of Labor. It reads only public data. Wage determinations are legal instruments: always confirm the determination and revision in force for your contract on SAM.gov before relying on a rate.

What input does the SAM.gov Wage Determinations Scraper accept?

FieldTypeWhat it doesDefault
wdTypes array Which registers to read: Service Contract Act and collective bargaining agreements (10,124 active), or Davis-Bacon construction decisions (85,426). not set
wdNumbers array Exact wage determination numbers, for example 2015-4653 for a Service Contract Act register or PA20260001 for a Davis-Bacon general decision. not set
startUrls array Paste SAM.gov wage determination URLs such as https://sam.gov/wage-determination/2015-4653/34. not set
maxItems integer Free users: limited to 10 items (preview). Paid users: up to 1,000,000. 10
states array Two-letter state codes, for example TX or PA. Each state is searched separately, which also keeps every slice under SAM.gov's 10,000 record ceiling per query. not set
countyContains string Keep only determinations covering a county whose name contains this text, for example "Allegheny". not set
constructionTypes array Davis-Bacon only. The four construction types the Department of Labor issues decisions for. not set
searchTerms array Free-text queries against SAM.gov's wage determination index, for example a county name or a determination number fragment. not set
publishedFrom string Earliest publication date, as YYYY-MM-DD. not set
publishedTo string Latest publication date, as YYYY-MM-DD. not set
onlyActive boolean Keep only determinations currently in force. Turn it off to reach superseded revisions as well. true
sortBy string (2 options) Order by the date SAM.gov last modified the determination. newest
includeDocument boolean Add the full text of the determination as the Department of Labor publishes it, plus the covered area, the header state and the last revision date. false
includeOccupationRates boolean Parse the wage table into rows: occupation code, title and hourly rate for Service Contract Act registers, or classification, rate and fringes for Davis-Bacon decisions, with the lowest, highest and median rate. false
includeFringeBenefits boolean Parse the health and welfare rate, the vacation schedule and the paid holidays the determination requires. false
includeExecutiveOrders boolean Parse the executive orders the determination cites and the contractor minimum wage they set. false
includeRevisionHistory boolean Add every published revision of the determination with its number, date and whether it is active. false

How much does the SAM.gov Wage Determinations Scraper cost?

from $2.67 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.0178 to $0.02
Wage determination One wage determination: number, type (Service Contract Act, Davis-Bacon or collective bargaining agreement), revision number, active and standard flags, publication and modification dates, the states and counties it covers, construction types, alternate numbers and the SAM.gov link. $0.00445 to $0.005
Index page scanned One page of 100 results read from SAM.gov's wage determination index, including pages a state or date filter had to walk through. Never charged for more pages than the run wrote rows. $0.00267 to $0.003
Determination text Optional. The determination as the Department of Labor publishes it, with the covered area, the header state and the last revision date. Charged only when the document came back. $0.00356 to $0.004
Occupation and classification rates Optional. The wage table parsed into rows: occupation code, title and hourly rate for Service Contract Act registers, or classification, rate, fringes and union agreement code for Davis-Bacon decisions, with the lowest, median and highest rate. Charged only when rates were found. $0.00534 to $0.006
Fringe benefits Optional. The health and welfare hourly rate, the vacation schedule and the paid holidays the determination requires. Charged only when the determination states them. $0.00356 to $0.004
Executive order minimums Optional. The executive orders the determination cites and the contractor minimum wage they set for the year. Charged only when an order is cited. $0.00267 to $0.003
Revision history Optional. Every published revision of the determination with its number, date and whether it is still active. Charged only when history came back. $0.00356 to $0.004

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the SAM.gov Wage Determinations Scraper API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST Β· run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~sam-gov-wage-determinations-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "maxItems": 10,
    "onlyActive": true,
    "sortBy": "newest",
    "includeDocument": false,
    "includeOccupationRates": false
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "maxItems": 10,
  "onlyActive": true,
  "sortBy": "newest",
  "includeDocument": false,
  "includeOccupationRates": false
}

What do users say about the SAM.gov Wage Determinations Scraper?

No reviews yet. Be the first.

How do I report an issue with the SAM.gov Wage Determinations Scraper?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run SAM.gov Wage Determinations Scraper on Apify All scrapers