Contractor License Leads — Licensed US Contractors avatar

Contractor License Leads — Licensed US Contractors

Pricing

from $100.00 / 1,000 lead returneds

Go to Apify Store
Contractor License Leads — Licensed US Contractors

Contractor License Leads — Licensed US Contractors

Licensed US contractor leads — name, phone, specialty/trade and license status from official state open-data sources. For building-supply, SaaS and B2B sales targeting active contractors.

Pricing

from $100.00 / 1,000 lead returneds

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Extract licensed US contractor records from official state open-data sources and convert them into structured construction B2B lead data. Each run returns lead records with business name, principal, phone, address, specialty/trade, license type, license status, and license dates, filterable by state, city, and trade specialty (roofing, electrical, plumbing, HVAC, general contractors).

Built for building-supply, SaaS and B2B sales teams targeting active contractors, contractor insurance & bonding lead generation, construction field-service software customer acquisition, fuel & fleet services targeting contractor fleets, and recruiting/staffing for construction trades.

Supported states

StateSourceMethod
WAWashington L&I "Verify a Contractor"Playwright (JS-rendered search)
CACSLB CheckLicenseIIPlaywright (ZIP-prefix search + detail pages)
TXTDLR LicenseSearchCheerio (classic ASP form POST)

More states are added over time as adapters are built. Pass an empty states array to scrape all supported states in one run.

Use cases

  • Building-material and equipment suppliers targeting licensed contractors.
  • Contractor insurance and bonding lead generation.
  • Construction and field-service software customer acquisition.
  • Fuel and fleet services targeting contractor fleets.
  • Recruiting and staffing for construction trades.
  • B2B sales outreach to licensed contractors by specialty and location.

Input parameters

FieldTypeDefaultDescription
statesarray["WA"]2-letter state codes. Empty = all supported states.
active_onlybooleantrueOnly currently active contractor licenses.
citiesarray[]Optional city filter (case-insensitive).
specialtiesarray[]Trade keyword filter (roofing, electrical, plumbing, HVAC, general).
max_per_stateinteger1000Max leads per state. Use 50 for a quick test.
include_rawbooleanfalseAttach the raw source record to each lead.

Output fields

FieldTypeDescription
business_namestringLicensed business or contractor name.
business_typestring|nullEntity type (LLC, Corporation, etc.) when published.
principal_namestring|nullQualifying individual / owner, when published.
phonestring|nullBusiness phone number.
addressstring|nullFull street address.
citystring|nullCity parsed from the source address.
regionstring|nullCounty or region, when available.
statestring2-letter US state code.
zipstring|nullZIP code parsed from the source address.
specialtystring|nullTrade, classification, or specialty description.
license_numberstringOfficial state license number.
license_typestring|nullLicense class or program label.
statusstringNormalized: Active, Expired, Suspended, Revoked, Inactive, Canceled.
effective_datestring|nullISO 8601 (YYYY-MM-DD).
expiration_datestring|nullISO 8601 (YYYY-MM-DD).
detected_atstringISO 8601 scrape timestamp.
source_urlstringState authority page or API endpoint.
rawobject|nullOriginal source record (only when include_raw is enabled).

Pricing

This Actor is paid per event:

  • Actor Start: $0.20 per event (one event per GB of memory, minimum one).
  • Lead returned: $0.10 per lead record returned to the dataset.

Example: a run returning 200 leads costs $0.20 (start) + $20.00 (leads) = $20.20.

Architecture

Per-state adapter modules each pick the best source for their state (bulk open-data download vs scraping the search UI) and emit normalized LeadRecords via an async generator. The orchestrator applies client-side filters (active_only, cities, specialties), charges one PPE event per surviving record, and pushes to the dataset.

src/
├── main.ts # orchestrator
├── types.ts # shared types (LeadRecord, LeadFilters, StateAdapter)
├── utils.ts # normalize, charge, filter helpers
└── adapters/
├── index.ts # state registry
├── wa.ts # WA L&I (Playwright)
├── ca.ts # CA CSLB (Playwright)
└── tx.ts # TX TDLR (Cheerio)

To add a state, create src/adapters/xx.ts exporting an adapter object and add it to the registry in src/adapters/index.ts.

Example input

Quick test (50 WA leads):

{ "states": ["WA"], "max_per_state": 50 }

HVAC contractors across all supported states:

{ "states": [], "specialties": ["HVAC", "air conditioning"], "active_only": true, "max_per_state": 500 }

Run locally

npm install
npm run dev # or: npm run build && npm start

Deploy

apify login
apify push -f -w 120

First publish gotcha: the first time you publish, Apify returns a store-terms-not-accepted error. Open the Apify Console → your actor → Publication and accept the Store Terms once manually. After that, all future pushes work without this step.