Contractor License Leads — US Contractors avatar

Contractor License Leads — US Contractors

Pricing

from $100.00 / 1,000 lead returneds

Go to Apify Store
Contractor License Leads — US Contractors

Contractor License Leads — US Contractors

Find licensed US contractors with license status, trade, company, location, contact, and public registry data for compliance and sales research.

Pricing

from $100.00 / 1,000 lead returneds

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

11 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.

What is Contractor License Leads?

Contractor License Leads turns the target data into structured, reusable results on Apify. Use it when you need repeatable collection for sales teams, agencies, recruiters, market researchers, and data-enrichment workflows without maintaining a custom scraper or one-off integration. Run it manually, schedule recurring jobs, call it through the Apify API, or connect it to an AI agent through the Apify MCP server.

The Actor stores results in an Apify dataset, where they can be previewed and exported as JSON, CSV, Excel, XML, or RSS. Availability and completeness depend on the source, supplied inputs, public visibility, authentication requirements, and upstream rate limits.

Use cases for Contractor License Leads

  • Build structured datasets for research, reporting, enrichment, or monitoring.
  • Automate repetitive collection with schedules, webhooks, and API calls.
  • Feed clean records into spreadsheets, databases, CRMs, BI tools, AI agents, or RAG pipelines.
  • Track changes over time by running the same validated input on a schedule.
  • Replace fragile manual copy-and-paste work with a reproducible Apify workflow.

How to use Contractor License Leads

  1. Open the Actor input page and choose a focused, valid target.
  2. Set a conservative result limit for the first run.
  3. Start the Actor and inspect the dataset for coverage and field availability.
  4. Export the results or connect the dataset to your downstream system.
  5. Scale gradually and use scheduling, pagination, or proxies when supported.

Important input options

  • states — Which US states to scrape contractor licenses from. Use 2-letter state codes (e.g. WA, CA, TX). Empty array = all currently supported states. More states are added over time as adapters are
  • active_only — When enabled (default), only currently active contractor licenses are returned. Disable to include expired, suspended, revoked, inactive or canceled licenses as well.
  • cities — Optional filter: only return contractors whose mailing or business city matches one of these values (case-insensitive). Example: ["Seattle", "Spokane"]. Leave empty for statewide coverage. N
  • specialties — Optional filter: only return contractors whose specialty, classification, or license type contains one of these keywords (case-insensitive). Example: ["roofing", "electrical", "plumbing", "H
  • max_per_state — Maximum number of leads to return per state. Default 1000. Set lower for a quick test (e.g. 50) and higher for production runs. The actor stops each state adapter once this many matching rec
  • include_raw — When enabled, each lead record includes a 'raw' field containing the original source record from the state authority, before normalization. Useful for auditing or accessing fields the normal

API and automation example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/contractor-license-leads').call({
// Add the same input fields you use in the Apify Console.
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Use these dedicated tools when a neighboring data source or workflow is a better match:

Frequently asked questions

How many results can I scrape with Contractor License Leads?

The practical total depends on the source, input limits, pagination, available records, run timeout, and upstream restrictions. Start with a small run, verify the output, and increase the limit gradually.

Can I integrate Contractor License Leads with other apps?

Yes. Use Apify integrations, webhooks, schedules, dataset exports, Make, Zapier, Google Sheets, cloud storage, or your own application.

Can I use Contractor License Leads with the Apify API?

Yes. Start runs with the Apify REST API or an official Apify client, then retrieve records from the run's default dataset. Keep your API token in a secret or environment variable.

Can I use Contractor License Leads through an MCP Server?

Yes. The Apify MCP server can expose the Actor to compatible AI clients and agents. Review the input and expected cost before allowing an autonomous workflow to run it at scale.

Do I need proxies?

It depends on the source and volume. Use the default configuration first. For larger or geographically sensitive jobs, select an appropriate proxy configuration only when the Actor supports it.

Scraping rules vary by source, jurisdiction, data type, and intended use. Collect only data you are authorized to access, respect applicable terms and privacy laws, and avoid restricted or personal data misuse. This documentation is not legal advice.

Your feedback

If a field is missing, a source layout has changed, or you need a supported use case documented, open an issue on the Actor page with a reproducible input and run ID.