North Carolina Contractor License Lookup Scraper avatar

North Carolina Contractor License Lookup Scraper

Pricing

from $0.02 / 1,000 item extracteds

Go to Apify Store
North Carolina Contractor License Lookup Scraper

North Carolina Contractor License Lookup Scraper

Search public NCLBGC contractor records by license, qualifier, company, person, classification, phone, or address. Export status, validity, dates, limitation, classifications, address, and phone.

Pricing

from $0.02 / 1,000 item extracteds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

12 days ago

Last modified

Categories

Share

Search the official public North Carolina Licensing Board for General Contractors (NCLBGC) registry and export structured contractor, license, and qualifier records.

Use it to verify a license before onboarding a contractor, create a territory list, or monitor public status and expiration data without manually opening each result.

The Actor uses the anonymous NCLBGC search and detail pages. It does not require a board account, browser, CAPTCHA solver, or proxy.

What does this Actor do?

The Actor submits one or more searches to the public NCLBGC portal.

For every unique match, it opens the public detail record and returns:

  • contractor, company, or qualifier name;
  • license or account number;
  • account type;
  • active and validity signals;
  • public status;
  • public address and phone;
  • source-formatted and ISO first-issued/expiration dates;
  • expiration state and UTC calendar days remaining;
  • license limitation;
  • active classifications;
  • source and detail references.

Blank fields from the board remain null rather than being guessed.

Who is it for?

Procurement and compliance teams can verify contractors before onboarding or renewal.

General contractors and property teams can check subcontractor license status.

Insurance and supplier teams can build state-specific contractor prospect lists.

Construction sales teams can search by company, classification, or geography.

Analysts can schedule recurring searches and compare snapshots for public status or expiration changes.

Why use this NCLBGC lookup?

  • Uses the official public NCLBGC source.
  • Supports the fields exposed by the board's advanced search form.
  • Fetches detail records instead of returning only names from the result table.
  • Deduplicates overlapping searches by account number.
  • Stops at a user-defined record limit.
  • Uses conservative HTTP concurrency.
  • Produces JSON, CSV, Excel, XML, RSS, or HTML through Apify datasets.
  • Works with schedules, webhooks, API clients, and MCP tools.

The Actor reports what the public registry displayed at extraction time. It is not a substitute for legal advice or a certified license document.

What data can you extract?

FieldMeaning
nameContractor, company, instructor, or qualifier name
accountNumberNCLBGC license/account number
accountTypeRegistry account type
isActiveSearch row was not marked “License Not Active”
isValidValidity derived from the detailed status, or null if inconclusive
statusFull normalized public status
addressPublic contact address, or null
phonePublic phone, or null
firstIssuedDateFirst-issued date shown by NCLBGC
firstIssuedDateIsoStrictly parsed first-issued date as YYYY-MM-DD, or null
expirationDateExpiration date shown by NCLBGC, or null
expirationDateIsoStrictly parsed expiration date as YYYY-MM-DD, or null
isExpiredWhether expiration is before the UTC scrape date, or null
daysUntilExpirationUTC calendar days until expiration (negative after expiration), or null
limitationLimited, Intermediate, Unlimited, or another displayed limitation
classificationsActive classifications listed on the detail page
searchNormalized filters that produced the record
sourceUrlOfficial NCLBGC search page
detailUrlOfficial detail reference used for extraction
scrapedAtISO 8601 extraction timestamp

How to search North Carolina contractor licenses

  1. Open the Actor input page.
  2. Paste one or more values into License numbers or Company names for a quick batch, or add objects to Advanced searches.
  3. Put at least one filter in every advanced search object.
  4. Optionally enable Active licenses only or set a per-search result cap.
  5. Choose a maximum number of records for the whole run.
  6. Keep detail concurrency at the default unless you have a specific reason to change it.
  7. Click Start.
  8. Open the License records dataset view.
  9. Export the records or connect them to your workflow.

A license-number lookup is the fastest way to verify known records. Paste them into the list input or submit them directly:

{
"licenseNumbers": ["01060", "L.01060", "12345"],
"maxItems": 10
}

01060 and L.01060 normalize to one lookup. The existing advanced input remains supported:

{
"searches": [{ "licenseNumber": "01060" }],
"maxItems": 5
}

Input parameters

