Every California DIR labor registration in one deduplicated dataset: car wash, farm labor contractor, garment, janitorial, talent agency, and entertainment permits for minors, one record per registrant with all registrations, statuses, dates, addresses, and workers' comp carriers.
Actor description now says "one deduplicated dataset" instead of "one
verified dataset". "Verified" implies independent validation of registrant
data that the actor does not perform (it verifies its own sweep coverage
against the site's counts, which is a different claim); the wording also
broke the overlookdata.com build, which rejects that word in product copy.
actor.json version synced to 0.5.
[0.4.0] - 2026-08-23
Added
Store icon assets (Golden Seal, "CA / Registrations") at
docs/assets/icon-golden-seal.{svg,png}. actor.json version synced to 0.4.
[0.3.0] - 2026-08-23
Changed
Actor description shortened to 300 characters or fewer; apify push
rejects longer descriptions with "Description must be at most 300
characters long". actor.json version synced to 0.3.
[0.2.0] - 2026-08-23
Changed
Actor title shortened to "CA DIR Registrations: Car Wash, Janitorial, Garment,
Farm Labor" (63 characters) so apify push accepts it; the platform rejects
longer titles with "Actor name must be at most 63 characters long". The full
list of the six registration types stays in the README and description.
actor.json version synced to 0.2.
[0.1.0] - 2026-08-22
Added
Visualforce JavaScript Remoting client for the DIR Registration Search:
bootstrap parser that lifts the remoting context out of the results page,
request builder for the 19 positional search arguments, and a response
parser that decodes the remoting reference encoding ({"s","v"} /
{"ref"}), nested at any depth.
Date-sliced sweep across all six registration types (Car Wash, Farm Labor
Contractor, Garment Manufacturers and Contractors, Janitorial, Talent
Agency, Entertainment Permit to Employ Minors), one effective-date year
slice at a time, with per-type record deduplication by Salesforce ID.
Self-verification: an optional second sweep by expiration date, compared
against the effective-date sweep per type inside the window both sweeps could
see (records effective before the first swept year, or with no expiration
date or one beyond the check window, are counted separately and do not flip
the match). Written to the VERIFICATION key-value record with counts,
slices fetched and split, failing slices, the IDs found by only one sweep,
and the sweep window.
Union output: registrations found only by the expiration-date sweep (DIR has
a live record whose effective date is typed as the year 2120) are merged into
the dataset and counted as merged_from_check.
Response-cap handling: a slice that returns DIR's 15 MB
statusCode 414 is halved and re-fetched down to single days, with the
split count reported. Too many query rows and unrecoverable slices are
recorded as errors without aborting the sweep.
Session recovery: a remoting call that comes back as HTML or with an
unexpected status code re-bootstraps the remoting context once and retries
the slice before giving up. A type whose bootstrap fails is recorded as an
error and the remaining types still sweep; no failure inside a slice can
abort the run.
Async client (httpx) with semaphore-bounded concurrency, per-request
politeness delay, 3 attempts with exponential backoff on 5xx, timeouts, and
transport errors, and an identifying User-Agent.
Two output modes: registrants (one record per DIR account, with all
registrations, the newest per type, and has_active_registration) and
registrations (one flat record per registration). Client-side status
filtering drops registrations and drops registrants left with none.
Optional detail-page enrichment: main location, branch locations, DBA
names, and bond history, parsed around the stray inline scripts DIR renders
inside its table cells.
Apify actor wrapper (src/main.py), local CLI runner (src/cli.py), input,
dataset and output schemas, and an offline pytest suite against saved
fixtures for all six types.