NC Licensing Board for General Contractors Scraper avatar

NC Licensing Board for General Contractors Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
NC Licensing Board for General Contractors Scraper

NC Licensing Board for General Contractors Scraper

Scrape NC Licensing Board (NCLBGC) general contractor licenses. Search by license number, company, qualifier, city or classification. Returns status, limitations, qualifiers, classifications and expiration data.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Haketa

Haketa

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

NC Licensing Board for General Contractors Scraper — NCLBGC Data Extractor for North Carolina Contractor License Lookup, Classifications, Qualifiers & Financial Limits

The most complete North Carolina contractor license data extraction tool on Apify. Pull structured records from the official NC Licensing Board for General Contractors (NCLBGC) public portal — by license number, company, qualifier, city, ZIP or classification — and get back status, financial limitation, classifications, primary qualifier, expiration dates and any disciplinary matters. Ready for compliance, sales prospecting, project bidding, M&A diligence and construction analytics.

Apify Actor


What This Actor Does

The NC Licensing Board for General Contractors Scraper is a production-ready Apify Actor that extracts contractor license records from the official North Carolina Licensing Board for General Contractors (NCLBGC) public portal at portal.nclbgc.org — the state regulator that licenses every general contractor doing business in North Carolina on projects of $30,000 or more.

In a single run, the actor performs license-number, company-name, qualifier-name, city, ZIP, and classification searches against the live NCLBGC portal, then navigates to each contractor's detail page (via authenticated AJAX endpoints) to collect the complete profile — including the financial limitation (Limited / Intermediate / Unlimited), all active classifications, the primary qualifier and qualifier ID, business address, phone, expiration and issue dates, plus any disciplinary actions on file.

Records returned include:

  • General contractor licenses — all license types (Limited / Intermediate / Unlimited)
  • Classifications — Building, Residential, Highway, Public Utilities and 25+ Specialty trades
  • Qualifiers — the individuals who passed NCLBGC exams on behalf of the license, including primary qualifier name and qualifier number
  • Limitations — the maximum project value the license is authorized for
  • Business profile — company name, DBA, street address, city, state, ZIP, phone
  • Status & dates — Active / Inactive / Archived, original issue date, current expiration date
  • Disciplinary matters — any public NCLBGC matters / hearings / consent orders on file

This is the fastest way to populate or refresh a North Carolina general contractor dataset for project bidding, prequalification, B2B sales, compliance, recruiting, insurance underwriting or research workflows — without writing your own ASP.NET MVC + jQuery AJAX scraper.

Why scrape NCLBGC yourself when this exists?

NCLBGC publishes its data through an ASP.NET MVC portal that intentionally resists casual scraping. Teams who try to roll their own integration almost always hit the same wall:

  • Search submissions are jQuery $.post calls to /Public/_Search/ — the response is raw HTML fragments injected into a results <table>, not JSON
  • Every detail page requires three separate AJAX GET calls: _ShowAccountDetails, _ShowAccountQualifiers, and _ShowNCLBGCPublicMatters, each keyed by an opaque encoded session token
  • Detail endpoints reject requests without the X-Requested-With: XMLHttpRequest header AND a valid Referer, AND a live session cookie from the search page
  • Classification filters use numeric IDs (e.g. Building = 27, Residential = 30) — not the human-readable labels exposed in the UI
  • License numbers in the search results table are appended with HTML-encoded suffixes like &nbsp; - &nbsp; License Not Active, requiring careful cleanup
  • Address fields combine street, city, state and ZIP in a single field separated by <br> — older records may omit the ZIP entirely
  • Status strings ship as Archived &nbsp; - &nbsp; License Not Valid and similar — fragile to naive == comparisons
  • The "Active Classifications" block sometimes appears as a dedicated <fieldset> and sometimes as a single space-separated string requiring greedy tokenization against the 30+ known classification labels
  • Some search modes return --Pending-- placeholders for license numbers that look real but represent in-flight applications
  • There is no documented API, no rate-limit guidance, and no bulk download — every record requires a full browser session round-trip