Provide at least one effective search across licenseNumbers, companyNames, and searches. Blank quick-list entries are ignored, and a run can contain at most 50 effective searches.

licenseNumbers

Optional list of known license numbers. An optional L. prefix is accepted. Exact normalized duplicates are looked up once.

companyNames

Optional list of company or trade names. Every nonblank unique normalized value becomes a separate company-name search; names are never guessed to be people.

searches

Optional array of advanced search objects. Fields within one object are combined by NCLBGC. Different objects are separate searches.

Supported fields:

  • classificationId
  • licenseNumber
  • qualifierNumber
  • companyName
  • firstName
  • lastName
  • phoneNumber
  • streetAddress
  • postalCode
  • city
  • stateCode
  • includeSoundex

Common NCLBGC classification IDs include 27 for Building and 28 for Residential. The board controls this identifier list and can change it.

activeOnly

When true, the Actor skips search rows marked License Not Active before requesting their details. Default: false.

maxItems

Maximum unique records across all searches. Default: 100. Maximum: 10,000.

maxItemsPerSearch

Optional maximum unique candidates contributed by each quick or advanced search. Use it to keep one broad search from consuming the global maxItems allowance before later searches run. Allowed range: 1–10,000.

maxConcurrency

Number of simultaneous detail requests. Default: 5. Allowed range: 1–10.

Example output

This abbreviated real-source shape shows how blank NCLBGC values are represented:

{
"name": "J. Addison Smith",
"accountNumber": "L.01060",
"accountType": "License",
"isActive": false,
"isValid": false,
"status": "Archived - License Not Valid",
"address": "1201 Asheboro Street Greensboro, NC",
"phone": null,
"firstIssuedDate": "02/25/1936",
"firstIssuedDateIso": "1936-02-25",
"expirationDate": null,
"expirationDateIso": null,
"isExpired": null,
"daysUntilExpiration": null,
"limitation": "Intermediate",
"classifications": ["Building"],
"sourceUrl": "https://portal.nclbgc.org/Public/Search",
"scrapedAt": "2026-01-15T12:00:00.000Z"
}

The default dataset contains one object per unique account.

How much does it cost to look up North Carolina contractor licenses?

Pricing has two events:

  • Start: $0.005 once per run.
  • Item extracted: tiered from $0.000041071 per record on FREE to $0.00001 on DIAMOND.

At the FREE tier, excluding Apify platform plan allowances:

  • 1 returned record costs about $0.00504 including the start event;
  • 100 returned records cost about $0.0091 including the start event;
  • 1,000 returned records cost about $0.0461 including the start event.

Empty searches incur only the start event. Duplicate rows and records filtered out by activeOnly are not charged as extracted items. Apify shows the applicable tier and maximum charge before a run.

Monitoring and automation workflows

Contractor onboarding

Search by license number and store the returned status, expiration, limitation, and classifications with the vendor record.

Renewal monitoring

Schedule the same set of license searches weekly or monthly. Send the dataset to a webhook and compare status or expirationDateIso with the previous snapshot. Use daysUntilExpiration for thresholds such as 90-, 60-, or 30-day alerts, and isExpired for already-expired records. These derivatives are null when NCLBGC omits the date or returns an invalid format.

Territory lead building

Combine a classification with city, ZIP code, or address filters. Export active records to CSV or a CRM.

Qualifier research

Use qualifierNumber, first name, or last name to search the qualifier records exposed by the board's public search.

Limits and failure behavior

The source is a live public government portal. Availability and HTML structure are controlled by NCLBGC.

The Actor:

  • retries temporary network errors and HTTP 429/5xx responses up to three times;
  • fails rather than silently returning zero rows when the response shape is unrecognized;
  • treats a recognized no-result search as a successful zero-item result;
  • rejects empty search objects;
  • rejects malformed state, ZIP, license, and qualifier values;
  • caps detail concurrency at 10;
  • does not bypass access controls.

Searches that match many records can take longer because every accepted row receives a detail request. Use narrow filters and a practical maxItems value.

Tips for better results

  • Remove an L. prefix or leave it in; the Actor normalizes either form.
  • Use the exact numeric license number for verification.
  • Search company names without corporate suffixes if an exact query is too narrow.
  • Enable includeSoundex for person-name spelling variants.
  • Use activeOnly to avoid detail requests for visibly inactive search rows.
  • Combine city with classification for focused lists.
  • Use simple license/company lists or multiple advanced search objects when you need OR-style searches.
  • Set maxItemsPerSearch for fairer mixed batches while retaining maxItems as the global ceiling.
  • Expect phone, expiration, and expiration-derivative values to be null when NCLBGC leaves the source field blank.

