North Carolina Plumbing & HVAC Contractor Leads avatar

North Carolina Plumbing & HVAC Contractor Leads

Pricing

from $1.92 / 1,000 item extracteds

Go to Apify Store
North Carolina Plumbing & HVAC Contractor Leads

North Carolina Plumbing & HVAC Contractor Leads

Search the official North Carolina plumbing, heating, and fire-sprinkler contractor registry and export public license, business, contact, classification, and query-provenance records.

Pricing

from $1.92 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Build repeatable North Carolina plumbing HVAC contractor leads lists from the official State Board of Examiners of Plumbing, Heating & Fire Sprinkler Contractors registry.

Search by company name, North Carolina city, or exact license account number. Each result combines the board's search identity with its public license detail: account number, record type, contact or business, address, phone, expiration date, active classifications, classification holders, query provenance, and retrieval time.

This Actor is designed for targeted, recurring prospect-list refreshes. It does not claim an unbounded statewide roster export.

What can you do with this Actor?

  • Build a call list of licensed plumbing businesses containing a company keyword.
  • Find HVAC contractors in a city and filter them by an active heating classification.
  • Verify an exact North Carolina license account before onboarding a vendor.
  • Refresh the same search on a schedule and compare datasets downstream.
  • Send structured rows to Google Sheets, Airtable, a CRM, a data warehouse, or your own API.

Who is it for?

Trade suppliers can identify licensed plumbing and HVAC businesses in a sales territory.

Contractor software teams can build a focused, license-backed prospect list instead of relying only on general directories.

Compliance and procurement teams can verify the public record attached to a known license number.

Market researchers can compare official business identities and active classifications across targeted cities or company-name searches.

Why use the official North Carolina registry?

The Actor reads public.nclicensing.org, the public portal of the North Carolina board for plumbing, heating, and fire-sprinkler contractors.

That gives every row clear source provenance. It also exposes fields that a general business directory may omit, including the board account type, expiration date, active license classifications, and named classification holders.

The portal is an operational public service and can be intermittent. The Actor uses a coherent US proxy session, bootstrap cookies, bounded retries, and conservative detail concurrency. It fails rather than silently returning a challenge page as an empty result.

Data extracted

FieldMeaning
accountNumberOfficial board license account number, such as L.00327
recordTypeBoard account type, such as License or Sub-License
ownerOrBusinessNameIdentity displayed in the board's result table
contactNamePublic contact name from the detail record
companyNamePublic company name from the detail record
addressPublic mailing address displayed by the board
phonePublic phone number displayed by the board
expirationDateExpiration date in the board's displayed format
activeClassificationsCurrent classifications listed in the active-classifications section
classificationHoldersPublic holder name and classification strings
queryTypeWhether company, city, or license search found the record
queryValueExact input value that found the record
classificationFiltersDetail-level classification filters applied by the run
sourceUrlOfficial registry search URL
retrievedAtISO 8601 time at which the run retrieved records

Fields may be null when the board does not publish that value for an account. Arrays are empty when no corresponding values are displayed.

Getting started

  1. Open the Actor input.
  2. Add at least one company name, city, or license number.
  3. Optionally add active-classification phrases such as Plumbing Class I or Heating Group 3.
  4. Set the maximum number of matching records.
  5. Keep the recommended residential US proxy unless you have tested another route.
  6. Click Start.
  7. Open the Dataset tab to download JSON, CSV, Excel, XML, or another supported Apify format.

A useful first run is:

{
"companyNames": ["plumbing"],
"maxItems": 10
}

Input parameters

Search fields

companyNames is a list of terms sent to the board's company-name field. The source performs a containing-name search.

cities is a list of North Carolina mailing-address cities. Use names such as Raleigh, Charlotte, or Durham.

licenseNumbers is a list of exact account numbers. Both L.00327 and 00327 are accepted.

At least one value across these three fields is required. Up to 50 combined search values are accepted in one run.

Detail filtering

classifications is an optional list of case-insensitive phrases. A record is kept when at least one active classification contains one of the phrases.

For example, Heating Group 3 matches both Class I and Class II Heating Group 3 contractor records.

Classification filtering occurs against the public detail record, not against guessed words in a company name.

Limits and connection

maxItems defaults to 100 and can be set from 1 to 5,000.

maxConcurrency defaults to 4 and can be set from 1 to 10. Conservative values reduce pressure on the official portal.

proxyConfiguration defaults to Apify Residential Proxy in the United States. Disabling it may work from some networks, but the portal intermittently rejects or fails repeated connections from others.

Output example

A real current-source shape, with the public identity shortened for documentation, looks like this:

{
"accountNumber": "L.00327",
"recordType": "License",
"ownerOrBusinessName": "Donaldson Plumbing, Inc.",
"contactName": "Steven John Donaldson",
"companyName": "Donaldson Plumbing, Inc.",
"address": "3613 Cedar Bark Dr, Matthews, NC 28105",
"phone": "(704) 995-5669",
"expirationDate": "12/31/2026",
"activeClassifications": [
"Plumbing Class II Contractor"
],
"classificationHolders": [
"Steven John Donaldson: Plumbing Class II Contractor"
],
"queryType": "licenseNumber",
"queryValue": "L.00327",
"classificationFilters": [],
"sourceUrl": "https://public.nclicensing.org/Public/Search",
"retrievedAt": "2026-09-06T20:00:00.000Z"
}

