North Carolina Plumbing & HVAC Contractor Leads Scraper
Pricing
from $4.00 / 1,000 license-verified contractor leads
North Carolina Plumbing & HVAC Contractor Leads Scraper
Scrape license-verified plumbing, HVAC & fire-sprinkler contractor leads from North Carolina's state licensing board — company, license number, active classifications, expiry, address, phone, classification holders, and technician-employer links. 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
License-verified plumbing, heating & fire-sprinkler leads, straight from the state board. Every row is pulled live from the North Carolina State Board of Examiners of Plumbing, Heating & Fire Sprinkler Contractors public registry — company, license number, every active classification (plumbing, HVAC groups, fuel piping, fire sprinkler), expiration date, mailing address, phone, the named classification holders, and the employer behind each licensed technician. Sweep the whole state or target a city, classification, company, or license number. Opt-in contact-email finding turns registry records into outreach-ready leads. JSON or CSV out, billed per lead.
How it works

✨ Why use this scraper?
- License-verified, not directory-scraped — every lead comes from the board's own registry, so license number, classifications, and expiry are authoritative at scrape time.
- All 24 classifications, cleanly filterable — Plumbing Class I/II, Heating Groups 1–3 (contractor + technician), Fuel Piping, and Fire Sprinkler lines, each selectable in the input. Multi-classification shops arrive as one row with the full list.
- People included — each row carries its classification holders (the named individuals the license stands on), and technician Sub-Licenses resolve their employer (parent licensee + firm + license number).
- Active-only by default — records with no active classifications are dropped before you pay for them.
- Full-state sweep built in — run it empty and it walks a bundled list of ~1,500 NC place names, metro areas first. No URL hunting.
- Opt-in contact emails — the actor discovers each business's own website (search + directory filtering + name-match guard) and harvests a contact email from it. You're only charged when an email is actually found.
- New-license monitoring — flip
monitoringModeon a schedule and each run returns only contractors licensed since your last run. - Zero setup — US residential proxy is built in; the registry is public, no login or CAPTCHA involved.
🎯 Use cases
| Who | What they do with it |
|---|---|
| HVAC & plumbing suppliers | Build call lists of active licensed contractors by city and classification — with phone, address, and the holder names to ask for |
| SaaS & fintech selling to trades | Feed license-verified accounts into outbound; enrichEmails + qualifyByPayment qualify who can actually buy online |
| Insurance, bonding & lending | Verify license standing and expiration before quoting |
| Recruiters | Map every licensed technician in a metro — each Sub-License row links to its employing firm |
| GCs & developers | Verify subs' licenses in bulk from a license-number list before award |
📥 Supported inputs
| Mode | Input | Behaviour |
|---|---|---|
| Full-state sweep (default) | (empty input) | Walks the bundled NC place list, biggest cities first |
| City sweep | cities: ["Charlotte", "Raleigh"] | Matches the licensee's mailing-address city |
| Classification filter | classifications: ["Plumbing Class I Contractor"] | Searched board-side per city, then re-checked on each license |
| Company search | companyNames: ["plumbing"] | Board-side substring match on company name |
| Name search | lastName (+ optional firstName) | License-holder name lookup |
| License lookup | licenseNumbers: ["L.01098", "S.01622"] | Direct verification; accepts full numbers or bare digits |
| Phone lookup | phoneNumber | Phone number on record |
Not supported: other states or boards, NC electrical licenses (separate board — see the matching NC Electrical Contractor Leads Scraper), NC general contractors (NCLBGC).
🔄 How it works
- Builds search jobs from your criteria — or the full-state city list when the input is empty. A classification filter multiplies into city × classification queries, because this board's search results don't label classifications.
- Queries the board's live roster for each job and parses the result rows.
- Filters licenses with no active classifications (default), unwanted classifications, and duplicates — before any per-lead fetching.
- Fetches each license's detail record — company, contact, address, phone, expiry, active classifications, classification holders — and, for Sub-License technicians, the parent employer record.
- Optionally enriches: discovers the business's own website and scrapes a contact email;
qualifyByPaymentadditionally detects Stripe/e-commerce signals. - Pushes one row per license to the dataset — holders, classifications, and enrichment merged inline.
⚙️ Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
cities | array | [] → full sweep | NC mailing-address cities |
classifications | array | [] → all | Any of the board's 24 classifications (label, fragment like plumbing class i, or numeric code) |
activeOnly | boolean | true | Keep only licenses with ≥1 active classification |
companyNames | array | — | Substring company-name searches |
lastName / firstName | string | — | License-holder name search |
licenseNumbers | array | — | Direct license lookups |
phoneNumber | string | — | Phone-number search |
enrichEmails | boolean | false | Website discovery + contact-email harvesting |
qualifyByPayment | boolean | false | Payment-processor detection (needs enrichEmails) |
monitoringMode | boolean | false | Only licenses not delivered on previous runs |
resetMonitoringState | boolean | false | One-shot: clear the monitoring baseline |
maxItems | integer | 500 | Hard cap on leads |
maxConcurrency | integer | 10 | Parallel detail fetches |
searchConcurrency | integer | 3 | Parallel roster searches |
📊 Output overview
One dataset row per license. The row merges the roster entry, the board's detail record, the classification holders, the parent employer (for Sub-Licenses), and (when enabled) email enrichment — no separate or padding rows. isActive reflects whether any classification is active, and searchCity records which sweep query surfaced the lead.
📦 Output sample
Real trimmed row from a live run:
{"type": "license-lead","stateCode": "NC","trade": "plumbing-hvac-fire-sprinkler","boardId": "ncphfsc","boardName": "North Carolina State Board of Examiners of Plumbing, Heating & Fire Sprinkler Contractors","licenseNumber": "L.01098","classificationCode": "L","classification": "Heating Group 1 - Class I Contractor","activeClassifications": ["Heating Group 1 - Class I Contractor","Heating Group 2 Contractor","Heating Group 3 - Class I Contractor","Plumbing Class I Contractor","Residential Fire Sprinkler Installation Contractor"],"accountType": "License","businessName": "P. C. Godfrey, Inc.","contactName": "Aaron Reid Ellis","dbaName": null,"licenseStatus": "Active","isActive": true,"expirationDate": "2026-12-31","phone": "(704) 622-6168","address": {"street": "1816 Rozzelles Ferry Rd","city": "Charlotte","state": "NC","zip": "28208","raw": "1816 Rozzelles Ferry Rd, Charlotte, NC 28208"},"searchCity": "Charlotte","classificationHolders": [{ "name": "Aaron Reid Ellis", "classification": "Heating Group 3 - Class I Contractor" }],"sourceUrl": "https://public.nclicensing.org/Public/Search","scrapedAt": "2026-07-24T06:02:11.101Z"}
Sub-License (technician) rows additionally carry the employer:
{"licenseNumber": "S.01622","accountType": "Sub-License","parentLicensees": [{ "licenseeName": "James Samuel Grahl", "licenseNumber": "L.28697", "status": "Active", "firm": "Embree-Reed, Incorporated" }]}
With enrichEmails: true, successful rows also carry contactEmail, contactWebsite, and the detailed emailEnrichment object.
🗂 Key output fields
| Group | Fields |
|---|---|
| License | licenseNumber, classification, activeClassifications[], classificationCode, accountType, licenseStatus, isActive, expirationDate |
| Business | businessName, contactName, dbaName, phone, address.{street,city,state,zip,raw} |
| People | classificationHolders[] — the named individuals behind the license; parentLicensees[] — a technician's employing firm(s) |
| Enrichment (opt-in) | contactEmail, contactWebsite, emailEnrichment, takesPayments, paymentProcessors, stripeLiveKey, paymentConfidence |
| Provenance | boardId, boardName, stateCode, trade, searchCity, sourceUrl, scrapedAt |
❓ FAQ
How complete is the full-state sweep? The board's search matches on each licensee's mailing-address city. The bundled sweep list covers ~1,500 NC municipalities, CDPs, and USPS alias spellings, so in-state coverage is effectively complete; out-of-state mailing addresses are only found via company/name/license searches.
How is "active" decided?
This board publishes no status field. A license is counted active when its Active Classifications list is non-empty — that's the board's own signal for a license in force. activeOnly: false returns records without active classifications too.
What's the difference between License and Sub-License rows?
License (L.*) accounts are the primary company/contractor licenses — the classic lead. Sub-License (S.*) accounts are individuals working under a licensee; their rows include parentLicensees naming the employing firm. Filter on accountType downstream if you only want companies.
What's the email hit rate?
Roughly a quarter to a third of active companies yield a verified contact email — many small trades shops have no website at all. You're only charged the email event when one is found; misses cost nothing. emailEnrichment.confidence and source let you filter.
Does monitoring mode re-charge for old leads?
No. monitoringMode remembers every license already delivered to your account and silently skips it on later runs. The first monitored run seeds the baseline.
Is this legal to scrape? The registry is a public government licensing record intended for license verification by the public. The actor accesses only those public pages, politely. See the Disclaimer below for your responsibilities.
💬 Support
- 🐛 Issues: the actor's Issues tab
- 💡 Feature requests: same place — concrete requests (new fields, other states, other trades) usually ship fast
- 📧 Direct: message via my Apify profile
🛠 Additional services
Need the same license-verified leads pipeline for another state or trade, a custom export, or a managed feed into your CRM? This actor is part of a per-state series built on a shared engine — new boards stamp out quickly. Reach out via my Apify profile.
🔎 Explore more scrapers
The matching NC Electrical Contractor Leads Scraper covers the state's electrical board. More lead-gen and directory actors: apify.com/memo23 — email finding & verification, business directories, real-estate, and job boards.
🤖 For AI Agents & LLM Apps
This actor is MCP-ready: call it from agent frameworks via the Apify MCP server, or hit it with a single API call and read the dataset as clean JSON. The row schema is stable and flat where it matters (licenseNumber, businessName, phone, address.city, isActive, activeClassifications), so it drops straight into RAG pipelines, lead-qualification agents, and compliance-check tools. Typical agent patterns: "verify this plumber's NC license" (pass licenseNumbers), "find active Plumbing Class I contractors in Raleigh with emails" (pass cities + classifications + enrichEmails), or a scheduled "alert me on newly licensed HVAC contractors" 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 Plumbing, Heating & Fire Sprinkler Contractors, the State of North Carolina, or any of their agencies or affiliates. All trademarks mentioned are the property of their respective owners.
The scraper accesses only the board's publicly available license-verification pages — no authenticated endpoints and no content behind a login. License data is a public record published for verification purposes; contact-email enrichment visits only the businesses' own public websites. 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
north carolina plumbing contractor leads, nc hvac contractor leads, nc plumbing license lookup, hvac license verification north carolina, fire sprinkler contractor list nc, licensed plumber database north carolina, nc mechanical contractor leads, plumbing hvac leads scraper, state licensing board scraper, contractor license verify api, home services leads scraper, hvac company email list, newly licensed contractors alerts, contractor license monitoring, charlotte plumbers list, raleigh hvac contractors, heating contractor database nc, fuel piping contractor list, apify contractor leads, b2b trades leads