North Carolina Contractor License Lookup Scraper avatar

North Carolina Contractor License Lookup Scraper

Pricing

Pay per event

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

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours 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;
  • first-issued and expiration dates;
  • 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
expirationDateExpiration date shown by NCLBGC, 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. Add one or more objects to Searches.
  3. Put at least one filter in every search object.
  4. Optionally enable Active licenses only.
  5. Choose a maximum number of records.
  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 one known record:

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

Input parameters

searches

Required array with 1–50 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.

maxConcurrency

Number of simultaneous detail requests. Default: 5. Allowed range: 110.

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",
"expirationDate": 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 expirationDate with the previous snapshot.

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 when the board exposes a qualifier relationship through its 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 multiple search objects when you need OR-style searches.
  • Expect phone or expiration values to be null when NCLBGC leaves them 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. 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.

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.