This actor solves all of that: it spins up a real Playwright browser, harvests a session cookie, issues XMLHttpRequest-flavoured POSTs and GETs with the correct headers, deals with the HTML quirks, normalizes the output, and pushes ready-to-use JSON to your Apify dataset — no scraper babysitting required.


Quick Start

One-Click Run

  1. Click "Try for free" on the Apify Store page
  2. Enter at least one search criterion (company names, license numbers, cities, ZIP codes, or qualifier names)
  3. Hit Start — the actor logs each contractor it locates and pushes a structured record per license
  4. Download as JSON, CSV, Excel, HTML, or XML directly from the Apify dataset view

API Run (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/nc-licensing-board-for-general-contractors-scraper").call(run_input={
"cities": ["Charlotte", "Raleigh", "Durham"],
"classificationType": "Residential",
"scrapeDetailPage": True,
"maxResultsPerSearch": 250
})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
print(record["licenseNumber"],
record["companyName"],
record.get("limitation"),
record.get("primaryQualifier"))

API Run (Node.js / TypeScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client
.actor('haketa/nc-licensing-board-for-general-contractors-scraper')
.call({
companyNames: ['Brasfield', 'Balfour Beatty', 'Choate Construction'],
classificationType: 'Building',
scrapeDetailPage: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} NC general contractor records`);

API Run (cURL)

curl -X POST "https://api.apify.com/v2/acts/haketa~nc-licensing-board-for-general-contractors-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"licenseNumbers": ["76235", "78901"],
"scrapeDetailPage": true
}'

How It Works

The actor talks to the NCLBGC public portal the same way a logged-in browser does — but headlessly, repeatably, and at concurrency you control.

Source endpoints

StageMethodURLPurpose
BootstrapGEThttps://portal.nclbgc.org/Public/SearchObtain ASP.NET session cookie & form tokens
SearchPOSThttps://portal.nclbgc.org/Public/_Search/Submit search filters; returns HTML results fragment
DetailGEThttps://portal.nclbgc.org/Public/_ShowAccountDetails/?key={key}&Source=SearchContact + license + limitation block
QualifiersGEThttps://portal.nclbgc.org/Public/_ShowAccountQualifiers/?key={key}Names, qualifier numbers & per-qualifier classifications
MattersGEThttps://portal.nclbgc.org/Public/_ShowNCLBGCPublicMatters/?key={key}Any disciplinary or public matters

Engineering details

  • EnginePlaywrightCrawler (Crawlee) with fingerprint-randomized Chromium so requests look like real desktop browsers
  • Headers — every AJAX hit sends X-Requested-With: XMLHttpRequest, Accept: text/html, */*; q=0.01, and Referer: portal.nclbgc.org/Public/Search (all non-optional)
  • Session reuse — search and detail requests share the same browser context so the ASP.NET session cookie remains valid
  • Form encodingapplication/x-www-form-urlencoded body built to match what jQuery's $('#AccountSearch').serialize() produces
  • Classification mapping — human-readable labels (e.g. S (Roofing)) are translated to NCLBGC numeric IDs (51) at submit time
  • Resilient parsing — handles both the dedicated <fieldset>Active Classifications</fieldset> block and the legacy space-separated classification string via greedy longest-match tokenization
  • Address parser — splits Street\nCity, ST 12345 and gracefully degrades to Street\nCity, ST for older archived records that omit the ZIP
  • License number cleanup — strips License Not Active, --Pending--, trailing dashes, non-breaking spaces, and HTML entities
  • Date normalizationexpirationDate and issueDate converted to YYYY-MM-DD ISO format
  • Dedup — in-memory Set keyed on cleaned account number prevents double-scraping when a license matches multiple queries
  • Retries — failed search submissions retried up to 3 times with a fresh browser session; proxy support via standard Apify proxy block

Input Parameters

{
"licenseNumbers": ["76235"],
"companyNames": ["Balfour Beatty"],
"qualifierFirstNames": ["John"],
"qualifierLastNames": ["Smith"],
"cities": ["Charlotte", "Raleigh"],
"zipCodes": ["27601", "28202"],
"classificationType": "Building",
"includeLikeSoundingNames": false,
"maxResultsPerSearch": 100,
"scrapeDetailPage": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Parameter reference

ParameterTypeDefaultDescription
licenseNumbersarray<string>[]One or more NCLBGC license numbers to look up directly (e.g. "76235"). Fastest and most precise search method — typically returns one exact match per number.
companyNamesarray<string>[]Business / company names to search. Partial matches supported by the portal. Each entry runs a separate search and may return many results.
qualifierFirstNamesarray<string>[]First name(s) of the qualifier (the licensed individual who passed NCLBGC exams on behalf of the company). Best used with last names.
qualifierLastNamesarray<string>[]Last name(s) of the qualifier. Pairs positionally with qualifierFirstNames. Either can be used alone.
citiesarray<string>[]NC city names (e.g. "Charlotte", "Raleigh", "Durham"). Combined with classificationType for precise trade-by-metro lists.
zipCodesarray<string>[]ZIP codes (e.g. "27601"). Useful for hyper-local prospecting in a defined service area.
classificationTypestring"ALL"Restrict results to one of 30+ NCLBGC classification labels — Building, Residential, Highway, Public Utilities, the H grading classification, all PU sub-types, all Specialty (S) trades, plus Accredited Builder tiers. See the full table below.
includeLikeSoundingNamesbooleanfalseActivates NCLBGC's Soundex / phonetic name expansion (e.g. Smith also matches Smyth). Useful when spelling is uncertain.
maxResultsPerSearchinteger100Cap on records collected per individual search query. 0 = unlimited. Set higher for broad city or classification sweeps.
scrapeDetailPagebooleantrueWhen true, opens each contractor's detail page to collect limitation, classifications, qualifier details, dates and disciplinary actions. Set false for fast list-only mode.
proxyConfigurationobjectnoneStandard Apify proxy block. Residential proxies recommended for large-volume production runs.

If no search criteria are supplied, the actor will browse with the chosen classification filter alone — useful for "all S (Roofing) contractors statewide" style sweeps.


Output Schema

Every record uses the same flat JSON shape, so downstream consumers (Postgres, BigQuery, Salesforce, HubSpot, Sheets) can ingest the entire stream without per-search-type branching.

Fields

FieldTypeAlways PresentDescription
licenseNumberstringyesNCLBGC license number (e.g. "76235" or "L.01505")
licenseStatusstringyesActive, Not Active, Archived, Expired, Inactive or Revoked — normalized from the portal display
companyNamestringyesRegistered business / company name
licenseTypestringusuallyLicense, Continuing Education Instructor, or similar account-type label
limitationstringwhen detail scrapedLimited (projects ≤ $500K), Intermediate (≤ $1M), or Unlimited — the financial cap the license is authorized for
classificationsarray<string>when detail scrapedAll active classifications held by this license — e.g. ["Building", "Residential"]
qualifiersarray<object>when detail scrapedPer-qualifier records with name, qualifierNumber, classification, status
primaryQualifierstringwhen qualifier presentName of the first / primary qualifier on the license
qualifierNumberstringwhen qualifier presentNCLBGC qualifier ID number of the primary qualifier
phonestringsometimesBusiness phone as reported to NCLBGC
streetAddressstringusuallyStreet address of the principal place of business
citystringusuallyBusiness city
statestringusuallyTwo-letter state code (typically NC, but the address may be out of state)
zipstringusuallyZIP (5- or 9-digit). May be null on older archived records
expirationDatestringusuallyLicense expiration in YYYY-MM-DD
issueDatestringusuallyFirst issued date in YYYY-MM-DD
disciplinaryActionsarray<object>when presentdate, type, detail of any NCLBGC public matters / hearings
profileUrlstringyesDeep link back to the contractor's NCLBGC detail page
scrapedAtstringyesISO-8601 timestamp of extraction

Example: Unlimited general contractor with multiple classifications

{
"licenseNumber": "76235",
"licenseStatus": "Active",
"companyName": "EXAMPLE CONSTRUCTION CO INC",
"licenseType": "License",
"limitation": "Unlimited",
"classifications": ["Building", "Residential", "Highway"],
"primaryQualifier": "JOHN A. SAMPLE",
"qualifierNumber": "44321",
"qualifiers": [
{ "name": "JOHN A. SAMPLE", "qualifierNumber": "44321", "classification": "Building", "status": "Active" },
{ "name": "MARY B. TESTER", "qualifierNumber": "44322", "classification": "Residential", "status": "Active" }
],
"phone": "(704) 555-0100",
"streetAddress": "100 N TRYON ST",
"city": "Charlotte",
"state": "NC",
"zip": "28202",
"expirationDate": "2026-12-31",
"issueDate": "2008-04-15",
"disciplinaryActions": null,
"profileUrl": "https://portal.nclbgc.org/Public/Search?key=abc123encodedkey==",
"scrapedAt": "2026-05-16T14:00:00.000Z"
}

Example: Archived legacy record (older license, ZIP missing)

{
"licenseNumber": "L.01505",
"licenseStatus": "Archived - License Not Valid",
"companyName": "SAMPLE BUILDERS",
"licenseType": "License",
"limitation": "Unlimited",
"classifications": ["Building"],
"primaryQualifier": "A. Q. SAMPLE",
"qualifierNumber": "99999",
"qualifiers": [
{ "name": "A. Q. SAMPLE", "qualifierNumber": "99999", "classification": "Building", "status": "Inactive" }
],
"phone": null,
"streetAddress": "2117 PIEDMONT RD",
"city": "Atlanta",
"state": "GA",
"zip": null,
"expirationDate": null,
"issueDate": "1943-10-26",
"disciplinaryActions": null,
"profileUrl": "https://portal.nclbgc.org/Public/Search?key=legacyEncodedKey==",
"scrapedAt": "2026-05-16T14:00:00.000Z"
}

Classification Reference

NCLBGC issues licenses in four primary categories plus 20+ Specialty (S) and Public Utility (PU) sub-classifications. Use the classificationType input to filter at search time.

Primary classifications

LabelScope
BuildingCommercial structures, non-residential buildings
ResidentialOne- and two-family dwellings, townhouses
HighwayRoad, highway, bridge and street construction
Public UtilitiesUmbrella for utility-related construction
H (Grading & Excavating)Site grading, excavation and earth moving

Public Utility sub-classifications

LabelScope
PU (Communications)Telecom, fiber, broadband infrastructure
PU (Fuel Distribution)Fuel pipelines and distribution lines
PU (Sewage Disposal)Sewage treatment / disposal systems
PU (Sewer Lines)Sewer line installation
PU (Water Lines)Potable water main installation
PU(Electrical-Ahead of P.O.D.)Electrical work upstream of the point of delivery
PU(Water Lines & Sewer Lines)Combined water + sewer authorization
PU(Water Pur. & Sewage Disp.)Water purification + sewage disposal combined
PU(Water Purification)Water purification systems

Specialty (S) classifications

LabelScope
S (Asbestos)Asbestos abatement
S (Boring & Tunneling)Horizontal directional drilling, tunneling
S (Concrete Construction)Concrete forming, placing, finishing
S (Insulation)Building insulation
S (Interior Construction)Interior buildout, drywall, partitions
S (Marine Construction)Docks, piers, marine bulkheads
S (Masonry Construction)Brick, block, stone masonry
S (Metal Erection)Structural steel erection
S (Railroad Construction)Rail bed and track construction
S (Roofing)Roofing installation and replacement
S (Sidewalk Curb & Gutter)Concrete flatwork in the right of way
S (Sign/Billboard)Sign and billboard structures
S (Swimming Pools)Pool construction
S (Wind Turbine)Wind turbine erection and foundations

Accreditations

LabelScope
Accredited BuilderNCLBGC-accredited residential builder program
Accredited Master BuilderTop-tier accredited builder credential
UnclassifiedLicense predating the current classification regime

License Status & Limitation Reference

Status values

StatusMeaning
ActiveLicense current and in good standing
Not ActiveLicense visible in search but flagged inactive on the list page
InactiveRenewal not completed; not authorized to contract
ExpiredPast expiration date
Archived / Archived - License Not ValidLegacy record kept for historical lookup
RevokedTerminated by Board action

Financial limitations

LimitationMaximum single project value
LimitedUp to $500,000
IntermediateUp to $1,000,000
UnlimitedNo upper cap

NC General Statute §87-1 requires a contractor license for any project (or any phase of a project) costing $30,000 or more. The limitation tier dictates the upper boundary the licensee may legally bid.


Use Cases

Construction Project Bidding & Subcontractor Sourcing

General contractors, owners' reps, and construction managers use NCLBGC data to:

  • Build pre-qualified bidder lists filtered by classificationType: "Building" and limitation: "Unlimited" in the target metro
  • Validate prospective subs are properly classified for the trade before issuing an ITB — concrete, masonry, metal erection, roofing
  • Source minority and small-business contractors by ZIP / city / classification for DBE / HUB compliance on public projects
  • Verify the limitation aligns with project value so a Limited license isn't accidentally bidding a $4M job

Compliance & Pre-Award Verification

Procurement teams, owners, lenders, and bond agents use the data to:

  • Confirm license status before contract award on every general contractor and key subcontractor
  • Automate weekly status sweeps of approved-bidder lists — catch expirations and revocations before they affect a draw
  • Pull disciplinary matters for any contractor on a payment bond
  • Document due diligence with timestamped scrapedAt evidence for audit trails
  • Cross-check qualifier identity — confirm the named qualifier still holds the right classification

B2B Sales & Lead Generation

Building product manufacturers, equipment dealers, ERP / construction software vendors, insurance brokers and PEOs use the data to:

  • Build geo-targeted prospect lists of every active Unlimited Building contractor in Charlotte, the Triangle, or the Triad
  • Segment by classification — sell roofing supplies to S (Roofing) license holders, masonry products to S (Masonry Construction)
  • Enrich CRM accounts in Salesforce or HubSpot with current license number, limitation tier and expiration
  • Time outreach to license renewals — owners are more receptive in the 60 days before expiration

Insurance Underwriting & Surety Bonding

Builders' risk, general liability, and surety underwriters use the data to:

  • Verify license validity at bind, renewal, and bond execution
  • Adjust pricing for license tier — Unlimited carries different risk than Limited
  • Flag disciplinary history automatically through the disciplinaryActions array
  • Monitor in-force policy portfolios — daily diffs surface status changes before they become claims
  • Validate the named qualifier still holds the classifications matching the bonded scope of work

Recruiting & Workforce Intelligence

Construction recruiters, staffing firms, and HR teams use the data to:

  • Identify qualifier candidates — qualifiers hold the credentials general contractors actively poach
  • Map qualifier mobility across companies by tracking when names appear on new licenses
  • Build talent pools by classification — find every active Building qualifier in the Charlotte MSA
  • Source M&A targets based on key-person concentration (single-qualifier licenses)

M&A, Investor Research & Due Diligence

Private equity, strategic acquirers, and lenders evaluating NC contracting businesses use the data to:

  • Confirm the target company holds the classifications its pitch deck claims before LOI
  • Verify the named qualifier is on payroll so the license isn't lost at closing
  • Pull disciplinary history as a deal-breaker check
  • Benchmark target against competitors in the same metro and classification tier

Construction lawyers, claim adjusters, and investigators use the data to:

  • Verify a defendant contractor was licensed for the work performed during the loss period
  • Identify the responsible qualifier for personal-jurisdiction or qualifications-of-witness questions
  • Pull disciplinary patterns as supporting evidence of prior knowledge or negligence
  • Cross-reference shell companies that share a single qualifier

Government & Public Works Compliance

State and municipal procurement officers, DOT, school districts and authorities use the data to:

  • Pre-qualify bidders on highway, sewer, water-line, school and stadium projects
  • Verify Highway, PU and Building classifications match the work category on every bid
  • Monitor minority-owned contractor participation by metro and trade
  • Maintain audit-ready procurement files with timestamped license verifications

Academic & Industry Research

Construction-management programs, industry associations, journalists, and policy analysts use the data to:

  • Quantify market concentration by classification across NC metros
  • Track Accredited Builder program growth year over year
  • Map specialty-trade gaps by region (counties with few roofing contractors, few wind-turbine qualifiers)
  • Cover regulatory enforcement — disciplinary trends and consent-order outcomes

Sample Queries & Recipes

Recipe 1: Every active Building general contractor in Charlotte

{
"cities": ["Charlotte"],
"classificationType": "Building",
"scrapeDetailPage": true,
"maxResultsPerSearch": 500
}

Use case: prospecting list for a commercial roofing supplier opening a Charlotte branch.

Recipe 2: Statewide roofing contractors

{
"classificationType": "S (Roofing)",
"scrapeDetailPage": true,
"maxResultsPerSearch": 0
}

Use case: insurance carrier building a panel of approved roofing partners after a major storm event.

Recipe 3: Triangle residential builders (Raleigh + Durham + Cary)

{
"cities": ["Raleigh", "Durham", "Cary"],
"classificationType": "Residential",
"scrapeDetailPage": true
}

Use case: window manufacturer launching a Triangle-area builder loyalty program.

Recipe 4: Direct license lookup batch

{
"licenseNumbers": ["76235", "78901", "L.01505", "82110"],
"scrapeDetailPage": true
}

Use case: bond agent revalidating a portfolio of in-force surety bonds.

Recipe 5: Find a specific qualifier across all their licenses

{
"qualifierFirstNames": ["John"],
"qualifierLastNames": ["Smith"],
"includeLikeSoundingNames": true,
"scrapeDetailPage": true
}

Use case: recruiter sourcing a Building qualifier; Soundex catches Smith / Smyth / Smithe.

Recipe 6: Public-utility contractors in Wilmington-area ZIPs

{
"zipCodes": ["28401", "28403", "28405", "28411", "28412"],
"classificationType": "Public Utilities",
"scrapeDetailPage": true
}

Use case: municipal engineer scoping the local PU bid pool ahead of an RFP.

Recipe 7: Fast list-only sweep (no detail pages) for a CRM import

{
"cities": ["Greensboro", "Winston-Salem", "High Point"],
"classificationType": "ALL",
"scrapeDetailPage": false,
"maxResultsPerSearch": 1000
}

Use case: cheap nightly refresh of every Triad-area contractor; enrich select records later.


Integration Examples

Google Sheets

Add the Export to Google Sheets integration to a scheduled run of the actor. Choose dataset fields to surface — companyName, city, limitation, classifications, expirationDate, phone — and your sales team gets a fresh NC contractor sheet every morning.

Make.com / Zapier / n8n

Use the Apify connector on any major iPaaS to trigger downstream automation on:

  • New licenses — diff today's run vs. yesterday's, route new contractors to a CRM lead queue
  • Status flipsActiveInactive triggers a Slack alert to the bond underwriting team
  • Limitation changes — a license moving from Intermediate to Unlimited signals growth; flag for upsell
  • New disciplinary matter — automatic ticket creation in Jira / Linear for legal review

Power BI / Tableau / Looker

Connect the Apify Dataset REST API as a data source. Refresh on the Apify schedule. Useful dashboards:

  • Active license counts by metro and classification
  • Limitation tier mix per region
  • Year-over-year contractor formation curves
  • Disciplinary action heat maps
  • Qualifier-to-license ratio (concentration risk)

Postgres / Snowflake / BigQuery

Wire Apify's webhook integration to POST run results directly to your warehouse ingestion endpoint. Recommended schema: a license table keyed on licenseNumber, with separate classifications and qualifiers child tables for fully normalized analytics.

Salesforce / HubSpot CRM Enrichment

Schedule the actor nightly and upsert into the Account object keyed on licenseNumber. Use the limitation and classifications fields to drive lead scoring; route accounts with disciplinary actions to a specialized review queue. Mark status flips with workflow rules to spawn renewal-outreach Tasks.

Webhooks & Custom Pipelines

Every Apify run can fire a webhook on success — point it at your own ingestion API to stream NC contractor data into proprietary downstream systems (project bid management, e-procurement, prequalification portals like Avetta, ISNetworld, etc.).


Major North Carolina Markets

Metro / RegionApprox. PopulationWhy It Matters for Contractor Data
Charlotte2.7MLargest NC metro; banking and stadium construction boom; high Unlimited Building density
Raleigh–Durham (Research Triangle)2.1MLife sciences, semiconductors, RTP campus growth; major commercial and PU pipeline
Greensboro–Winston-Salem–High Point (Triad)1.7MLogistics megaprojects (Toyota, Boom), manufacturing, healthcare expansion
Asheville0.5MHospitality, tourism, and post-Helene reconstruction demand
Fayetteville0.5MFort Liberty (formerly Bragg) military construction and surrounding residential
Wilmington0.3MCoastal commercial, port infrastructure, hurricane-driven residential turnover
Hickory0.4MFurniture, fiber-optics manufacturing, regional commercial
Concord0.1MCharlotte MSA suburb; warehousing and motorsports facilities
Cary0.2MTriangle suburb; high residential builder concentration
Chapel Hill0.06MUNC Health and education construction
Greenville0.09MEast NC healthcare and university construction
Jacksonville0.07MCamp Lejeune-adjacent military and residential

Cost & Performance

MetricValue
EnginePlaywright (Chromium) + XHR fetches against ASP.NET MVC endpoints
Runtime — single license lookup10–25 seconds
Runtime — city-wide classification sweep (≈500 records, full detail)8–20 minutes
Runtime — list-only mode (no detail pages)~3x faster than full detail
Cost per runVaries by record count; pay-per-event keeps cost proportional to data delivered
Pricing modelPay-per-event (transparent per-record line items)
Data freshnessLive at run time — direct hits to the NCLBGC portal
Auth requiredNone (public portal)
Proxy requiredOptional — recommended residential for bulk runs >1,000 records
ConcurrencyDefault 3; tunable via input
Memory footprint4096 MB allocated (configured in actor.json); typical use ~1.5 GB

  • Public data only — every field is published by NCLBGC at portal.nclbgc.org under North Carolina public records statutes
  • No PHI / no HIPAA exposure — this is construction-licensing data, not health information
  • No SSNs, dates of birth, or financial account data — only license-related public information
  • Business addresses — most contractors register a commercial principal office; some sole-proprietor licenses may list a residence
  • Qualifier names — the qualifier is a publicly published officer of the license, not a private individual identifier
  • Phone numbers — business phone as reported to NCLBGC; treat as business contact data
  • CAN-SPAM / TCPA — outbound email and call compliance is the data consumer's responsibility
  • GDPR / CCPA — public-record exemptions generally apply but consult counsel for EU / California-resident downstream uses
  • Rate consideration — please use reasonable concurrency and avoid scraping faster than necessary; do not hammer the NCLBGC portal

Important: NCLBGC data is published for transparency and public protection. It must not be used for unlawful purposes including identity fraud, stalking, harassment, or any action that would damage the licensee or the Board's mission.


Frequently Asked Questions

How fresh is the data?

The actor fetches records live from the NCLBGC portal at run time, so freshness equals "now". Schedule it daily to maintain a current dataset.

How many records will I get?

Depends on your filters. A direct license lookup returns one record; a city + classification combo can return hundreds; an unfiltered classification sweep can return thousands. Cap with maxResultsPerSearch if needed.

Does this scraper require login or NCLBGC credentials?

No. The NCLBGC public portal is open to the public. The actor obtains a transient ASP.NET session cookie automatically.

Does the actor handle the portal AJAX endpoints correctly?

Yes — this is the entire reason the actor exists. It mimics the jQuery $.post / $.get behavior including the X-Requested-With: XMLHttpRequest header that the NCLBGC endpoints validate, and preserves session cookies across search and detail fetches.

Can I filter by license expiration date or limitation?

The actor returns expirationDate and limitation as fields. Apply expiration-window or limitation-tier filters downstream in SQL, Python, Sheets, or your CRM.

Are contractor emails included?

No. NCLBGC does not publish contractor email addresses. Phone numbers and mailing addresses are included.

How are classifications represented?

As a string array in the classifications field. The actor handles both the modern dedicated <fieldset>Active Classifications</fieldset> block and the legacy single-line space-separated format via greedy tokenization against the 30+ known classification labels.

How is the financial limitation reported?

In the limitation field as one of Limited, Intermediate, or Unlimited — corresponding to a single-project cap of $500K, $1M, or unlimited respectively.

What's a "qualifier"?

The individual who passed NCLBGC technical and business / law exams on behalf of the license. Every NC general contractor license must have at least one active qualifier — the qualifier holds the technical credential, the company holds the license.

Does the actor capture disciplinary actions?

Yes. The _ShowNCLBGCPublicMatters endpoint is hit for every detail-scraped record and results land in the disciplinaryActions array — null if none on file.

Can I run this for other states, or on the Apify free plan, or scheduled?

This actor is NCLBGC-specific — see Related Actors for sibling state boards. It runs fine on the free plan for small queries, and Apify's Scheduler supports any cron expression for unattended runs.

Does the actor follow Soundex / phonetic name matches?

Yes — set includeLikeSoundingNames: true to enable NCLBGC's built-in Soundex expansion on first / last name searches.

What formats can I export?

JSON, CSV, Excel (XLSX), HTML, XML, RSS, and JSON Lines — directly from the Apify dataset view or API.

Does the dataset include archived / out-of-state licenses?

Yes. Archived legacy records and out-of-state-headquartered NCLBGC licensees show up when matched. Filter by state == "NC" downstream if you only want NC-physical-address contractors.

Why is expirationDate sometimes empty?

Older archived records sometimes lack an expiration date on the NCLBGC portal. The actor surfaces null rather than fabricating a date.


If you need licensing data for other US states or related regulators, these sibling actors keep the same output shape and pricing model:


Comparison vs. Alternatives

ApproachSetup timeData freshnessCost (1K records)Schema normalizationMaintenance
This actor< 1 minuteLive at run timePay-per-event (pennies typical)Built-inMaintained
Manual NCLBGC searchMinutes per recordLiveFree, time-expensiveNoneManual
Custom Playwright script8–16 hours devLiveFree + infraDIYDIY (NCLBGC has changed)
Paid contractor data APIHours setupVariable$100s+/monthVendor-specificVendor-managed
Records request to NCLBGCDays–weeksStale on arrivalFree / variableNoneNone

Why Pay-Per-Event Pricing?

Most data scrapers either lock you into a flat monthly subscription you pay even when idle, or invoice on opaque Compute Units that swing unpredictably. This actor uses pay-per-event pricing instead, which means:

  • You only pay when the actor runs
  • Charges scale with the number of records actually delivered to your dataset
  • Transparent line-item billing inside the Apify Console
  • No monthly minimums or seat fees
  • Free to evaluate — try licenseNumbers: ["76235"] for cents
  • Predictable cost modeling for budgeting bulk territory sweeps

Changelog

VersionDateNotes
1.02026-05Initial public release — full search-and-detail extraction across all NCLBGC classifications, qualifier and disciplinary capture, pay-per-event pricing

Keywords

NC Licensing Board for General Contractors Scraper · NCLBGC scraper · North Carolina contractor license lookup · NC general contractor verification · NC contractor classification lookup · portal.nclbgc.org scraper · North Carolina licensed contractor database · NC contractor compliance API · Charlotte contractor data · Raleigh construction licensing · Durham contractor list · Greensboro general contractor scraper · Winston-Salem contractor database · Asheville contractor license verification · Fayetteville builder lookup · Wilmington NC contractor data · Triangle contractor B2B leads · NC residential builder data · NC building contractor extraction · NC highway contractor scraper · NC public utility contractor lookup · NC roofing contractor list · NC masonry contractor database · NC qualifier name search · NCLBGC limitation lookup · Unlimited license NC · Intermediate license NC · Limited license NC · NC contractor expiration tracking · NC contractor disciplinary actions · NC subcontractor prequalification · construction prequalification data NC · NCLBGC API alternative · Apify NC contractor actor · NC construction lead generation · NC builder mailing list · NC contractor CRM enrichment · NCLBGC Soundex search · NC general contractor classifications · Accredited Builder NC · NC contractor M&A research


Support

  • Bug reports: Use the Issues tab on the Apify Store actor page
  • Feature requests: Same place — please describe the use case and the field or filter you'd like
  • Direct contact: Reach the developer through the Apify Console developer profile

If this actor saves your team time, a 5-star rating on the Apify Store helps other NC construction, compliance, and B2B teams discover it. Thank you!