# North Carolina Electrical License Search (`automation-lab/north-carolina-electrical-license-search`) Actor

Search official NCBEEC records and export North Carolina electrical license status, classification, holder, expiration, and public contact fields.

- **URL**: https://apify.com/automation-lab/north-carolina-electrical-license-search.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.92 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## North Carolina Electrical License Search

Search the official North Carolina Board of Examiners of Electrical Contractors (NCBEEC) registry and export **North Carolina electrical licenses** as structured records. Verify a contractor by license number or find license holders by company, person, classification, city, ZIP code, address, or phone—without copying results by hand.

The Actor returns the board's public holder/business name, license number, electrical classification, detailed status, expiration date, address, phone, validity indicator, and verification provenance.

### What can you do with this Actor?

- Verify an electrical contractor before onboarding or dispatching work.
- Qualify license-backed electrician leads by location or classification.
- Export a regulator-sourced contractor list to a spreadsheet, CRM, or warehouse.
- Schedule the same query and compare datasets for recurring compliance checks.
- Keep a source detail URL and verification timestamp with every record.

### Who is it for?

Property managers can check vendors before assigning electrical work. General contractors and procurement teams can screen subcontractors. Compliance teams can repeat credential checks. Sales operations teams can build geographically or classification-targeted lists. Developers can integrate normalized NCBEEC results into internal tools.

