NC Licensing Board for General Contractors Scraper
Pricing
from $2.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
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.
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
$.postcalls to/Public/_Search/— the response is raw HTML fragments injected into a results<table>, not JSON - Every detail page requires three separate AJAX
GETcalls:_ShowAccountDetails,_ShowAccountQualifiers, and_ShowNCLBGCPublicMatters, each keyed by an opaque encoded session token - Detail endpoints reject requests without the
X-Requested-With: XMLHttpRequestheader AND a validReferer, 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
- 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 - License Not Validand 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
- Click "Try for free" on the Apify Store page
- Enter at least one search criterion (company names, license numbers, cities, ZIP codes, or qualifier names)
- Hit Start — the actor logs each contractor it locates and pushes a structured record per license
- Download as JSON, CSV, Excel, HTML, or XML directly from the Apify dataset view
API Run (Python)
from apify_client import ApifyClientclient = 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
| Stage | Method | URL | Purpose |
|---|---|---|---|
| Bootstrap | GET | https://portal.nclbgc.org/Public/Search | Obtain ASP.NET session cookie & form tokens |
| Search | POST | https://portal.nclbgc.org/Public/_Search/ | Submit search filters; returns HTML results fragment |
| Detail | GET | https://portal.nclbgc.org/Public/_ShowAccountDetails/?key={key}&Source=Search | Contact + license + limitation block |
| Qualifiers | GET | https://portal.nclbgc.org/Public/_ShowAccountQualifiers/?key={key} | Names, qualifier numbers & per-qualifier classifications |
| Matters | GET | https://portal.nclbgc.org/Public/_ShowNCLBGCPublicMatters/?key={key} | Any disciplinary or public matters |
Engineering details
- Engine —
PlaywrightCrawler(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, andReferer: 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 encoding —
application/x-www-form-urlencodedbody 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 12345and gracefully degrades toStreet\nCity, STfor older archived records that omit the ZIP - License number cleanup — strips
License Not Active,--Pending--, trailing dashes, non-breaking spaces, and HTML entities - Date normalization —
expirationDateandissueDateconverted toYYYY-MM-DDISO format - Dedup — in-memory
Setkeyed 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
| Parameter | Type | Default | Description |
|---|---|---|---|
licenseNumbers | array<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. |
companyNames | array<string> | [] | Business / company names to search. Partial matches supported by the portal. Each entry runs a separate search and may return many results. |
qualifierFirstNames | array<string> | [] | First name(s) of the qualifier (the licensed individual who passed NCLBGC exams on behalf of the company). Best used with last names. |
qualifierLastNames | array<string> | [] | Last name(s) of the qualifier. Pairs positionally with qualifierFirstNames. Either can be used alone. |
cities | array<string> | [] | NC city names (e.g. "Charlotte", "Raleigh", "Durham"). Combined with classificationType for precise trade-by-metro lists. |
zipCodes | array<string> | [] | ZIP codes (e.g. "27601"). Useful for hyper-local prospecting in a defined service area. |
classificationType | string | "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. |
includeLikeSoundingNames | boolean | false | Activates NCLBGC's Soundex / phonetic name expansion (e.g. Smith also matches Smyth). Useful when spelling is uncertain. |
maxResultsPerSearch | integer | 100 | Cap on records collected per individual search query. 0 = unlimited. Set higher for broad city or classification sweeps. |
scrapeDetailPage | boolean | true | When true, opens each contractor's detail page to collect limitation, classifications, qualifier details, dates and disciplinary actions. Set false for fast list-only mode. |
proxyConfiguration | object | none | Standard 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
| Field | Type | Always Present | Description |
|---|---|---|---|
licenseNumber | string | yes | NCLBGC license number (e.g. "76235" or "L.01505") |
licenseStatus | string | yes | Active, Not Active, Archived, Expired, Inactive or Revoked — normalized from the portal display |
companyName | string | yes | Registered business / company name |
licenseType | string | usually | License, Continuing Education Instructor, or similar account-type label |
limitation | string | when detail scraped | Limited (projects ≤ $500K), Intermediate (≤ $1M), or Unlimited — the financial cap the license is authorized for |
classifications | array<string> | when detail scraped | All active classifications held by this license — e.g. ["Building", "Residential"] |
qualifiers | array<object> | when detail scraped | Per-qualifier records with name, qualifierNumber, classification, status |
primaryQualifier | string | when qualifier present | Name of the first / primary qualifier on the license |
qualifierNumber | string | when qualifier present | NCLBGC qualifier ID number of the primary qualifier |
phone | string | sometimes | Business phone as reported to NCLBGC |
streetAddress | string | usually | Street address of the principal place of business |
city | string | usually | Business city |
state | string | usually | Two-letter state code (typically NC, but the address may be out of state) |
zip | string | usually | ZIP (5- or 9-digit). May be null on older archived records |
expirationDate | string | usually | License expiration in YYYY-MM-DD |
issueDate | string | usually | First issued date in YYYY-MM-DD |
disciplinaryActions | array<object> | when present | date, type, detail of any NCLBGC public matters / hearings |
profileUrl | string | yes | Deep link back to the contractor's NCLBGC detail page |
scrapedAt | string | yes | ISO-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
| Label | Scope |
|---|---|
Building | Commercial structures, non-residential buildings |
Residential | One- and two-family dwellings, townhouses |
Highway | Road, highway, bridge and street construction |
Public Utilities | Umbrella for utility-related construction |
H (Grading & Excavating) | Site grading, excavation and earth moving |
Public Utility sub-classifications
| Label | Scope |
|---|---|
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
| Label | Scope |
|---|---|
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
| Label | Scope |
|---|---|
Accredited Builder | NCLBGC-accredited residential builder program |
Accredited Master Builder | Top-tier accredited builder credential |
Unclassified | License predating the current classification regime |
License Status & Limitation Reference
Status values
| Status | Meaning |
|---|---|
Active | License current and in good standing |
Not Active | License visible in search but flagged inactive on the list page |
Inactive | Renewal not completed; not authorized to contract |
Expired | Past expiration date |
Archived / Archived - License Not Valid | Legacy record kept for historical lookup |
Revoked | Terminated by Board action |
Financial limitations
| Limitation | Maximum single project value |
|---|---|
Limited | Up to $500,000 |
Intermediate | Up to $1,000,000 |
Unlimited | No 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"andlimitation: "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
scrapedAtevidence 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 toS (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
disciplinaryActionsarray - 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
Legal, Litigation & Construction Defect
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 flips —
Active→Inactivetriggers 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 / Region | Approx. Population | Why It Matters for Contractor Data |
|---|---|---|
| Charlotte | 2.7M | Largest NC metro; banking and stadium construction boom; high Unlimited Building density |
| Raleigh–Durham (Research Triangle) | 2.1M | Life sciences, semiconductors, RTP campus growth; major commercial and PU pipeline |
| Greensboro–Winston-Salem–High Point (Triad) | 1.7M | Logistics megaprojects (Toyota, Boom), manufacturing, healthcare expansion |
| Asheville | 0.5M | Hospitality, tourism, and post-Helene reconstruction demand |
| Fayetteville | 0.5M | Fort Liberty (formerly Bragg) military construction and surrounding residential |
| Wilmington | 0.3M | Coastal commercial, port infrastructure, hurricane-driven residential turnover |
| Hickory | 0.4M | Furniture, fiber-optics manufacturing, regional commercial |
| Concord | 0.1M | Charlotte MSA suburb; warehousing and motorsports facilities |
| Cary | 0.2M | Triangle suburb; high residential builder concentration |
| Chapel Hill | 0.06M | UNC Health and education construction |
| Greenville | 0.09M | East NC healthcare and university construction |
| Jacksonville | 0.07M | Camp Lejeune-adjacent military and residential |
Cost & Performance
| Metric | Value |
|---|---|
| Engine | Playwright (Chromium) + XHR fetches against ASP.NET MVC endpoints |
| Runtime — single license lookup | 10–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 run | Varies by record count; pay-per-event keeps cost proportional to data delivered |
| Pricing model | Pay-per-event (transparent per-record line items) |
| Data freshness | Live at run time — direct hits to the NCLBGC portal |
| Auth required | None (public portal) |
| Proxy required | Optional — recommended residential for bulk runs >1,000 records |
| Concurrency | Default 3; tunable via input |
| Memory footprint | 4096 MB allocated (configured in actor.json); typical use ~1.5 GB |
Compliance, Privacy & Legal Notes
- 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.
Related Apify Actors by Haketa
If you need licensing data for other US states or related regulators, these sibling actors keep the same output shape and pricing model:
- Arizona ROC Contractor License Scraper — AZ Registrar of Contractors
- Washington L&I Contractor License Scraper — Washington State contractors
- California DCA Professional License Scraper — California Department of Consumer Affairs
- Virginia DPOR Professional License Scraper — Virginia regulated occupations
- Colorado Professional License Scraper — Colorado DORA
- Minnesota DLI Professional License Scraper — Minnesota licensing
- Ohio eLicense Scraper — Ohio professional licenses
- Illinois IDFPR License Scraper — Illinois licensed professionals
- Texas Pharmacy License Scraper — TSBP — TX pharmacy licensing
- SAM.gov Federal Contractor Entity Scraper — federal contractor registry
- TTB Alcohol Permittee Scraper — federal TTB alcohol permittees
- BBB Business Scraper — Better Business Bureau profiles for enrichment
Comparison vs. Alternatives
| Approach | Setup time | Data freshness | Cost (1K records) | Schema normalization | Maintenance |
|---|---|---|---|---|---|
| This actor | < 1 minute | Live at run time | Pay-per-event (pennies typical) | Built-in | Maintained |
| Manual NCLBGC search | Minutes per record | Live | Free, time-expensive | None | Manual |
| Custom Playwright script | 8–16 hours dev | Live | Free + infra | DIY | DIY (NCLBGC has changed) |
| Paid contractor data API | Hours setup | Variable | $100s+/month | Vendor-specific | Vendor-managed |
| Records request to NCLBGC | Days–weeks | Stale on arrival | Free / variable | None | None |
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
| Version | Date | Notes |
|---|---|---|
| 1.0 | 2026-05 | Initial 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!