US Contractor License Leads Scraper (Multi-State)
Pricing
from $4.00 / 1,000 license-verified contractor leads
US Contractor License Leads Scraper (Multi-State)
License-verified contractor leads across every US state board on the ARLS platform in one run — NC electrical, NC plumbing/HVAC, NC general contractors, and LA contractors (with board-published emails). Company, license #, class, status, expiry, address, phone. Full-state sweep or targeted search.
Pricing
from $4.00 / 1,000 license-verified contractor leads
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Every US state licensing board on the ARLS platform, in one run. Pull license-verified contractor leads across four state boards — NC electrical, NC plumbing/HVAC/fire-sprinkler, NC general contractors, and Louisiana contractors — from a single actor. Each row carries company, license number, classification, status, expiration, mailing address, phone, and (for Louisiana) the contractor's board-published email, tagged with the board it came from. Pick the boards you want or run all four; sweep whole states or target a city, classification, company, name, or license number. JSON or CSV out, billed per lead.
How it works

✨ Why use this scraper?
- Four boards, one job — instead of running four separate actors and stitching the output, pick any combination (or all) and get one merged,
boardId-tagged dataset. Perfect for agencies and multi-state outreach. - License-verified, not directory-scraped — every lead comes from the board's own registry, so license number, classification, status, and expiry are authoritative at scrape time.
- Louisiana emails come standard — LSLBC publishes each contractor's contact email on the record; those rows arrive outreach-ready with no enrichment. Optional
enrichEmailsrecovers emails for the other boards. - One shared budget —
maxItemsis total across boards, so "give me 500 leads across NC + LA" just works; boards run biggest-roster-first until the budget is spent. - Active-only by default — Expired / Terminated / Not Active records are dropped before you pay for them.
- Everything the per-state actors do — full-state sweeps, classification filters, company/name/license/phone search, qualifier & classification-holder people, technician→employer links (plumbing), and new-license monitoring — all through one engine.
- Zero setup — US residential proxy is built in; every board is a public registry, no login or CAPTCHA.
🗺 Boards covered
boardId | Board | State | Notable |
|---|---|---|---|
ncbeec | Board of Examiners of Electrical Contractors | NC | Qualifier decision-makers |
ncphfsc | Plumbing, Heating & Fire Sprinkler Contractors | NC | 24 classifications; technician→employer links |
nclbgc | Licensing Board for General Contractors | NC | 31 classifications; big roster |
lslbc | State Licensing Board for Contractors | LA | Board-published emails |
This is the complete current ARLS-platform contractor roster. New boards are added as configs the moment they appear.
🎯 Use cases
| Who | What they do with it |
|---|---|
| Suppliers & distributors | One call/email list of active licensed contractors across every covered state and trade |
| SaaS & fintech selling to trades | Feed license-verified accounts into outbound; qualifyByPayment flags who transacts online |
| Insurance, bonding & lending | Bulk-verify license status + expiration before quoting, across states |
| Agencies & data resellers | One run → a multi-state, board-labeled dataset to segment and deliver |
| GCs & developers | Verify subs' licenses in bulk from a license-number list against every board at once |
📥 Supported inputs
| Mode | Input | Behaviour |
|---|---|---|
| Board selection | boards: ["ncbeec", "lslbc"] | boardId, state code (NC → all NC boards), or trade fragment (electrical). Empty = all four |
| Full sweep (default) | (empty) | Each selected board sweeps its own state's city list |
| City sweep | cities: ["Charlotte", "New Orleans"] | Exact mailing-city match, applied to every selected board |
| Classification filter | classifications: ["residential"] | Resolved per board — matches whichever boards have it |
| Company / Name / License / Phone | companyNames, lastName, licenseNumbers, phoneNumber | Tried on every selected board |
🔄 How it works
- Resolves the board list from your
boardsselection (or all four). - Runs each board through one shared engine — the engine adapts per board (different form fields, active-detection, classification slicing, native-email parsing) from a single config, so all four run the same code path.
- Filters inactive licenses and duplicates per board before any detail fetch.
- Fetches each license's detail — company, address, phone, status, expiry, classifications, qualifiers/holders, and (LA) the board email.
- Optionally enriches rows without a board email (website + contact-email discovery).
- Pushes one merged dataset — one row per license, each tagged with
boardId,stateCode, andtrade, sharing onemaxItemsbudget.
⚙️ Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
boards | array | [] → all | Which boards to run (boardId / state / trade) |
cities | array | [] → full sweep | Mailing-address cities, applied to every board |
classifications | array | [] → all | Per-board classification filter (label / fragment / code) |
activeOnly | boolean | true | Drop licenses not in good standing before fetching |
companyNames / lastName / firstName / licenseNumbers / phoneNumber | — | — | Targeted searches, tried on every selected board |
enrichEmails | boolean | false | Website + email discovery for rows lacking a board email |
qualifyByPayment | boolean | false | Payment-processor detection (needs enrichEmails) |
monitoringMode | boolean | false | Only licenses not delivered on previous runs (tracked per board) |
maxItems | integer | 500 | Total lead cap, shared across boards |
maxConcurrency / searchConcurrency | integer | 10 / 3 | Parallel detail fetches / roster searches |
📊 Output overview
One row per license, merged into a single dataset regardless of how many boards ran. Every row carries boardId, stateCode, and trade so you can split or filter downstream. Fields that only some boards expose (boardEmail, parentLicensees, classificationHolders, qualifiers, activeClassifications) are present where the board provides them and null/empty elsewhere.
📦 Output sample
Real trimmed row from a live run (Louisiana — note the native boardEmail):
{"type": "license-lead","boardId": "lslbc","stateCode": "LA","trade": "contractor","boardName": "Louisiana State Licensing Board for Contractors","licenseNumber": "CL.00689","classification": "Commercial License Certificate","businessName": "CAMUS ELECTRIC CO., INC.","licenseStatus": "Active","isActive": true,"expirationDate": "2028-03-31","phone": "(318) 687-1420","boardEmail": "jwallace@camuselectric.com","contactEmail": "jwallace@camuselectric.com","address": { "street": "…", "city": "Shreveport", "state": "LA", "zip": "…", "raw": "…" },"qualifiers": [],"classificationHolders": [],"searchCity": "Shreveport","sourceUrl": "https://arlspublic.lslbc.louisiana.gov/Public/Search","scrapedAt": "2026-07-24T…"}
An NC general-contractor row instead carries qualifiers[] and activeClassifications[] (e.g. ["Building", "Residential"]); an NC plumbing row carries classificationHolders[] and, for technicians, parentLicensees[].
🗂 Key output fields
| Group | Fields |
|---|---|
| Provenance | boardId, boardName, stateCode, trade, searchCity, sourceUrl, scrapedAt |
| License | licenseNumber, classification, activeClassifications[], classificationCode, accountType, licenseStatus, statusNote, isActive, expirationDate |
| Business | businessName, contactName, dbaName, phone, boardEmail, contactEmail, address.{street,city,state,zip,raw} |
| People | qualifiers[], classificationHolders[], parentLicensees[] |
| Enrichment (opt-in) | contactWebsite, emailEnrichment, takesPayments, paymentProcessors, stripeLiveKey, paymentConfidence |
❓ FAQ
How is maxItems split across boards?
It's a single total budget. Boards run in registry order (NC electrical → NC plumbing → NC general → LA) until the budget is spent, so a small maxItems may not reach every board — raise it, or select specific boards, to guarantee coverage of the ones you care about.
Do all rows have an email?
Louisiana rows almost always do (boardEmail, published by the board). The other three boards don't publish emails — turn on enrichEmails to try to recover one from the business's website. contactEmail is always the best available (board email first, enriched second).
Should I use this or the single-state actors? Use this when you want multiple boards in one run or one dataset. If you only ever want one board, the dedicated per-state actors (NC Electrical, NC Plumbing & HVAC, Louisiana) are simpler.
Is this legal to scrape? Every board is a public government licensing registry intended for verification by the public. The actor accesses only those public pages, politely. See the Disclaimer.
💬 Support
- 🐛 Issues: the actor's Issues tab
- 💡 Feature requests: same place — new boards, states, and fields usually ship fast
- 📧 Direct: message via my Apify profile
🛠 Additional services
Need another state or trade board added, a custom export, or a managed feed into your CRM? New ARLS boards drop in as configs. Reach out via my Apify profile.
🔎 Explore more scrapers
Single-board versions: NC Electrical · NC Plumbing & HVAC · Louisiana. More lead-gen & directory actors: apify.com/memo23.
🤖 For AI Agents & LLM Apps
MCP-ready via the Apify MCP server, or hit it with one API call and read clean JSON. The row schema is stable and flat where it matters (boardId, licenseNumber, businessName, phone, contactEmail, address.city, isActive), so it drops into RAG pipelines, lead-qualification agents, and compliance checks. Agent patterns: "verify this contractor's license across NC and LA" (pass licenseNumbers), "active residential contractors in Charlotte and New Orleans with emails" (boards + cities + classifications + enrichEmails), or a scheduled "alert me on newly licensed contractors in any state" loop (monitoringMode).
⚠️ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the North Carolina State Board of Examiners of Electrical Contractors, the North Carolina State Board of Examiners of Plumbing, Heating & Fire Sprinkler Contractors, the North Carolina Licensing Board for General Contractors, the Louisiana State Licensing Board for Contractors, the States of North Carolina or Louisiana, or any of their agencies or affiliates. All trademarks are the property of their respective owners.
The scraper accesses only each board's publicly available license-verification pages — no authenticated endpoints and no content behind a login. License data, including any contact email a board publishes, is a public record provided for verification purposes. Users are responsible for ensuring their use complies with applicable law and regulation — including data-protection rules (GDPR, CCPA), telemarketing/e-mail regulations (TCPA, CAN-SPAM) when contacting leads, and any obligations of their own organisation.
SEO Keywords
us contractor license leads, multi-state contractor leads, contractor license lookup api, nc electrical contractor leads, nc plumbing hvac contractor leads, nc general contractor leads, louisiana contractor leads, contractor leads with email, state licensing board scraper, arls license verification, licensed contractor database, contractor license verify bulk, home services leads scraper, multi-board license scraper, newly licensed contractors alerts, contractor license monitoring, b2b construction leads, charlotte contractors, new orleans contractors, apify contractor leads