CA Public Works Apprenticeship Programs (DIR / DAS) avatar

CA Public Works Apprenticeship Programs (DIR / DAS)

Pricing

from $10.00 / 1,000 results

Go to Apify Store
CA Public Works Apprenticeship Programs (DIR / DAS)

CA Public Works Apprenticeship Programs (DIR / DAS)

All California public works apprenticeship programs in one deduplicated dataset: every county, every craft, with contacts. Built for DAS 140 / DAS 142 compliance workflows.

Pricing

from $10.00 / 1,000 results

Rating

0.0

(0)

Developer

Aaron Melton

Aaron Melton

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Every California public works apprenticeship program in one clean, deduplicated dataset: all 58 counties, all apprenticeable crafts, with program names, addresses, contact people, phone numbers, and emails.

The California Department of Industrial Relations (DIR) publishes this data only through a one-county-at-a-time, one-craft-at-a-time search form. Answering "which programs cover my counties and my trades" means running dozens of searches by hand and reconciling duplicates yourself. This actor runs the full sweep (about 1,600 county/craft combinations), verifies every page against the site's own result counts, and merges the results into unique programs with their complete county and trade coverage.

Who this is for

Contractors and labor compliance teams on California public works projects. State law requires contractors on public works to send contract award information (form DAS 140) to the applicable apprenticeship committees and to request dispatch of apprentices (form DAS 142). DIR's own guidance points to this county/craft database as the way to find the programs and contact information those forms go to. This actor gives you that entire database as structured data instead of a search form:

  • Build DAS 140 / DAS 142 mailing lists for all counties a project touches.
  • Keep a compliance database current instead of re-searching before every bid.
  • Feed program contacts into your CRM, compliance software, or spreadsheets.

Also useful for workforce development researchers, apprenticeship outreach programs, and anyone studying California's construction trades.

What you get

One record per unique program (default), with its full applicability:

{
"program_key": "sha1...",
"name": "Northern California Area Plumbers, ... (J.A.T.C.)",
"address_street": "1015 Yuba Street",
"address_city": "Marysville",
"address_state": "CA",
"address_zip": "95901",
"contact_person": "Beth Hammes",
"contact_title": "Apprenticeship Coordinator",
"phone": "(530) 673-8690",
"email": "DASforms@lu228.org",
"counties": ["Butte"],
"county_codes": ["BUTTEC"],
"trades": [{"code": "58", "labels": ["Plumbing & Pipefitting"]}],
"pair_count": 1,
"source_data_date": "08/18/2026",
"scraped_at": "2026-08-18T21:00:00+00:00",
"variants": []
}

A program that serves 12 counties in 2 trades is one record listing all 12 counties and both trades, not 24 duplicate rows.

Input

Run it with no input to sweep the entire state. Or narrow the sweep.

In the Apify Console, counties and trades are pick lists: choose counties and crafts by name ("Los Angeles", "Plumbing & Pipefitting") and leave either list empty to search all of them. No codes to look up.

Calling the actor via API or JSON, the same fields take DIR's own codes:

FieldTypeDefaultDescription
countiesarray of strings[] (all)DIR county codes, e.g. BUTTEC, LOS ANGELESE. See the county code table below.
tradesarray of strings[] (all)Two-digit craft codes, e.g. 58. See the trade code table below.
outputModeprograms or combinationsprogramsDataset shape, see below.
requestDelayMsinteger500Politeness delay per worker after each request.
maxConcurrencyinteger3Maximum simultaneous requests.

Unknown county or trade codes fail fast with a clear error instead of silently crawling nothing. County and craft lists are read live from the DIR form on every run, so an empty-list sweep picks up new counties or crafts automatically.

Example runs (JSON / API)

Console users just pick from the lists; these are the equivalent JSON inputs for API calls, tasks, and schedules.

Quick test, one county and one craft (finishes in seconds):

{ "counties": ["BUTTEC"], "trades": ["58"] }

Every program serving a project in Los Angeles County, all crafts:

{ "counties": ["LOS ANGELESE"] }

Every electrical program in the state:

{ "trades": ["22"] }

Full statewide sweep, all counties and all crafts (about 1,600 searches, a few minutes):

{ "counties": [], "trades": [] }

Output modes

programs (default): one record per unique program, deduplicated across all searches, with derived county and trade applicability (shown above).

combinations: one record per (county, craft, program) result, exactly as the DIR search returns it, with the source URL for each row:

{
"county": "Butte",
"county_code": "BUTTEC",
"trade_code": "58",
"trade_labels": ["Plumbing & Pipefitting"],
"program_key": "sha1...",
"name": "...",
"phone": "...",
"email": "...",
"source_url": "https://www.dir.ca.gov/databases/das/results_pwadd.asp?varCounty=BUTTEC&varType=58"
}

Tracking changes over time