Use the Actor through the API

Replace YOUR_APIFY_TOKEN with your token.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~north-carolina-contractor-license-lookup-scraper/runs?token=YOUR_APIFY_TOKEN&waitForFinish=300" \
-H "Content-Type: application/json" \
-d '{"searches":[{"companyName":"Smith"}],"activeOnly":true,"maxItems":20}'

Fetch items from the defaultDatasetId returned by the run.

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor(
'automation-lab/north-carolina-contractor-license-lookup-scraper'
).call({
searches: [{ licenseNumber: '01060' }],
maxItems: 5,
});
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-contractor-license-lookup-scraper"
).call(run_input={
"searches": [{"classificationId": "28", "city": "Raleigh"}],
"activeOnly": True,
"maxItems": 100,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use with MCP and AI agents

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/north-carolina-contractor-license-lookup-scraper"

Claude Desktop

Add this server to the mcpServers object in your Claude Desktop configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/north-carolina-contractor-license-lookup-scraper"
}
}
}

Cursor

Open Cursor MCP settings and add the same apify server JSON above as a remote HTTP MCP server.

VS Code

Open VS Code MCP settings, create an HTTP server named apify, and use the same https://mcp.apify.com?tools=automation-lab/north-carolina-contractor-license-lookup-scraper URL.

Example prompts:

  • “Verify NCLBGC license 01060 and summarize its public status.”
  • “Find up to 50 active Residential contractor records in Raleigh.”
  • “Export active Smith contractor records with classifications and expiration dates.”

Integrations

Use Apify integrations to send results to:

  • Google Sheets;
  • webhooks;
  • Make;
  • Zapier;
  • Slack;
  • a database or data warehouse;
  • an internal procurement or CRM system.

For monitoring, schedule the Actor and use a webhook after successful runs. Store accountNumber as the stable comparison key.

Responsible use and legality

This Actor accesses public information displayed by NCLBGC. It is independently operated and is not affiliated with, endorsed by, or certified by NCLBGC. It uses deterministic direct HTTP extraction and does not send inputs or records to an AI model.

You are responsible for your use of the data and for complying with applicable laws, source terms, privacy obligations, and anti-discrimination rules.

Do not use public license data for harassment, spam, identity theft, or unlawful eligibility decisions. Minimize retention of contact information and secure exported datasets. The Actor creates no external cache; run datasets and logs follow your Apify account retention settings and can be deleted with Apify storage controls.

Always confirm high-stakes decisions with the official board or an authoritative certificate.

Troubleshooting

Why did the run return zero records?

The board may have no match for the combined filters. Try a license number without punctuation, remove a corporate suffix, or split combined filters into separate search objects.

Why is a field null?

NCLBGC sometimes leaves phone, expiration, address, or other detail fields blank. The Actor preserves that absence instead of inventing a value.

Why did the Actor fail instead of returning an empty dataset?

The Actor fails when NCLBGC returns an unexpected page, persistent server error, or changed markup. This protects downstream workflows from treating a blocked or broken response as a genuine no-result search.

Is isActive the same as isValid?

No. isActive comes from the search-row marker. isValid is derived from the detailed status. Use status for the full source wording.

FAQ

Does it need an NCLBGC login?

No. It uses the anonymous public search.

Does it use a browser or proxy?

No. The current route is direct HTTP with a session cookie and Cheerio parsing.

Can it download every North Carolina license?

The product is a filtered lookup tool, not a guaranteed statewide bulk export. Use supported search filters and respect the 10,000-item run limit.

Can it monitor changes automatically?

Yes. Schedule repeated searches and compare datasets by accountNumber. The Actor itself does not maintain historical state.

Is the data real time?

It reflects what the public NCLBGC portal returned during the run. The board controls update timing.

Use separate state Actors when your compliance or lead workflow spans multiple licensing authorities.

Support

If a run fails, include the run URL and a redacted version of the input. Do not post private credentials or non-public personal data.

Source fields and classifications can change when NCLBGC updates its portal.