Washington L&I Contractor & License Scraper avatar

Washington L&I Contractor & License Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Washington L&I Contractor & License Scraper

Washington L&I Contractor & License Scraper

Scrape Washington State L&I contractor licenses with insurance, bond and principal data from data.wa.gov Socrata API. Joins 4 datasets: General + Insurance + Bond + Principal by license number. Filter by status, specialty, city and date. No auth, no proxy, no browser.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Haketa

Haketa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Washington L&I Contractor & License Scraper — General, Specialty, Bond, Insurance & Principal Data Extractor

The most complete Washington State Department of Labor & Industries (L&I) contractor data extraction tool on Apify. Pull every registered Construction, Electrical, and General Contractor in Washington — joined live with liability insurance, surety bond, and principal-owner records from data.wa.gov — structured, filtered, and ready for compliance, bidding, lead-gen, underwriting, and risk-analytics workflows.

Apify Actor


What This Actor Does

The Washington L&I Contractor & License Scraper is a production-ready Apify Actor that extracts the complete public contractor licensing record set from the Washington State Department of Labor & Industries (L&I) — the state regulator that registers every Construction Contractor (CC), Electrical Contractor (EC), and General Contractor (GC) doing business in Washington.

Instead of scraping the slow HTML lookup tool at secure.lni.wa.gov/verify, this actor talks directly to L&I's Socrata SODA Open Data API on data.wa.gov and joins four official datasets by contractor license number in a single run:

  • General license dataset (m8qx-ubtq) — business name, license type, status, address, UBI, specialty codes, effective/expiration/suspend dates, primary principal
  • Insurance dataset (ciwg-agsx) — carrier, policy number, coverage amount, effective/expiration/cancel dates, agency name
  • Surety bond dataset (bzff-4fmt) — bond firm, bond amount, impairment status, effective/expiration/cancel dates
  • Principal/officer dataset (4xk5-x9j6) — current owners and officers of record

Every output row is a fully joined contractor profile: who they are, what they're licensed to do, where they operate, who insures and bonds them, who runs the company, and whether the registration is currently in good standing. No headless browser. No CAPTCHA. No login. No proxy.

Why scrape L&I yourself when this exists?

Washington L&I's verification portal (secure.lni.wa.gov/verify) is the consumer-facing lookup most teams discover first — and quickly hit a wall:

  • The verify page enforces single-record JavaScript-rendered lookups, not bulk export
  • Insurance, bond, and principal data live on separate sub-pages with their own DOM structures
  • Specialty codes (01, 02, BW, EL, RO...) are rendered with descriptions in tooltips, not stable attributes
  • Pagination of search results breaks on >500 hits — the page silently truncates
  • Suspend/expiration dates are formatted inconsistently across categories
  • L&I rotates anti-scrape headers and occasionally rate-limits IPs hammering the verify form
  • Bond impairment status — critical for risk scoring — only appears on a tertiary detail tab
  • The Socrata API exists, but four datasets joined manually is hours of SoQL plumbing
  • No incremental update endpoint — you must re-pull and diff to detect changes
  • Raw Socrata field names (contractorlicensetypecodedesc, bondimpaireddate) are painful to query directly

This actor solves all of that. It hits the Socrata API, batches IN() lookups across the three enrichment datasets, joins by contractorlicensenumber, normalises field names, formats dates as ISO YYYY-MM-DD, and pushes one flat JSON record per contractor.


Quick Start

One-Click Run

  1. Click "Try for free" on the Apify Store page
  2. Default input scrapes the most recent 100 ACTIVE Washington contractors with full insurance + bond + principal enrichment
  3. Hit Start — first results stream in within seconds
  4. Download the dataset as JSON, CSV, Excel, XML, or HTML directly from the Apify UI