The default dataset contains one row per unique account number accepted by the current run.

How much does it cost to export North Carolina contractor leads?

Pay-per-event pricing has a $0.005 Actor start fee plus a tiered charge for each contractor record saved to the dataset.

Current per-record prices are:

PlanPrice per saved contractor record
Free$0.00368
Bronze$0.00320
Silver$0.002496
Gold$0.00192
Platinum$0.00192
Diamond$0.00192

At Bronze rates, 10 saved records cost about $0.037, including the start fee. One hundred records cost about $0.325. Filters that reject a detail are not charged as output items.

Apify platform usage and proxy transfer are covered by the event prices rather than billed as a separate Actor event. Your Apify plan and platform terms still apply.

Reliable recurring prospect-list refreshes

Save one focused search as an Apify Task, then schedule it daily, weekly, or monthly.

A typical Raleigh HVAC input is:

{
"cities": ["Raleigh"],
"classifications": ["Heating Group 3"],
"maxItems": 100
}

Each row includes queryValue and retrievedAt, making it straightforward to compare run datasets in a warehouse or automation platform.

The Actor itself does not maintain a historical database, calculate changes, or send alerts. Use schedules plus downstream dataset comparison for those workflows.

Integrations and exports

Use Apify integrations to send completed datasets to Google Sheets, Make, Zapier, Slack, webhooks, or custom workflows.

For a CRM refresh:

  1. Schedule one task per territory or buyer segment.
  2. Use accountNumber as the stable source key.
  3. Upsert company, contact, phone, address, and classifications.
  4. Store retrievedAt as the source refresh timestamp.
  5. Review source changes before using them for compliance decisions.

For spreadsheet analysis, open the run dataset and choose CSV or Excel from the export controls.

Run through the API

Replace YOUR_APIFY_TOKEN with your token and keep it outside source control.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~north-carolina-plumbing-hvac-contractor-leads/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companyNames":["plumbing"],"maxItems":10}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor(
'automation-lab/north-carolina-plumbing-hvac-contractor-leads',
).call({ companyNames: ['plumbing'], maxItems: 10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor(
"automation-lab/north-carolina-plumbing-hvac-contractor-leads"
).call(run_input={"cities": ["Raleigh"], "maxItems": 25})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with MCP and AI assistants

Add the Actor to Claude Code through Apify MCP:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/north-carolina-plumbing-hvac-contractor-leads"

Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, and VS Code can use this equivalent MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/north-carolina-plumbing-hvac-contractor-leads"
}
}
}

Example prompts:

  • “Find up to 25 North Carolina plumbing businesses whose company name contains plumbing.”
  • “Verify license L.00327 and summarize its active classifications and expiration.”
  • “Export Raleigh records with an active Heating Group 3 classification.”

Limits and failure behavior

  • The Actor searches company name, city, or exact license account number; it does not perform an unbounded statewide sweep.
  • City matches use the address data and behavior of the official portal.
  • Classification filtering requires detail requests and can inspect more candidates than the final saved count.
  • The registry may contain masked, historical, incomplete, or missing values.
  • Expiration and classification values are reported as displayed; the Actor does not provide legal conclusions.
  • The upstream portal can be slow or unavailable. Transient requests are retried three times with bounded backoff.
  • A rejected input, challenge page, or exhausted upstream failure makes the run fail instead of returning a misleading successful empty dataset.
  • A legitimate no-match search completes successfully with zero dataset rows.

Responsible use and legality

This Actor accesses publicly displayed government licensing information. Public availability does not remove your responsibilities.

Follow applicable laws, the source site's terms, Apify's terms, privacy rules, outreach rules, and anti-spam requirements. Collect only data needed for a legitimate purpose. Secure exported contact data, limit retention, honor applicable requests, and verify important licensing decisions directly with the board.

The Actor is an independent automation tool and is not affiliated with or endorsed by the North Carolina licensing board.

FAQ and troubleshooting

Why did my run return no records?

Check spelling and try a broader company term. Confirm that the city is the mailing-address city used by the board. Remove classification filters to see whether the search found candidates that simply lacked your requested active classification.

Why did my run fail on a connection error?

Keep the default US residential proxy and reduce maxConcurrency. The official portal can be intermittent. The Actor already retries transient failures; repeated exhaustion usually means the source is temporarily unavailable.

Why is a public field null?

Different account types expose different details. Null means that the corresponding value was not displayed in the parsed public detail record.

Does the Actor enrich emails or websites?

No. It returns fields published by the official registry. It does not crawl business websites or infer contact details.

Can it monitor changes automatically?

The Actor returns current rows and provenance. Create a scheduled Task and compare datasets downstream; built-in history and alerts are not claimed.

These are separate sources and professions; use the Actor matching the official registry you need.