Virginia DPOR Professional License Scraper
Pricing
from $2.50 / 1,000 results
Virginia DPOR Professional License Scraper
Scrape contractor and tradesman license records from Virginia DPOR (Department of Professional and Occupational Regulation). Downloads bulk regulant lists — Class A/B/C contractors, electricians, plumbers, HVAC techs, gas fitters and more. No browser needed, direct file download.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Virginia DPOR Professional License Scraper — Contractor, Tradesman & Skilled-Trades Data Extractor for Virginia (Class A/B/C, Electrical, Plumbing, HVAC, Gas Fitting & More)
The most complete Virginia Department of Professional and Occupational Regulation (DPOR) license extraction tool on Apify. Download bulk regulant lists — Class A, B and C contractors, journeyman and master tradesmen (electrical, plumbing, HVAC, gas fitting), backflow workers, elevator mechanics, water well providers, energy analysts and fire-sprinkler inspectors — straight from the official DPOR public files. Structured, normalized JSON ready for compliance, sales, recruiting, credentialing, underwriting and analytics workflows.
What This Actor Does
The Virginia DPOR Professional License Scraper is a production-ready Apify Actor that extracts the complete public regulant lists published by the Virginia Department of Professional and Occupational Regulation (DPOR) — the state agency that licenses Virginia's construction industry firms, journeyman and master tradesmen, specialty workers and several allied skilled trades.
DPOR posts the records as tab-delimited text files on dpor.virginia.gov. Each file covers one license code and is refreshed periodically with newly issued, renewed and expired certificates. This actor downloads those files directly (no browser, no login, no captcha), parses each header into a canonical schema, derives status, normalizes dates, cleans ZIP codes, splits specialty codes, and outputs a single flat JSON shape so every record — contractor or tradesman — drops cleanly into your database, CRM or BI tool.
In a single run the actor can pull every public regulant record across all ten DPOR license codes:
- Class A Contractors (2701) — firms performing single contracts of $120,000+ or aggregate annual work above $750,000
- Class B Contractors (2705b) — firms with single contracts between $10,000 and $120,000
- Class C Contractors (2705c) — firms with single contracts between $1,000 and $10,000
- Tradesman Combined (2710) — journeyman and master Electricians, Plumbers, HVAC and Gas Fitters
- Residential Tradesman (2709) — residential-only tradesman registrations
- Backflow Prevention Device Workers (2717) — certified backflow testers
- Certified Elevator Mechanics (2718) — licensed elevator installers and inspectors
- Certified Water Well Systems Providers (2719) — well drillers and pump installers
- Residential Building Energy Analysts (2722) — code-required energy modelers
- Automatic Fire Sprinkler Inspectors (2723) — sprinkler-system inspectors
Each record carries license number, certificate type, classification (A/B/C/TRAD), specialty codes (CBC, RBC, H, ELE, MELE, JPLB and more), derived status, issue and expiration dates, full address, ZIP, and — where DPOR publishes it — registrant email.
Why scrape Virginia DPOR yourself when this exists?
DPOR's regulant lists are technically "open data" — but the path from raw .txt file to usable database row is full of friction:
- Files are buried under a long URL with URL-encoded spaces inside
Records%20and%20Documents/Regulant%20List/ - Each license code lives in a separate file — ten downloads to get full coverage
- Files are tab-delimited, latin-1 encoded plain text — not CSV, not UTF-8, not JSON; ingesting as UTF-8 will corrupt special characters
- Header rows use cryptic uppercase columns like
CERTIFICATE #,FIVE DIGIT ZIP CODE,P O BOX #,LICENSE RANK,LICENSE SPECIALTY - Specialty codes are concatenated into one column with mixed delimiters (commas, slashes, spaces) —
MELE,JPLBorCBC/H - No explicit status column exists — you must derive Active vs Expired from the expiration date
- Address is split across four fields (line 1, line 2, PO Box, city) that need merging
- ZIPs arrive with empty
-0000extensions that look like fake ZIP+4s - Firm names live in
BUSINESS NAMEfor contractors andINDIVIDUAL NAMEfor tradesmen — no unified name field - Header formats can drift between codes; naive split-by-tab parsers silently mis-map columns when one file adds a field
This actor handles every one of those issues out of the box. You input the codes you care about; you get back a flat, normalized, status-derived dataset.
Quick Start
One-Click Run
- Open the actor page on Apify and click "Try for free"
- Leave
licenseCodesat the default["2701"]to scrape Class A Contractors, or list any combination of codes - Pick
statusFilter: "active"to drop expired records, or"all"for the full archive - Hit Start — your dataset is ready in under a minute and downloadable as JSON, CSV, Excel, HTML, XML or RSS from the dataset view
API Run (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/virginia-dpor-license-scraper").call(run_input={"licenseCodes": ["2701", "2705b", "2705c"],"statusFilter": "active","maxRecords": 0,"requestDelay": 200,})for record in client.dataset(run["defaultDatasetId"]).iterate_items():print(record["licenseNumber"], record["name"], record["classification"], record["city"])
API Run (Node.js / TypeScript)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/virginia-dpor-license-scraper').call({licenseCodes: ['2710'], // Tradesman Combined (master/journeyman)statusFilter: 'active',maxRecords: 5000,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Pulled ${items.length} active Virginia tradesman records`);
API Run (cURL)
curl -X POST "https://api.apify.com/v2/acts/haketa~virginia-dpor-license-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"licenseCodes": ["2701", "2710"],"statusFilter": "active","maxRecords": 0}'
How It Works
DPOR publishes one tab-delimited text file per license code at a predictable URL pattern:
https://www.dpor.virginia.gov/sites/default/files/Records%20and%20Documents/Regulant%20List/{CODE}__crnt.txt
The actor downloads each requested file directly over HTTPS using got-scraping with a desktop Chrome user agent, parses the header line to map columns to canonical field names using a fuzzy alias dictionary, then walks every data row to produce a normalized record.
Source endpoints
| Code | License Type | File | Typical Volume |
|---|---|---|---|
2701 | Class A Contractor | 2701__crnt.txt | Thousands of firms |
2705b | Class B Contractor | 2705b__crnt.txt | Thousands of firms |
2705c | Class C Contractor | 2705c__crnt.txt | Many thousands of firms |
2710 | Tradesman Combined (ELE/PLB/HVA/GFC) | 2710__crnt.txt | Tens of thousands of individuals |
2709 | Residential Tradesman | 2709__crnt.txt | Thousands |
2717 | Backflow Prevention Device Worker | 2717__crnt.txt | Hundreds |
2718 | Certified Elevator Mechanic | 2718__crnt.txt | Hundreds |
2719 | Certified Water Well Systems Provider | 2719__crnt.txt | Hundreds |
2722 | Residential Building Energy Analyst | 2722__crnt.txt | Low hundreds |
2723 | Automatic Fire Sprinkler Inspector | 2723__crnt.txt | Low hundreds |
Volumes drift with renewals and new issuances; exact counts vary per run.
Engineering details
- Direct HTTPS GET — no headless browser, no Playwright, no Puppeteer
- Latin-1 decoding — preserves special characters that UTF-8 would mangle
- Tab-delimited parser — splits on
\t, no CSV quoting needed - Header alias map (60+ aliases) — survives field renames like
CERTIFICATE #vsLICENSE_NUMBERvsREG_NUMBER - Address merge — combines line 1 + line 2 + PO Box into one
addressstring - Specialty extraction — splits the
LICENSE SPECIALTYcolumn on commas, slashes and whitespace; deduplicates codes - ZIP cleaner — strips the meaningless
-0000ZIP+4 suffix; preserves real ZIP+4 codes - Date normalization — converts
MM/DD/YYYY,M/D/YYYYandMM-DD-YYYYto canonicalYYYY-MM-DD - Status derivation —
ActivewhenexpirationDate >= today,Expiredwhen earlier,Unknownwhen missing - Unified
namefield —businessNamefor firms,individualNamefor people, so downstream code does not branch - Deterministic output — same input always produces the same dataset shape
- Polite delay — configurable
requestDelaybetween file downloads (default 200 ms)
Input Parameters
{"licenseCodes": ["2701"],"statusFilter": "all","maxRecords": 200,"requestDelay": 200,"proxyConfiguration": { "useApifyProxy": false }}
Parameter reference
| Parameter | Type | Default | Description |
|---|---|---|---|
licenseCodes | array<string> | ["2701"] | DPOR license codes to scrape. Each code downloads a separate regulant file. Empty array ([]) scrapes all ten codes. Valid values: 2701, 2705b, 2705c, 2710, 2709, 2717, 2718, 2719, 2722, 2723. |
statusFilter | string | all | active returns only records whose derived status is Active. all returns Active + Expired + Unknown. |
maxRecords | integer | 200 | Hard cap on total records returned across every requested code. Set 0 for unlimited (recommended for production extracts). |
requestDelay | integer | 200 | Milliseconds to wait between file downloads. Min 0, max 10000. DPOR files are static — low delays are safe. |
proxyConfiguration | object | { "useApifyProxy": false } | Optional Apify proxy. Rarely needed — DPOR serves public files without restrictions. |
Tip: Start with the default
["2701"]andmaxRecords: 200to validate the schema before running an unlimited multi-code pull.
Output Schema
Every record — contractor firm or individual tradesman — uses the same flat JSON shape so downstream ingestors do not need per-category branching.
Fields
| Field | Type | Always Present | Description |
|---|---|---|---|
licenseNumber | string | usually | DPOR-issued certificate or registration number |
individualName | string | null | individual records only | Person name (tradesmen, inspectors, etc.) |
businessName | string | null | contractor records only | Firm / company name |
name | string | yes | Merged name — businessName when present, otherwise individualName |
licenseType | string | yes | Human-readable type label (e.g., Class A Contractor, Tradesman Combined) |
licenseCode | string | yes | DPOR code (2701, 2705b, 2710, etc.) |
board | string | null | usually | DPOR board code from the source file |
occupation | string | null | usually | Occupation code |
classification | string | null | contractors | License rank (A / B / C for contractors, TRAD for tradesmen) |
specialties | array<string> | null | depends | Specialty / designation codes (CBC, RBC, H, MELE, JPLB, etc.) |
status | string | yes | Derived status — Active, Expired, or Unknown |
issueDate | string | null | usually | Original certification date in YYYY-MM-DD |
expirationDate | string | null | usually | Expiration date in YYYY-MM-DD |
address | string | null | usually | Combined street line 1 + line 2 + PO Box |
city | string | null | usually | City |
state | string | null | usually | State abbreviation (mostly VA, but out-of-state firms exist) |
zipCode | string | null | usually | ZIP code, ZIP+4 preserved, -0000 stripped |
country | string | null | rare | Country (typically null for domestic registrants) |
email | string | null | sometimes | Email address on file (DPOR publishes when registrant supplied it) |
scrapedAt | string | yes | ISO-8601 timestamp when the record was extracted |
Example: Class A Contractor record
{"licenseNumber": "2705099999","individualName": null,"businessName": "OLD DOMINION BUILDERS INC","name": "OLD DOMINION BUILDERS INC","licenseType": "Class A Contractor","licenseCode": "2701","board": "0270","occupation": "01","classification": "A","specialties": ["CBC", "RBC", "H"],"status": "Active","issueDate": "2014-06-12","expirationDate": "2026-06-30","address": "4500 VIRGINIA BEACH BLVD, SUITE 200","city": "VIRGINIA BEACH","state": "VA","zipCode": "23462","country": null,"email": "ops@example-odbi.com","scrapedAt": "2026-05-16T11:24:18.412Z"}
Example: Master Electrician (Tradesman Combined) record
{"licenseNumber": "2710099999","individualName": "BERNARD T HOLLAND","businessName": null,"name": "BERNARD T HOLLAND","licenseType": "Tradesman Combined","licenseCode": "2710","board": "0271","occupation": "10","classification": "TRAD","specialties": ["MELE"],"status": "Active","issueDate": "2009-03-04","expirationDate": "2027-02-28","address": "1718 GRANBY ST","city": "NORFOLK","state": "VA","zipCode": "23517","country": null,"email": null,"scrapedAt": "2026-05-16T11:24:18.412Z"}
License Code & Specialty Reference
License codes returned by this actor
| Code | Label | Typical Holders | Notes |
|---|---|---|---|
2701 | Class A Contractor | Construction firms | No dollar ceiling — used for the largest commercial / civil work |
2705b | Class B Contractor | Mid-size firms | Single-contract value $10K–$120K |
2705c | Class C Contractor | Small firms & sole proprietors | Single-contract value $1K–$10K |
2710 | Tradesman Combined | Individuals | Master & Journeyman in ELE / PLB / HVA / GFC |
2709 | Residential Tradesman | Individuals | Residential-only tradesman registration |
2717 | Backflow Prevention Device Worker | Individuals | Certified to test cross-connection backflow devices |
2718 | Certified Elevator Mechanic | Individuals | Installation, repair and inspection of elevators |
2719 | Certified Water Well Systems Provider | Individuals / firms | Well drilling and pump installation |
2722 | Residential Building Energy Analyst | Individuals | Code-required energy performance modelers |
2723 | Automatic Fire Sprinkler Inspector | Individuals | Inspectors of automatic sprinkler systems |
Tradesman designation codes (2710, 2709)
| Master | Journeyman | Trade |
|---|---|---|
MELE | JELE | Electrician |
MPLB | JPLB | Plumber |
MHVA | JHVA | HVAC |
MGFC | JGFC | Gas Fitter — Contractor |
MLPG | JLPG | Liquefied Petroleum Gas |
MNGF | JNGF | Natural Gas Fitter |
Contractor specialty codes (2701 / 2705b / 2705c)
| Code | Specialty | Code | Specialty |
|---|---|---|---|
CBC | Commercial Building Contractor | RBC | Residential Building Contractor |
H | Highway / Heavy Construction | ELE | Electrical Contractor |
PLB | Plumbing Contractor | HVA | HVAC Contractor |
GFC | Gas Fitting Contractor | EMC | Electronic / Mechanical Contractor |
EEC | Elevator / Escalator Contractor | VCC | Vessel Construction Contractor |
CIC | Commercial Improvement Contractor | RFC | Roofing Contractor |
MCC | Marine Construction Contractor | SPC | Specialty Contractor |
WCC | Water / Sewer Contractor | ISC | Incidental Service Contractor |
TCC | Telecommunications Contractor | FPC | Fire Protection Contractor |
BDC | Building Demolition Contractor | LSC | Landscape Service Contractor |
License status values
| Status | Meaning |
|---|---|
Active | expirationDate ≥ today — registrant may legally perform regulated work |
Expired | expirationDate < today — registrant must renew before performing regulated work |
Unknown | No expiration date on the record — status cannot be derived |
DPOR regulant lists do not publish an explicit status column. Suspended or revoked records may be omitted from the files once enforcement actions take effect. For real-time disciplinary detail, cross-reference DPOR's Online Disciplinary Actions lookup.
Use Cases
Construction Lead Generation & Contractor Sales
Material suppliers, equipment vendors, SaaS contractor-management platforms, insurance brokers and bonding agents use this dataset to:
- Build targeted prospect lists of every active Class A, B or C contractor in Virginia, segmented by specialty (RBC, CBC, H, RFC, etc.)
- Score firms by license tier — Class A firms are targets for ERP, fleet, heavy equipment and surety bond offers; Class C firms are the audience for tooling, payment apps and lightweight CRM products
- Route territory assignments by ZIP and metro — Northern Virginia vs Hampton Roads vs Richmond
- Identify newly-issued contractor licenses by diffing this week's run against last week's — fresh firms are the highest-converting cold outreach segment
- Enrich CRM records in Salesforce, HubSpot or Pipedrive with current DPOR license status, classification and specialty
- Time renewal-cycle campaigns so insurance, bonding and software offers land in the 90-day window before
expirationDate
Construction Compliance, Bid Verification & Bonding
GCs, sub-contractor management platforms, prime contractors on public works and surety underwriters use the dataset to:
- Verify subcontractor licensure before award — confirm the bidder holds the correct Class and specialty (e.g., RBC for a residential addition, CBC for commercial fit-out, H for VDOT highway work)
- Maintain rolling compliance dashboards showing every active sub with license expiration date and classification changes
- Trigger non-compliance alerts when a sub's record flips from
ActivetoExpiredmid-project - Document due diligence for owner-required compliance reporting with timestamped
scrapedAtevidence - Streamline bid forms by pre-filling contractor license numbers, business names and addresses from a clean dataset
Skilled-Trades Recruiting & Workforce Sourcing
Electrical, plumbing, HVAC and mechanical contractors competing for journeyman and master tradesmen use this dataset to:
- Source active master and journeyman tradesmen by trade (MELE, JELE, MPLB, JPLB, MHVA, JHVA, MGFC, JGFC) and metro
- Build candidate pipelines for hard-to-fill master electrician, master plumber and master HVAC roles
- Target apprentice-to-journeyman upgraders by mailing CE and exam-prep offers to current journeymen
- Verify candidate self-reported licenses during the interview process
- Plan succession workforce strategy by tracking master-tradesman ratios per metro over time
Insurance Underwriting & Surety Bonding
Carriers writing contractor general liability, workers' comp, professional liability or surety bonds use the dataset to:
- Verify license validity at policy bind and renewal — automatic, no manual lookup
- Tier pricing by classification (Class A firms vs Class C sole-proprietors are different risk profiles)
- Flag mid-term changes — a contractor whose DPOR record expires mid-policy needs an underwriter note before renewal
- Process bond claims faster with pre-verified principal information
Real Estate, Inspection & Home Services
Real estate brokerages, home inspection chains, property managers and renovation marketplaces use DPOR data to:
- Verify licensed contractors referred to clients for repairs, renovations and inspections
- Vet sprinkler inspectors (2723), elevator mechanics (2718) and energy analysts (2722) for commercial property compliance work
- Build Virginia-specific contractor directories on real-estate portals
- Cross-check water-well-system providers (2719) for rural property due diligence
- Confirm credentials of backflow prevention device workers (2717) required by water utilities for cross-connection compliance
Legal, Litigation, M&A & Due Diligence
Construction litigators, M&A advisors, insurers' subro counsel and investigators use the dataset to:
- Verify contractor credentials in mechanics-lien, defect, payment and licensure disputes
- Build chronologies of a firm's license history when combined with archived run snapshots
- Conduct pre-acquisition due diligence on contracting roll-ups — confirm every Virginia operating entity has the right Class license
- Validate expert-witness credentials before engagement on construction-defect matters
- Spot dormant or expired licenses that signal corporate distress or scope reductions
State Workforce, Policy & Economic Research
State agencies, academic researchers, building-trades unions and policy think tanks use DPOR data to:
- Study skilled-trades workforce supply by region — master electrician density per 10,000 housing units, for example
- Inform apprenticeship funding by quantifying journeyman pipelines vs retiring masters
- Track residential vs commercial contractor mix as a leading indicator of building-cycle shifts
- Quantify regulatory load — newly issued certificates by code by year
- Support legislative analysis of license-reform proposals with current empirical data
Journalism, FOIA & Investigative Reporting
Local newsrooms, accountability journalists and FOIA researchers use the dataset to:
- Investigate unlicensed-contractor enforcement by counting active vs known-operating firms in a metro
- Cover post-storm recovery — quantify licensed roofing (RFC) and water/sewer (WCC) capacity after a hurricane
- Profile rapid-growth construction firms by tracking license issuance dates and classification upgrades
- Map contractor footprints for housing affordability, gentrification or development reporting
Sample Queries & Recipes
Recipe 1 — Every active Class A contractor in Virginia Beach
{"licenseCodes": ["2701"],"statusFilter": "active","maxRecords": 0}
Then filter downstream by city.toUpperCase() === "VIRGINIA BEACH".
Recipe 2 — All master tradesmen statewide (recruiting funnel)
{"licenseCodes": ["2710"],"statusFilter": "active","maxRecords": 0}
Filter on specialties for any value beginning with M (MELE, MPLB, MHVA, MGFC, etc.).
Recipe 3 — Full DPOR snapshot for archival / compliance vault
{"licenseCodes": [],"statusFilter": "all","maxRecords": 0,"requestDelay": 500}
Empty licenseCodes array triggers a sweep across all ten codes; bump requestDelay to be extra polite.
Recipe 4 — Northern Virginia residential contractor outreach list
{"licenseCodes": ["2705b", "2705c"],"statusFilter": "active"}
Post-filter city in {"ARLINGTON", "ALEXANDRIA", "FAIRFAX", "RESTON", "MCLEAN", "HERNDON"} and "RBC" in specialties.
Recipe 5 — Hampton Roads commercial GC prospect list
{"licenseCodes": ["2701"],"statusFilter": "active"}
Post-filter city in {"NORFOLK", "VIRGINIA BEACH", "CHESAPEAKE", "NEWPORT NEWS", "HAMPTON", "PORTSMOUTH", "SUFFOLK"} and "CBC" in specialties.
Recipe 6 — Expiring-soon journeyman renewal campaign
{"licenseCodes": ["2710"],"statusFilter": "active"}
Post-filter expirationDate between today and today+90 days; mail CE / exam-prep offers.
Integration Examples
Google Sheets (via the Apify Integration)
- Schedule the actor to run nightly at 2:00 AM Eastern
- Add the Export to Google Sheets Apify integration to the schedule
- Wake up to a fresh Virginia DPOR worksheet refreshed every morning — pivot by classification, ZIP or city
Make.com / Zapier / n8n
Use the Apify connector on any major automation platform to trigger workflows on new regulants (diff today vs yesterday and POST into your CRM), status flips (Active → Expired opens a renewal-outreach task), classification upgrades (Class C → Class B is a buying signal for larger insurance and bonding products) and address changes.
Power BI / Tableau / Looker Studio
Connect the Apify REST API as a data source, refresh on schedule, and build dashboards for active contractor count by metro and classification, tradesman supply maps (Master vs Journeyman density), Class A/B/C mix by ZIP, renewal-cycle pipelines (records expiring in 30/60/90 days) and new-license issuance over time.
Postgres / Snowflake / BigQuery
Use the Apify webhook integration to POST run results directly into your warehouse ingestion endpoint. Schema is stable across runs, so a simple UPSERT ON CONFLICT (licenseNumber, licenseCode) keeps your warehouse current.
Salesforce / HubSpot / Pipedrive CRM Enrichment
Trigger nightly, then upsert against Account records keyed on DPOR licenseNumber. Status change events can auto-create Tasks, Cases or Deals; specialty additions can re-segment the account into new campaign audiences.
Webhooks & CSV Hand-Off
Pipe Dataset.pushData events into Kafka, EventBridge, SNS or a custom webhook for real-time processing, or export the dataset directly to CSV/XLSX from the Apify dataset view.
Major Virginia Markets at a Glance
| Metro / Region | Why It Matters |
|---|---|
| Virginia Beach | Hampton Roads anchor — highest concentration of Class B/C contractors for resort and coastal residential work |
| Norfolk | Port city — strong demand for marine (MCC), commercial building (CBC) and electrical (ELE) specialties |
| Chesapeake | Suburban growth corridor — mix of RBC residential builders and Class C remodelers |
| Newport News & Hampton | Peninsula shipyards — concentration of master tradesmen and Class A firms supporting Newport News Shipbuilding |
| Richmond | Capital region — largest concentration of Class A general contractors and electrical (ELE/EEC) firms |
| Arlington & Alexandria | Northern Virginia tech & federal — high-density commercial improvement (CIC), TI work and elevator mechanic (2718) coverage |
| Fairfax County (Reston, Herndon, McLean, Vienna) | Top market for RBC residential builders, HVAC and energy analysts (2722) |
| Loudoun County (Leesburg, Ashburn) | Data-center alley — massive electrical (ELE) and fire-protection (FPC) contractor demand |
| Prince William County (Manassas, Woodbridge) | Suburban growth — strong Class B residential and commercial builder pool |
| Roanoke | Western Virginia hub — mid-market contractor activity for the Blue Ridge corridor |
| Charlottesville | University & residential — high-end builders and historic-renovation specialists |
| Fredericksburg | I-95 commuter corridor — fast-growing Class B/C residential builder market |
| Petersburg & Tri-Cities | Industrial corridor south of Richmond — manufacturing and heavy-construction (H) presence |
Cost & Performance
| Metric | Value |
|---|---|
| Engine | Direct HTTPS GET — no browser overhead |
| Runtime (all ten codes, unfiltered) | Typically 1–3 minutes |
| Runtime (single code, capped at 200) | 5–15 seconds |
| Cost per full run | Small fraction of a Compute Unit (typically pennies) |
| Pricing model | Pay-per-event (transparent per-record pricing) |
| Data freshness | Live at run time — DPOR refreshes the files periodically |
| Auth required | None (DPOR files are public) |
| Proxy required | None |
| Concurrency | Safe to run multiple filtered configurations in parallel |
| Memory footprint | 256 MB sufficient for a full unfiltered run |
Default maxRecords | 200 (raise to 0 for unlimited) |
Compliance, Privacy & Legal Notes
- Public data only — every field is published by DPOR on
dpor.virginia.govunder Virginia's public records framework - No PHI — these are licensing records, not patient data; HIPAA does not apply
- No SSNs, DOBs or financial data — only license-related public information
- Address data is the registrant's business or mailing address (sole proprietors are an occasional exception)
- Emails appear only when the registrant supplied one; many records have none
- No disciplinary detail — consult DPOR's Online Disciplinary Actions lookup for enforcement history
- Use restrictions — DPOR data may not be used for unlawful purposes including identity fraud, stalking, harassment or unsolicited messaging in violation of CAN-SPAM, TCPA, GDPR or CCPA
- No warranty — cross-verify with DPOR's official lookup before relying on it for legal, regulatory or contracting decisions
Important: Compliance with CAN-SPAM, TCPA, GDPR, CCPA and Virginia consumer protection law is the responsibility of the data consumer. This actor merely extracts already-public records.
Frequently Asked Questions
How fresh is the data?
The actor downloads DPOR's published regulant files at run time, so freshness equals DPOR's own publication cadence. DPOR refreshes the lists periodically; runs are always live against whatever DPOR is currently serving.
Does this scraper require login or API keys to DPOR?
No. DPOR posts the regulant lists as public, unauthenticated files. You only need an Apify account to run the actor.
How many records will I get?
It depends on the codes you request. A full unfiltered run across all ten codes returns tens of thousands of records — the bulk is in 2710 (Tradesman Combined) and 2705c (Class C Contractor). Smaller codes like 2722 (Energy Analysts) and 2723 (Sprinkler Inspectors) return only hundreds.
What is the default maxRecords and why?
200. The default cap exists to make first-time runs and validation cheap and fast. Set maxRecords: 0 for unlimited extraction in production.
Does this actor work for other states?
Not this actor — DPOR is Virginia-specific. Sibling actors cover Arizona, California, Colorado, Illinois, Minnesota, North Carolina, Ohio, Texas and Washington. See Related Apify Actors by Haketa below.
Are emails included?
Sometimes. DPOR publishes the EMAILADDRESS column when the registrant supplied one. Many records have no email at all — Master Plumbers and older licenses are especially likely to be missing email.
Why is status "Active" or "Expired" instead of "Suspended" or "Revoked"?
DPOR's published regulant files do not carry a status column. Suspended or revoked licenses may simply be omitted from the file. The actor derives status from expirationDate versus today's date. For disciplinary detail, cross-reference DPOR's online lookup.
What is the difference between Class A, B and C contractors?
DPOR ties classification to single-contract dollar value. Class A firms have no upper limit (largest commercial and civil work), Class B covers $10,000–$120,000 contracts, and Class C covers $1,000–$10,000 contracts. Larger classifications require more experience, financial responsibility and exam credentials.
What do MELE, JPLB, MHVA etc. mean?
These are tradesman designation codes returned in the specialties array. The first letter encodes Master (M) or Journeyman (J), the rest encode the trade — ELE electrical, PLB plumbing, HVA HVAC, GFC gas fitting. See the License Code & Specialty Reference section above for the full table.
Can I get the disciplinary history of a contractor?
Not from the regulant lists. DPOR maintains a separate Disciplinary Actions search on its website for enforcement history.
Can I filter by city or ZIP inside the actor?
The actor does not currently accept city or ZIP filters — keep the request small with maxRecords and filter downstream by city, zipCode or state. This keeps the actor lightweight and the input schema simple.
Can I filter by classification or specialty inside the actor?
Same answer — filter downstream. The data is small enough that downstream filtering in your warehouse, sheet or notebook is the easiest path.
Does the actor deduplicate?
Each file is deduplicated by DPOR by license number within that code; the actor preserves that. Across codes, the same individual could hold multiple licenses (e.g., a 2710 tradesman who also owns a 2705c contracting firm) — those are intentionally returned as separate records.
Is residential proxy access required? Is there a historical snapshot?
No proxy is required — DPOR does not rate-limit the public files. No historical snapshot is provided by DPOR; to build a history, schedule this actor daily or weekly and archive each dataset (Apify retains datasets indefinitely on most plans).
Can I get federal NPI, EIN or DUNS numbers?
No. Those identifiers are issued by federal agencies, not DPOR. Cross-reference license numbers with SAM.gov or another federal registry — the sibling SAM.gov Federal Contractor Scraper can help.
Does this actor work on the Apify Free Plan? Can I schedule it?
Yes to both — full functionality on the free tier, typical runs are pennies, and Apify's built-in Scheduler triggers the actor on any cron expression. Combine with webhook outputs for a fully automated pipeline.
What formats can I export the data in?
JSON, CSV, Excel (XLSX), HTML, XML and RSS — directly from the Apify dataset view. The API also supports JSON Lines for streaming consumers.
Related Apify Actors by Haketa
If you need licensing or contractor data from other US states, related construction-industry directories, or federal contractor registries, the following sibling actors plug into the same workflows:
- Arizona ROC Contractor License Scraper — Arizona Registrar of Contractors
- California DCA Professional License Scraper — California Department of Consumer Affairs
- Colorado Professional License Scraper — Colorado DORA
- Illinois IDFPR License Scraper — Illinois professional licensing
- Minnesota DLI Professional License Scraper — Minnesota Department of Labor & Industry
- North Carolina Licensing Board for General Contractors Scraper — NCLBGC
- Ohio eLicense Scraper — Ohio multi-board licensing
- Texas Pharmacy License Scraper — TSBP — Texas State Board of Pharmacy
- Washington L&I Contractor License Scraper — Washington Labor & Industries
- TTB Alcohol Permittee Scraper — Federal alcohol industry permits
- SAM.gov Federal Contractor Entity Scraper — Federal contractor registry
- BBB Business Scraper — Better Business Bureau reputation data
Comparison vs. Alternatives
| Approach | Setup time | Data freshness | Cost (10K records) | Schema normalization | Multi-code support | Audit log |
|---|---|---|---|---|---|---|
| This actor | < 1 minute | Live at run time | Pennies | Built-in | Built-in (10 codes) | Automatic scrapedAt |
| Manual file download from DPOR | 10–30 min × 10 files | Live | Free | None | Manual | None |
| Custom Node / Python parser | 6–12 hours dev | Live | Free + infra | DIY | DIY | DIY |
| Paid contractor-data API | Hours of integration | Vendor-dependent | $200–$1,000+/mo | Vendor format | Limited | Vendor portal |
| DPOR FOIA / records request | Days–weeks | Stale by delivery | Variable | None | Single-shot | None |
| Manual DPOR online lookup | Per-record, minutes each | Live | Free | None | Single record | None |
Why Pay-Per-Event Pricing?
Most data scrapers either charge a flat monthly subscription you pay even when idle, or charge by raw Compute Units that are hard to forecast. Pay-per-event pricing means:
- You only pay when the actor runs
- Charges scale with how much data you actually consume
- Transparent, line-item billing inside Apify
- No monthly minimums and no seat fees
- Free to evaluate with
maxRecords: 200for pennies before a full extract - Predictable budgeting — cost scales linearly with records returned
Changelog
| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-05 | Initial public release — direct DPOR file download, all ten license codes, header alias map (60+ aliases), specialty extraction, address merge, ZIP cleanup, status derivation, pay-per-event pricing |
Keywords
Virginia DPOR license lookup · VA professional license scraper · Virginia contractor verification · Richmond license data · DPOR license search · Virginia real estate license lookup · Virginia DPOR scraper · Virginia DPOR API · dpor.virginia.gov scraper · Virginia Class A contractor list · Virginia Class B contractor data · Virginia Class C contractor directory · Virginia tradesman license lookup · Virginia master electrician database · Virginia journeyman plumber list · Virginia HVAC contractor verification · Virginia gas fitter license · Virginia DPOR regulant list · Virginia DPOR bulk download · Virginia construction license API · Virginia contractor compliance data · Virginia contractor lead generation · Virginia DPOR CSV · Virginia DPOR txt file · Virginia DPOR data extraction · Virginia DPOR Apify actor · Hampton Roads contractor list · Northern Virginia contractor database · Richmond contractor leads · Norfolk contractor directory · Virginia Beach contractor data · Arlington contractor lookup · Alexandria contractor list · Chesapeake contractor database · Newport News contractor directory · Hampton contractor data · Virginia electrician scraper · Virginia plumber scraper · Virginia HVAC scraper · Virginia gas fitter scraper · Virginia elevator mechanic directory · Virginia backflow prevention worker list · Virginia water well systems provider data · Virginia residential building energy analyst · Virginia automatic fire sprinkler inspector · Virginia contractor renewal monitoring · Virginia license verification API · Virginia construction lead lists · Virginia tradesman CE marketing · Virginia surety bond underwriting data · contractor license verification Virginia · Virginia DPOR open data · Virginia DPOR public records · Virginia regulant download · Virginia DPOR JSON API · Virginia contractor classification lookup · Virginia license expiration tracker
Support
- Bug reports: Use the Issues tab on the Apify Store actor page
- Feature requests: Same place — please describe your use case so we can prioritize
- Direct contact: Through the Apify developer profile messaging
- Custom builds: Need DPOR Disciplinary Actions integration, a hosted webhook diff service, a Snowflake-native version, or city-level filtering inside the actor? Open an issue describing the use case.
If this actor saves your team time on Virginia contractor research, compliance verification, recruiting outreach or underwriting workflows, a 5-star rating on the Apify Store helps other construction, insurance and policy teams discover it. Thank you for using the Virginia DPOR Professional License Scraper!