Every record carries a program_key, a stable fingerprint of the program's normalized name and address (case, spacing, and punctuation insensitive, so DIR's own formatting quirks do not shift it). To monitor changes, schedule the actor (monthly matches how often DIR's data moves) and diff runs on program_key in your own pipeline:

  • a key present in the new run but not the old one is a new program
  • a key that disappeared is a program DIR no longer lists for your scope
  • for matching keys, compare fields like contact_person, phone, email, counties, and trades to catch updates

Compare runs that used the same county and trade selection; narrowing the input naturally removes programs from the output.

Data quality and accuracy

  • Every results page states "Search returned N sponsor(s)". The parser verifies its extracted count against N on every page. Mismatches are flagged in the data, never silently dropped. If DIR redesigns the site, the actor fails loudly instead of returning corrupted data.
  • Every page's "Data is current as of MM/DD/YYYY" date is captured with each record (source_data_date), so you always know how fresh DIR's own data is.
  • DIR's pages carry no program IDs and no geography. County and trade coverage is derived from which searches each program appears in, which is the only applicability information that exists.
  • Programs are matched across searches by normalized name and address. If a program's contact details differ between result pages, the differing raw blocks are preserved in variants for review.
  • Programs can be based outside California (for example, a Reno, Nevada JATC covers electrical work in Alpine County). Records are never assumed to have California addresses.
  • Combinations with zero sponsors are recorded as legitimate empty results, distinct from fetch errors. Fetch errors are retried with backoff and reported per combination without aborting the sweep.

Politeness

The actor is deliberately gentle with DIR's servers: 3 concurrent requests, 500 ms delay per worker, exponential backoff on errors, and an identifying User-Agent. A full state sweep completes in a few minutes without stressing the site.

County codes

Needed only for API / JSON input; in the Console you pick counties by name.

CodeCountyCodeCounty
ALAMEDAAAlamedaORANGEEOrange
ALPINECAlpinePLACERCPlacer
AMADORCAmadorPLUMASCPlumas
BUTTECButteRIVERSIDEERiverside
CALAVERASCCalaverasSACRAMENTOCSacramento
COLUSACColusaSAN BENITOBSan Benito
CONTRA COSTAAContra CostaSAN BERNARDINOESan Bernardino
DEL NORTEADel NorteSAN DIEGOGSan Diego
EL DORADOCEl DoradoSAN FRANCISCOASan Francisco
FRESNODFresnoSAN JOAQUINCSan Joaquin
GLENNCGlennSAN LUIS OBISPOESan Luis Obispo
HUMBOLDTAHumboldtSAN MATEOBSan Mateo
IMPERIALGImperialSANTA BARBARAESanta Barbara
INYODInyoSANTA CLARABSanta Clara
KERNDKernSANTA CRUZBSanta Cruz
KINGSDKingsSHASTACShasta
LAKEALakeSIERRACSierra
LASSENCLassenSISKIYOUCSiskiyou
LOS ANGELESELos AngelesSOLANOASolano
MADERADMaderaSONOMAASonoma
MARINAMarinSTANISLAUSCStanislaus
MARIPOSADMariposaSUTTERCSutter
MENDOCINOAMendocinoTEHAMACTehama
MERCEDDMercedTRINITYCTrinity
MODOCCModocTULAREDTulare
MONODMonoTUOLUMNECTuolumne
MONTEREYBMontereyVENTURAEVentura
NAPAANapaYOLOCYolo
NEVADACNevadaYUBACYuba

Codes are DIR's own form values (county name plus a trailing region letter). Some contain spaces; pass them exactly as shown.

Trade (craft) codes

Needed only for API / JSON input; in the Console you pick crafts by name.

CodeCraft
02Asbestos Workers
07Boilermaker
08Bricklayer
10Carpentry
12Carpet, Linoleum
14Cement Masons
21Sound / Communication Installer
22Electrical & Electronic
23Elevator Mechanic
24Operating Engineer
26Glazier & Glass Workers
31Inspector / Tester
32Iron & Steel Workers
34Brick Tender, Laborers, Plaster Tender
36Drywall / Lathers
38Lineman
48Millwright
54Painting & Decoration
55Drywall Finisher (Taper)
57Plasterer
58Plumbing & Pipefitting
59Heating, Ventilation & Air Conditioning
62Roofer
63Fire Sprinkler Fitter
64Sheet Metal
65Teamster
66Surveyor
68Tile Layer/Setter

Codes are DIR's two-digit craft codes. A few crafts share one code (for example code 34 covers Brick Tender, Laborers, and Plaster Tender); records list every label for a code.

Source

California Department of Industrial Relations, Division of Apprenticeship Standards, Public Works apprenticeship program search. This actor is not affiliated with or endorsed by DIR. Data accuracy is DIR's own; each record carries the site's stated data currency date.