This Actor is specifically for NCBEEC electrical licenses. For North Carolina general-contractor credentials, use [North Carolina Contractor License Lookup Scraper](https://apify.com/automation-lab/north-carolina-contractor-license-lookup-scraper).

### What data is extracted?

| Field | Description |
| --- | --- |
| `licenseNumber` | Official NCBEEC account/license number |
| `status` | Detailed board status, including invalid-status text when shown |
| `classification` | Intermediate, Limited, Unlimited, or a special restricted classification |
| `holderName` | Public license holder or business name |
| `expirationDate` | Expiration date shown by NCBEEC, or `null` |
| `licenseValid` | `true` for an active valid status, `false` for invalid/terminated/expired, otherwise `null` |
| `address`, `phone` | Public contact fields shown on the record, or `null` |
| `sourceDetailUrl` | Regulator detail endpoint used for verification |
| `scrapedAt` | UTC time when the record was retrieved |

### How to search North Carolina electrical licenses

1. Click **Try for free** in Apify Console.
2. Enter at least one filter. For a precise check, use `licenseNumber`; for discovery, use company, name, city, ZIP, or classification.
3. Set `activeOnly` if only currently valid detailed statuses should remain.
4. Set `maxItems` to control the maximum exported records.
5. Start the run and open the default dataset in table, JSON, CSV, Excel, or another supported format.

A useful first run is:

```json
{
  "licenseNumber": "34585",
  "maxItems": 5
}
```

### Input parameters

| Input | Type | Purpose |
| --- | --- | --- |
| `licenseNumber` | string | Search an NCBEEC account/license number |
| `companyName` | string | Partial holder or business name |
| `firstName`, `lastName` | string | Person-name filters |
| `phoneNumber` | string | Public phone filter |
| `streetAddress` | string | Public address filter |
| `postalCode` | string | Exactly five ZIP-code digits |
| `city`, `stateCode` | string | Location filters; state code is two letters |
| `classification` | enum | One official NCBEEC electrical classification |
| `useSoundex` | boolean | Ask NCBEEC to use similar-sounding person-name matching |
| `activeOnly` | boolean | Export only statuses identified as active and valid |
| `maxItems` | integer | Maximum exported licenses, from 1 to 1,000 |

At least one search filter is required. The Actor does not perform an unbounded statewide sweep without criteria.

### Output example

A current license-number search returns records in this shape:

```json
{
  "licenseNumber": "I.34585",
  "status": "Active",
  "classification": "Intermediate Classification License",
  "holderName": "Dubbe Electric, Inc.DBA: DBA: D.E.I. Electrical Contractors",
  "address": "10645 Co. Road 50 Cologne, MN 55322",
  "phone": "(952) 466-5937",
  "expirationDate": "06/27/2027",
  "licenseValid": true,
  "source": "North Carolina Board of Examiners of Electrical Contractors",
  "sourceSearchUrl": "https://arls-public.ncbeec.org/Public/Search",
  "sourceDetailUrl": "https://arls-public.ncbeec.org/Public/_ShowAccountDetails/?key=...&Source=Search",
  "scrapedAt": "2026-09-05T20:35:00.000Z"
}
```

Public fields vary by record. Missing address, phone, expiry, or status values are returned as `null`, not invented.

### How much does it cost to verify North Carolina electrical licenses?

Pay-per-event pricing consists of a **$0.005 start fee** and a tiered charge for each exported license. On the BRONZE tier, each license is **$0.0032**: about **$0.0082 for 1 record**, **$0.037 for 10**, or **$0.325 for 100**, including the start fee. Higher account tiers receive the lower per-item prices shown in Apify Console. Use narrow search criteria to keep exports focused.

Only records actually saved to the dataset are charged. Rejected or missing rows are not item events.

### Reliability, limits, and freshness

Data comes from the anonymous official NCBEEC public search and detail pages at run time. The Actor retries temporary transport and server errors twice, requests details in small batches, and fails rather than silently returning a misleading empty dataset when the expected source shape changes.

NCBEEC controls data content, availability, naming, and update timing. A broad query may match hundreds of historical or inactive licenses. `activeOnly` can require inspecting additional matches before reaching the requested saved-item limit, so targeted filters are faster. The maximum is 1,000 records per run.

### Recurring verification workflow

Create a Task with a stable city/classification or company query, schedule it weekly or monthly, and export each run's dataset. Compare `licenseNumber`, `status`, `expirationDate`, and `scrapedAt` in your warehouse or automation platform. The Actor provides snapshots; it does not itself send alerts or calculate changes between runs.

For lead qualification, search a city and classification, enable `activeOnly`, then send the resulting public business/contact records to your CRM. Treat a license result as one screening signal, not as a substitute for insurance, references, or regulator guidance.

### Integrations

- **Apify Tasks and Schedules:** save a license-number, company, city, or classification search as a Task, then run it weekly or monthly for a consistent verification snapshot.
- **Google Sheets or Microsoft Excel:** export the default dataset as CSV or XLSX, or use an Apify integration to refresh a contractor-screening sheet after each scheduled run.
- **CRMs and workflow automation:** connect Apify with Zapier, Make, or a webhook to send active public holder, classification, location, and phone fields into a lead-review workflow.
- **Warehouses and BI tools:** retrieve each run's dataset through the Apify API, load it into your warehouse, and compare license number, status, and expiration date over time.

The Actor produces regulator-sourced snapshots only. It does **not** calculate differences, maintain monitoring state, update third-party systems by itself, or send alerts; configure those steps in your scheduler, integration, or downstream application.

### API usage

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~north-carolina-electrical-license-search/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"licenseNumber":"34585","maxItems":5}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/north-carolina-electrical-license-search')
  .call({ city: 'Raleigh', classification: 'unlimited', activeOnly: true, maxItems: 25 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/north-carolina-electrical-license-search').call(
    run_input={'licenseNumber': '34585', 'maxItems': 5}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
```

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/north-carolina-electrical-license-search"
```

#### Claude Desktop, Cursor, and VS Code setup

Use this equivalent HTTP MCP configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/north-carolina-electrical-license-search"
    }
  }
}
```

Example prompts: “Verify NC electrical license 34585 and summarize its current status,” or “Find active Unlimited electrical license holders in Raleigh and return the first 20 as a table.”

### Legality and responsible use

NCBEEC exposes these records publicly for license verification. Use them lawfully, follow applicable terms and privacy rules, and collect only what your workflow needs. Do not use an exported row to imply endorsement by NCBEEC. Confirm critical decisions on the regulator's current record and follow applicable North Carolina contracting rules.

### Troubleshooting

**Why did the run reject my input?** Enter at least one filter. ZIP codes must be five digits, state codes two letters, and `maxItems` between 1 and 1,000.

**Why are many results inactive?** NCBEEC search includes historical licenses. Enable `activeOnly` or narrow the company, license, city, or classification filters.

**Why is a contact field null?** The source does not publish every contact field for every holder. The Actor preserves missing values as `null`.

**What if NCBEEC is unavailable?** Inspect the run log. Temporary errors are retried; persistent upstream errors fail the run so scheduled systems can detect the problem and retry later.

### FAQ

#### Is this an official NCBEEC product?

No. It is an independent automation tool that reads the official public registry and includes source provenance on every row.

#### Can it search by classification?

Yes. It supports all classifications exposed by the NCBEEC search form, including Intermediate, Limited, Unlimited, residential, and special restricted categories.

#### Does it enrich email addresses or private data?

No. It exports only the public license/contact fields shown by NCBEEC. No separate enrichment source is used.

#### Can I export CSV or Excel?

Yes. After the run, use Apify's dataset export formats or connect the dataset to your preferred integration.

### Related scrapers

- [North Carolina Contractor License Lookup Scraper](https://apify.com/automation-lab/north-carolina-contractor-license-lookup-scraper) — NCLBGC general-contractor and qualifier records.
- [California Contractor License Lookup](https://apify.com/automation-lab/california-contractor-license-lookup-v2) — California CSLB contractor credentials.
- [Texas TREC License Holder Search Scraper](https://apify.com/automation-lab/texas-trec-license-holder-search-scraper) — Texas real-estate license holder searches.

# Actor input Schema

## `licenseNumber` (type: `string`):

NCBEEC license/account number, such as L.34585.

## `companyName` (type: `string`):

Business or account-holder name. Partial names are supported.

## `firstName` (type: `string`):

License holder's first name.

## `lastName` (type: `string`):

License holder's last name.

## `phoneNumber` (type: `string`):

Public phone-number search filter.

## `streetAddress` (type: `string`):

Public street-address search filter.

## `postalCode` (type: `string`):

Five-digit ZIP code.

## `city` (type: `string`):

City in the public license address.

## `stateCode` (type: `string`):

Two-letter state code.

## `classification` (type: `string`):

Limit results to one NCBEEC electrical license classification.

## `useSoundex` (type: `boolean`):

Use the regulator's Soundex matching for person names.

## `activeOnly` (type: `boolean`):

Keep only records whose detailed status is valid and active.

## `maxItems` (type: `integer`):

Maximum number of matching license details to inspect and export.

## Actor input object example

```json
{
  "companyName": "electric",
  "useSoundex": false,
  "activeOnly": false,
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

API link to normalized NCBEEC license records in the overview dataset view.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companyName": "electric",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/north-carolina-electrical-license-search").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companyName": "electric",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/north-carolina-electrical-license-search").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyName": "electric",
  "maxItems": 10
}' |
apify call automation-lab/north-carolina-electrical-license-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/north-carolina-electrical-license-search"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/FarLKsmeDSYc9xHm7/builds/zBm7Icl7rQCpKhFau/openapi.json
