Contractor License Leads — US Contractors
Pricing
from $100.00 / 1,000 lead returneds
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
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
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
| State | Source | Method |
|---|---|---|
| WA | Washington L&I "Verify a Contractor" | Playwright (JS-rendered search) |
| CA | CSLB CheckLicenseII | Playwright (ZIP-prefix search + detail pages) |
| TX | TDLR LicenseSearch | Cheerio (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
| Field | Type | Default | Description |
|---|---|---|---|
states | array | ["WA"] | 2-letter state codes. Empty = all supported states. |
active_only | boolean | true | Only currently active contractor licenses. |
cities | array | [] | Optional city filter (case-insensitive). |
specialties | array | [] | Trade keyword filter (roofing, electrical, plumbing, HVAC, general). |
max_per_state | integer | 1000 | Max leads per state. Use 50 for a quick test. |
include_raw | boolean | false | Attach the raw source record to each lead. |
Output fields
| Field | Type | Description |
|---|---|---|
business_name | string | Licensed business or contractor name. |
business_type | string|null | Entity type (LLC, Corporation, etc.) when published. |
principal_name | string|null | Qualifying individual / owner, when published. |
phone | string|null | Business phone number. |
address | string|null | Full street address. |
city | string|null | City parsed from the source address. |
region | string|null | County or region, when available. |
state | string | 2-letter US state code. |
zip | string|null | ZIP code parsed from the source address. |
specialty | string|null | Trade, classification, or specialty description. |
license_number | string | Official state license number. |
license_type | string|null | License class or program label. |
status | string | Normalized: Active, Expired, Suspended, Revoked, Inactive, Canceled. |
effective_date | string|null | ISO 8601 (YYYY-MM-DD). |
expiration_date | string|null | ISO 8601 (YYYY-MM-DD). |
detected_at | string | ISO 8601 scrape timestamp. |
source_url | string | State authority page or API endpoint. |
raw | object|null | Original 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 installnpm run dev # or: npm run build && npm start
Deploy
apify loginapify push -f -w 120
First publish gotcha: the first time you publish, Apify returns a
store-terms-not-acceptederror. 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
- Open the Actor input page and choose a focused, valid target.
- Set a conservative result limit for the first run.
- Start the Actor and inspect the dataset for coverage and field availability.
- Export the results or connect the dataset to your downstream system.
- 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 areactive_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. Nspecialties— Optional filter: only return contractors whose specialty, classification, or license type contains one of these keywords (case-insensitive). Example: ["roofing", "electrical", "plumbing", "Hmax_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 recinclude_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);
Related Apify Actors
Use these dedicated tools when a neighboring data source or workflow is a better match:
- Texas State Licensed Contractor Scraper — TDLR License Data
- GreatSchools Scraper — Ratings, Scores & Demographics
- Instagram Followers & Following Scraper — With Cookies
- Facebook Ads Library Scraper — Meta Ad Intelligence Tool
- Leads Finder Pro - B2B Leads with Emails [Apollo Alternative]
- Yellow Pages US Scraper — Business Leads & Reviews
- Justia Lawyer Directory Scraper — Attorney Leads
- Yellow Pages Australia Scraper — Business Leads & Reviews
- OpenTable Restaurants, Ratings & Reviews Scraper
- Etsy Scraper Pro — Products, Prices, Reviews & Shop Data
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.
Is it legal to scrape this data?
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.