API Run (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/washington-li-contractor-license-scraper").call(run_input={
"statuses": ["ACTIVE"],
"licenseTypes": ["GC", "CC"],
"specialties": ["01"],
"cities": ["SEATTLE", "BELLEVUE", "TACOMA"],
"maxRecords": 2000,
"pageSize": 1000,
})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
print(record["licenseNumber"], record["businessName"], record["status"],
record["city"], record["insuranceCompany"], record["bondFirm"])

API Run (Node.js / TypeScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('haketa/washington-li-contractor-license-scraper').call({
statuses: ['ACTIVE'],
licenseTypes: ['EC'],
cities: ['SPOKANE', 'VANCOUVER'],
effectiveAfter: '2023-01-01',
maxRecords: 5000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} active electrical contractors in Spokane & Vancouver, WA`);

API Run (cURL)

curl -X POST "https://api.apify.com/v2/acts/haketa~washington-li-contractor-license-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"statuses": ["ACTIVE", "SUSPENDED"],
"licenseTypes": ["CC"],
"cities": ["SEATTLE"],
"enrichBond": true,
"enrichInsurance": true,
"maxRecords": 500
}'

How It Works

The actor uses Washington's Socrata SODA Open Data API (data.wa.gov/resource/<id>.json) — the same backend that powers the official Open Data portal — and joins four datasets by contractorlicensenumber in process.

Source endpoints

StepDatasetSocrata IDPurpose
1Generalm8qx-ubtqCore license record — business, address, specialty, status
2Insuranceciwg-agsxLiability insurance — carrier, policy number, coverage
3Bondbzff-4fmtSurety bond — firm, amount, impairment status
4Principal4xk5-x9j6Owners / officers of record

All four endpoints live under https://data.wa.gov/resource/ and respond with newline-delimited JSON via $select, $where, $limit, $offset, and $order SoQL parameters.

Engineering details

  • Direct HTTPS with got-scraping — no Puppeteer, no Playwright, no headless browser overhead
  • SoQL WHERE pushdown — status, specialty, license type, city, and date filters execute server-side so the wire only carries matching rows
  • Count-then-paginate — actor calls count(*) first to size the run and respects maxRecords cleanly
  • Chunked enrichment joins — license numbers batch into groups of 100 for IN(...) SoQL clauses (URL-length safe)
  • Latest-wins de-duplication — if a contractor has multiple insurance/bond records, the most recent by effective date wins
  • Active-principal filter — only principals with no enddate are aggregated into the principals field
  • ISO date normalisation — every date trimmed to YYYY-MM-DD
  • Polite pacing — configurable requestDelay (default 200ms) keeps you well within Socrata's anonymous quotas
  • Deterministic, idempotent outputORDER BY licenseeffectivedate DESC; each licenseNumber emitted at most once per run

Input Parameters

{
"statuses": ["ACTIVE"],
"specialties": ["01"],
"licenseTypes": ["GC", "CC"],
"cities": ["SEATTLE", "BELLEVUE"],
"effectiveAfter": "2023-01-01",
"effectiveBefore": "",
"enrichInsurance": true,
"enrichBond": true,
"enrichPrincipal": true,
"maxRecords": 2000,
"pageSize": 1000,
"requestDelay": 200
}

Parameter reference

ParameterTypeDefaultDescription
statusesarray<string>["ACTIVE"]License status filter. Values: ACTIVE, EXPIRED, SUSPENDED, RE-LICENSED, CANCELLED. Empty array = all statuses. Case-insensitive.
specialtiesarray<string>[]Specialty code filter on specialtycode1. Common values: 01 General, 02 Electrical, 03 Plumbing, 04 HVAC, BW Bridge/Water, CB Painting, DP Demolition, EL Elevator, RO Roofing. Empty = all specialties.
licenseTypesarray<string>[]License type code: CC (Construction Contractor), EC (Electrical Contractor), GC (General Contractor). Empty = all.
citiesarray<string>[]City filter, case-insensitive. Examples: ["SEATTLE", "TACOMA", "SPOKANE"]. Empty = no city filter.
effectiveAfterstring""Only include licenses with licenseeffectivedate >= YYYY-MM-DD. Empty = no lower bound.
effectiveBeforestring""Only include licenses with licenseeffectivedate <= YYYY-MM-DD. Empty = no upper bound.
enrichInsurancebooleantrueJoin Insurance dataset. Set false to skip for faster runs.
enrichBondbooleantrueJoin Bond dataset (firm, amount, impaired status).
enrichPrincipalbooleantrueJoin Principal dataset (owners/officers).
maxRecordsinteger100Hard cap on total General-dataset records. 0 = unlimited.
pageSizeinteger100Records per Socrata page. Min 100, max 50000. Sweet spot 10005000.
requestDelayinteger200Milliseconds between API calls. 0 = no delay (only safe with a Socrata app token).

Output Schema

Every record is a flat JSON object with the same shape regardless of enrichment toggles — fields you didn't request are simply null. This keeps downstream ingestion (BigQuery, Postgres, Snowflake, Salesforce upserts) free of per-row branching.

Core license fields (always present)

FieldTypeDescription
businessNamestringLegal business name as registered with L&I
licenseNumberstringL&I contractor license number — primary join key across all four datasets
licenseTypeCodestringCC, EC, or GC
licenseTypeDescstringHuman-readable license type, e.g. Construction Contractor
statusstringNormalised status string — ACTIVE, EXPIRED, SUSPENDED, RE-LICENSED, CANCELLED
statusCodestringL&I numeric status code
addressstringPrimary mailing/business address (line 1)
citystringCity as registered
statestringTwo-letter US state
zipstringZIP / ZIP+4
phonestringRegistered contractor phone
ubistringWashington Unified Business Identifier (9-digit cross-agency ID)
businessTypestringEntity type description (e.g. Corporation, LLC, Sole Proprietor)
specialty1stringPrimary specialty code
specialty1DescstringPrimary specialty description
specialty2stringSecondary specialty code (if any)
specialty2DescstringSecondary specialty description (if any)
primaryPrincipalstringPrimary principal name from General dataset
licenseEffectiveDatestringLicense effective date (YYYY-MM-DD)
licenseExpirationDatestringLicense expiration date (YYYY-MM-DD)
suspendDatestringDate license was suspended, if applicable
scrapedAtstringISO-8601 timestamp of extraction

Insurance fields (when enrichInsurance: true)

FieldTypeDescription
insuranceCompanystringCarrier name (e.g. ZURICH AMERICAN INSURANCE COMPANY)
insurancePolicyNostringPolicy number on file with L&I
insuranceAmountstringCoverage amount (in USD, as reported)
insuranceExpirationstringPolicy expiration date (YYYY-MM-DD)
insuranceAgencystringProducing agency name

Bond fields (when enrichBond: true)

FieldTypeDescription
bondFirmstringSurety firm issuing the bond
bondAmountstringBond face amount (typically $6,000 / $12,000 / higher for specialty)
bondExpirationstringBond expiration date (YYYY-MM-DD)
bondImpairedstringYes / No — whether the bond is currently impaired by claim

Principal fields (when enrichPrincipal: true)

FieldTypeDescription
principalsstringSemicolon-delimited list of currently-active owners/officers

Example: Active GC in Seattle with full enrichment

{
"businessName": "EVERGREEN HORIZON BUILDERS LLC",
"licenseNumber": "EVERGHB999AA",
"licenseTypeCode": "GC",
"licenseTypeDesc": "General Contractor",
"status": "ACTIVE",
"statusCode": "01",
"address": "1500 1ST AVE S",
"city": "SEATTLE",
"state": "WA",
"zip": "98134",
"phone": "2065550199",
"ubi": "604999999",
"businessType": "Limited Liability Company",
"specialty1": "01",
"specialty1Desc": "General",
"specialty2": null,
"primaryPrincipal": "DOE, JANE A",
"licenseEffectiveDate": "2022-04-12",
"licenseExpirationDate": "2026-04-12",
"suspendDate": null,
"insuranceCompany": "ZURICH AMERICAN INSURANCE COMPANY",
"insurancePolicyNo": "GLP-0099887",
"insuranceAmount": "1000000",
"insuranceExpiration": "2026-09-30",
"insuranceAgency": "NORTHWEST RISK PARTNERS",
"bondFirm": "MERCHANTS BONDING COMPANY",
"bondAmount": "12000",
"bondExpiration": "2026-04-12",
"bondImpaired": "No",
"principals": "DOE, JANE A; DOE, JOHN B",
"scrapedAt": "2026-05-16T09:00:00.000Z"
}

Example: Suspended Construction Contractor with impaired bond

{
"businessName": "SAMPLE TACOMA REMODELERS INC",
"licenseNumber": "SAMPTRI222BB",
"licenseTypeCode": "CC",
"status": "SUSPENDED",
"city": "TACOMA",
"state": "WA",
"zip": "98444",
"phone": "2535550155",
"ubi": "603111222",
"businessType": "Corporation",
"specialty1": "01",
"specialty1Desc": "General",
"specialty2": "RO",
"specialty2Desc": "Roofing",
"primaryPrincipal": "SAMPLE, ROBERT",
"licenseEffectiveDate": "2019-06-01",
"licenseExpirationDate": "2025-06-01",
"suspendDate": "2024-11-20",
"insuranceCompany": null,
"bondFirm": "OLD REPUBLIC SURETY COMPANY",
"bondAmount": "12000",
"bondExpiration": "2025-06-01",
"bondImpaired": "Yes",
"principals": "SAMPLE, ROBERT",
"scrapedAt": "2026-05-16T09:00:00.000Z"
}

Reference Tables

License status values

StatusMeaning
ACTIVELicense current, in good standing — may legally bid and contract
EXPIREDPast expiration date — may not contract until renewed
SUSPENDEDSuspended by L&I (often for impaired bond, unpaid taxes, or violation)
RE-LICENSEDPreviously cancelled / expired and subsequently re-issued
CANCELLEDVoluntarily cancelled or terminated

Use statuses: ["ACTIVE"] for bid-ready lists; include SUSPENDED and EXPIRED when monitoring compliance risk.

License type codes

CodeDescriptionTypical Use
GCGeneral ContractorFull-scope general construction — most commercial GCs
CCConstruction ContractorRegistered construction contractor (broadest category)
ECElectrical ContractorHolds an EC license under Chapter 19.28 RCW (separate from CC/GC)

Specialty codes (most common)

CodeSpecialty
01General
02Electrical
03Plumbing
04HVAC / Heating, Ventilation, and Air Conditioning
BWBridge / Water
CBPainting
DPDemolition
ELElevator
RORoofing
SISign Erection
LALandscaping
MAMasonry

Specialty codes are filtered against specialtycode1 (primary specialty). A contractor's specialty2 field is still returned so you can post-filter on secondary specialties downstream.


Use Cases

Construction Lead Generation & Sales Prospecting

Building-material suppliers, equipment dealers, construction SaaS vendors (Procore, Buildertrend, CompanyCam), and trade associations use this dataset to:

  • Build hyper-targeted prospect lists of every ACTIVE General Contractor in Seattle, Tacoma, or any WA metro
  • Segment by specialty — pull only roofers (RO), electricians (02/EC), or HVAC (04) for trade-specific campaigns
  • Filter on licenseEffectiveDate to surface brand-new entrants who haven't been pitched yet
  • Enrich existing CRM accounts with current UBI, principal owner names, and contact phone numbers
  • Route territory by ZIP — King County, Pierce County, Snohomish County reps each get clean splits

Subcontractor Vetting & GC Bid Compliance

General contractors, owner's reps, and construction managers vetting subcontractors before issuing an RFQ or executing a subcontract use this dataset to:

  • Verify license status is ACTIVE on the day of bid award — required by RCW 18.27
  • Confirm bond is in place and not impaired (bondImpaired = "No")
  • Validate insurance is current by checking insuranceExpiration against the project schedule
  • Match specialty1 / specialty2 against the scope of work being subcontracted
  • Cross-reference principals to detect related entities (e.g. a previously-suspended entity reincorporated under a new name)

Insurance Underwriting & Surety Risk Modeling

Commercial GL carriers and surety bond underwriters writing WA contractor business use the dataset to:

  • Pre-fill quote applications with verified UBI, business type, principal names, and prior carrier
  • Detect bond churn — frequent bondFirm changes can signal underlying claim activity
  • Flag impaired bonds (bondImpaired = "Yes") for portfolio review and renewal decisions
  • Track new license issuances as fresh underwriting opportunities
  • Build loss-frequency models by correlating SUSPENDED populations to specialty and metro

Compliance, Procurement & Public Works Verification

Public agencies, municipal procurement offices, school districts (OSPI), and Sound Transit / WSDOT prime contractors use this dataset to:

  • Verify prime and sub registration before issuing contracts under RCW 39.06
  • Maintain audit-ready snapshots with timestamped scrapedAt fields proving when verification ran
  • Catch suspension events within 24 hours by running daily diffs
  • Replace manual L&I verify-page lookups that cost hours of clerical time per bid cycle
  • Document due diligence for state auditor, federal grant, and DBE/MWBE compliance

Construction-defect attorneys, plaintiff's firms, journalists, and consumer-protection investigators use the dataset to:

  • Confirm a contractor was licensed on the date of contracting — RCW 18.27.080 bars unlicensed-contractor lawsuits
  • Pull current insurance carrier + policy number for tender of defense
  • Identify the surety on file when filing a claim against the bond
  • Surface contractors with histories of suspension (status = "SUSPENDED" joined with suspendDate)
  • Map principal-owner overlap across multiple license records to expose serial-bad-actor schemes

Real Estate Development & Project Origination

Developers, GCs, and real-estate investors profile contractor density and capacity by submarket:

  • Identify experienced specialty subs in Bellevue, Kirkland, or Redmond before mobilizing on a new project
  • Spot capacity constraints by counting active GCs per ZIP relative to permit volume
  • Track new entrants as potential bid candidates on small-/medium-tier work
  • Quantify bond-class coverage (small-residential bonds vs commercial-grade) by region

Recruiting, Workforce & Academic Research

Construction recruiters, trade-staffing firms, apprenticeship coordinators, and labor economists use the dataset to:

  • Build employer lists by specialty and metro for outbound sourcing
  • Estimate market hiring capacity by ACTIVE-contractor count by specialty
  • Target signage (SI), elevator (EL), and specialty trades that suffer chronic labor shortages
  • Study small-business formation by tracking new license issuances over time
  • Quantify regulatory enforcement — suspension rates by region, specialty, and license type

Sample Queries & Recipes

Recipe 1: Every active GC in Seattle, with bond + insurance

{
"statuses": ["ACTIVE"],
"licenseTypes": ["GC"],
"cities": ["SEATTLE"],
"enrichInsurance": true,
"enrichBond": true,
"enrichPrincipal": true,
"maxRecords": 0
}

Recipe 2: All roofers (RO) across Western Washington

{
"statuses": ["ACTIVE"],
"specialties": ["RO"],
"cities": ["SEATTLE", "BELLEVUE", "TACOMA", "EVERETT", "RENTON", "KENT"],
"enrichBond": true,
"maxRecords": 2000
}

Recipe 3: Suspended contractors (compliance dashboard)

{
"statuses": ["SUSPENDED"],
"enrichBond": true,
"enrichPrincipal": true,
"maxRecords": 0
}

Then post-filter: risky = [r for r in records if r["bondImpaired"] == "Yes"]

Recipe 4: Newly-licensed electrical contractors in 2025

{
"statuses": ["ACTIVE"],
"licenseTypes": ["EC"],
"effectiveAfter": "2025-01-01",
"enrichInsurance": true,
"enrichBond": true
}

Recipe 5: Spokane HVAC + plumbing prospect list

{
"statuses": ["ACTIVE"],
"specialties": ["03", "04"],
"cities": ["SPOKANE", "SPOKANE VALLEY"],
"enrichPrincipal": true,
"maxRecords": 1000
}

Recipe 6: Statewide CC + GC firms, no enrichment (fastest bulk pull / sanity test)

{
"statuses": ["ACTIVE"],
"licenseTypes": ["CC", "GC"],
"enrichInsurance": false,
"enrichBond": false,
"enrichPrincipal": false,
"pageSize": 5000,
"maxRecords": 0
}

For a 50-record sanity test, drop licenseTypes and set maxRecords: 50 with all enrichments off.


Integration Examples

Google Sheets (via Apify Integration)

  1. Set up an Apify schedule running this actor nightly at 03:00 PST
  2. Add the "Export to Google Sheets" integration to the schedule
  3. Each morning your Sheet has a fresh snapshot of every ACTIVE WA contractor you care about

Make.com / Zapier / n8n

Use the Apify connector on any major automation platform to trigger downstream workflows on new ACTIVE licenses (diff today vs yesterday), status transitions (ACTIVE -> SUSPENDED -> Slack ping), bond expirations within 30 days (renewal task in HubSpot), and insurance lapses (alert risk coordinator).

Power BI / Tableau / Looker

Connect Apify's REST dataset endpoint as a data source. Build dashboards covering active contractor count by metro and specialty, suspension rate by license type, bond-impairment heatmap by ZIP, insurance-carrier market share, and new-license issuance velocity by quarter.

Postgres / Snowflake / BigQuery

Use the Apify webhook integration to POST run results directly to your warehouse ingest endpoint after each scheduled run. Key on licenseNumber as primary, ubi as secondary join to other WA state datasets.

Salesforce / HubSpot CRM Enrichment

Trigger an Apify run nightly, then upsert against Account records keyed on licenseNumber or ubi. Status change events automatically create Tasks. Use the principal-owner field to populate Contact records for direct-decision-maker outreach.

Slack / Microsoft Teams Webhooks

Wire the Apify webhook integration to your channel URL. Useful templates: "X new ACTIVE GCs licensed in King County this week", "Contractor suspended today", "Bond impaired: <businessName>".


Major Washington Markets at a Glance

Metro AreaPopulationConstruction Significance
Seattle750K (4.0M MSA)Largest concentration of commercial GCs; Amazon/Microsoft tech-corridor build-outs
Tacoma220KPort-of-Tacoma logistics build, JBLM-adjacent residential, infrastructure
Spokane230KInland Northwest hub; medical, education, multifamily
Bellevue150KEastside tech-driven high-rise residential and Class-A office
Vancouver200KPortland-metro overflow; cross-river residential and warehouse
Kent135KIndustrial / warehouse / logistics build (Kent Valley)
Everett110KBoeing aerospace supply chain, Light Rail extension
Renton105KBoeing 737 plant, Southport mixed-use, residential
Bellingham / Yakima / Tri-Cities / Olympia50–95K eachSecondary markets — agriculture, Hanford, capitol public works, cross-border

Cost & Performance

MetricValue
EngineSocrata SODA API over HTTPS — no browser
Runtime (100 records, full enrichment)5–15 seconds
Runtime (5,000 records, full enrichment)60–180 seconds
Runtime (unfiltered statewide bulk)varies — depends on enrichment toggles and pageSize
Cost per typical runPay-per-event — typically a small fraction of a Compute Unit
Pricing modelPay-per-event (transparent per-record pricing)
Data freshnessLive at run time — Socrata mirrors L&I updates on regular cadence
Auth requiredNone (Socrata public API; app token optional for higher quotas)
Proxy requiredNone
ConcurrencySafe to run multiple parallel filtered configurations
Memory footprint512 MB sufficient for typical runs; 4096 MB max recommended for full-state with enrichment

  • Public data only — every field originates from datasets L&I publishes at data.wa.gov under Washington's Public Records Act (RCW 42.56)
  • No SSNs, DOBs, or financial account numbers are present in the source data
  • Principal names are public on every WA contractor registration; insurance and bond amounts are required public disclosures under RCW 18.27
  • Address data is the registered business address — not personal residence (except sole proprietors who use a home address voluntarily)
  • CAN-SPAM, TCPA, GDPR/CCPA compliance for downstream marketing use is the data consumer's responsibility
  • No web-scraping of secure.lni.wa.gov — this actor uses the official Socrata API at data.wa.gov, published explicitly for programmatic consumption. Respect Socrata's API terms and L&I's data policies.

Important: This dataset must not be used for unlawful purposes including identity theft, contractor harassment, or impersonation. It is intended for legitimate compliance, sales, underwriting, journalism, and research workflows.


Frequently Asked Questions

How fresh is the data?

Live at run time. The Socrata API mirrors Washington L&I's contractor registration system on a regular cadence (typically near-daily for status changes, weekly for full refreshes).

How many records will I get?

Washington has tens of thousands of registered contractors across CC, EC, and GC categories. The exact count depends on your filter combination. Set maxRecords: 0 for no cap, or sample with maxRecords: 50 first to size your run.

Does this scraper require login or API keys?

No. The Socrata SODA API on data.wa.gov is public and requires no authentication. You only need an Apify account. If you have a Socrata app token and want higher per-IP quotas, you can fork the actor and add it as a header.

Does this work for other states?

This actor is Washington-specific. We maintain separate Apify actors for other state licensing boards — see Related Actors below.

Can I use this for license verification at scale?

Yes. Many GCs and underwriting desks run this actor daily, diff against yesterday's run, and trigger Slack/email alerts on status transitions or bondImpaired flips. Apify schedules make this fully automated.

Are contractor emails included?

No. L&I does not publish contractor email addresses in the public Socrata datasets. Phone numbers and mailing addresses are included.

Can I filter by bond amount or insurance coverage?

The actor returns those fields — apply numeric filters in your downstream pipeline (SQL WHERE bond_amount >= 50000, Python comprehension, Sheets filter). Socrata SoQL filtering on those fields is not exposed as an actor input today.

What's the difference between CC, EC, and GC?

CC (Construction Contractor) is the broadest registration under RCW 18.27. GC (General Contractor) is the subtype for general-construction prime contractors. EC (Electrical Contractor) is a separate license under Chapter 19.28 RCW administered by L&I's Electrical Section. A single firm may hold both — they appear as separate records keyed by separate license numbers.

What does bondImpaired = "Yes" mean?

A bond is "impaired" when claims have been filed against it and partially or fully drawn down its face value. L&I treats impaired bonds as a compliance trigger — a contractor with an impaired bond cannot legally bid new work until the bond is restored.

Why might insuranceCompany be null even though the contractor is ACTIVE?

Either the Insurance dataset enrichment was disabled (enrichInsurance: false), the contractor's insurance record hasn't been refreshed on data.wa.gov yet, or the contractor is in a category that doesn't require L&I to track insurance. For mission-critical verification, also check L&I's secure.lni.wa.gov/verify page for the same UBI.

Does the actor deduplicate?

Yes. Each licenseNumber is emitted at most once per run. For enrichment, the latest-effective-date insurance and bond record is selected per contractor; older history is not preserved in the output (use historical Apify dataset archives for diffing).

What's the UBI field for?

The Washington Unified Business Identifier is a state-wide cross-agency ID. It joins L&I contractor data to Department of Revenue tax records, Secretary of State business filings, and Department of Employment Security wage records.

Can I get historical snapshots of past license states?

Not directly — this actor returns current state. To build a history, schedule the actor daily and archive each Apify dataset run.

Does the actor work on the Apify Free Plan?

Yes — full functionality. A typical filtered run with full enrichment fits comfortably inside free-tier Compute Units.

Can I run this on a schedule, and which export formats are supported?

Yes — use Apify's built-in Scheduler for any cron expression. Exports: JSON, CSV, Excel (XLSX), HTML, XML, RSS, and JSON Lines — directly from the dataset view or API.

Does the dataset include cancelled/expired contractors?

Yes — set statuses: ["ACTIVE", "EXPIRED", "SUSPENDED", "RE-LICENSED", "CANCELLED"] (or an empty array) to include them. Useful for historical analysis, churn studies, and reconciliation passes.


If you need licensing data from other US states or related regulatory bodies, check these complementary actors:


Comparison vs. Alternatives

ApproachSetup timeJoined datasetsData freshnessCost (5K records)Bond + insuranceAudit log
This actor< 1 minute4 joinedLivepay-per-event (typically <$0.05)Built-inAutomatic
secure.lni.wa.gov/verify manual30s per lookup1 per pageLiveFree + laborManual tabsNone
Custom Socrata script4–8 hours devDIY joinLiveFree + infraDIYDIY
Paid contractor-data APIHours setupVariesReal-time$300–1500+/moSometimes
L&I public-records requestDaysAllStaleVariableYes

Why Pay-Per-Event Pricing?

Most data scrapers either bill a flat monthly subscription (you pay even if you don't run) or per-Compute-Unit (hard to predict). This actor uses pay-per-event pricing, which means:

  • You only pay when the actor runs
  • Charges scale with how much data you actually consume
  • Transparent, line-item billing inside Apify
  • No monthly minimums
  • Free to evaluate — sample with maxRecords: 50 for pennies

Changelog

VersionDateNotes
1.0.02026-05Initial public release — Socrata SODA API, 4-dataset join (General + Insurance + Bond + Principal), specialty + city + status + date filters, pay-per-event pricing

Keywords

Washington L&I scraper · Washington contractor license lookup · WA L&I contractor data · Seattle contractor verification · L&I bond status · WA contractor infraction data · Washington general specialty contractor lookup · data.wa.gov Socrata contractor API · WA Department of Labor and Industries scraper · WA construction contractor data extraction · Washington general contractor database · Washington electrical contractor registry · Washington roofing contractor list · WA HVAC contractor data · WA plumbing contractor lookup · UBI lookup Washington · Washington surety bond lookup · WA contractor insurance verification · Washington contractor compliance API · Seattle GC lead generation · Tacoma contractor list · Spokane contractor lookup · Bellevue subcontractor verification · Vancouver WA contractor data · Everett construction contractor data · Kent WA roofing contractor data · Renton WA HVAC contractor leads · Washington contractor CRM enrichment · WA construction industry data · L&I license verification automation · WA contractor B2B leads · Washington construction prospecting · WA contractor underwriting data · contractor bond impaired lookup · Washington L&I open data scraper · Apify Washington contractor actor · WA construction defect attorney data · WA contractor due diligence · L&I principal owner lookup · Washington contractor recruiting data · WA subcontractor vetting · Washington construction permit cross reference


Support

  • Bug reports: Use the Issues tab on the Apify Store page
  • Feature requests: Same place — please describe your use case so we can prioritise
  • Direct contact: Through the Apify developer profile

If this actor saves you time on Washington contractor data, a 5-star rating on the Apify Store helps other compliance, construction, and underwriting teams discover it. Thank you!