DPOR Bulk
Virginia Contractor License Lookup (DPOR Bulk)
Download and filter 50,000+ Virginia DPOR contractor licenses — Class A, B & C plus tradespeople — by name, or by county, city, ZIP and trade, direct from the official regulant lists. No CAPTCHA, no auth.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
license_number | string|null |
license_type | string|null |
license_rank | string|null |
individual_name | string|null |
business_name | string|null |
address | string|null |
city | string|null |
state | string|null |
zip_code | string|null |
country | string|null |
expiration_date | string|null |
certification_date | string|null |
specialties | array|null |
email | string|null |
source_url | string|null |
Sample row
{
"license_number": "082040",
"license_type": "Class A Contractor",
"license_rank": "A",
"business_name": "CORNERSTONE ENGINEERING AND CONSULTING SERVICES PLLC",
"individual_name": null,
"address": "1272 NELLIE JONES RD",
"city": "LA CROSSE",
"state": "VA",
"zip_code": "23950",
"country": null,
"expiration_date": "02/29/2028",
"certification_date": "02/03/2004",
"specialties": [
"EMW",
"ENV"
],
"email": "bdougherty@cornerstoneusa.net",
"source_url": "https://www.dpor.virginia.gov/RegulantLists"
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
mode | string | no | "auto" | auto (default): names below run a name search, a county / city / ZIP / trade runs the directory export, nothing exports the licence types picked. lookup: name search only. export: names ignored. |
queries | array | no | [] | Same as 'Name filters': business or individual names, each matched as a case-insensitive substring. DPOR publishes no licence-number search. |
query | string | no | — | One name; same as 'Name filter'. |
licenseTypes | array | no | ["class_a","class_b","class_c"] | Which DPOR license categories to include. Leave empty for Class A, B, and C contractors. Valid values: class_a, class_a_legacy, class_b, class_c, temporary, residential_tradesman, backflow_prevention, elevator_mechanic, water_well_provider, accessibility_mechanic, energy_analyst, energy_analyst_firm, sprinkler_inspector. |
nameFilter | string | no | — | Only return records where the individual or business name contains this text (case-insensitive). Leave blank for all. |
nameFilters | array | no | [] | Look up many in ONE run instead of starting a run per lookup. Takes the same values as 'Name filter'. Combined with 'Name filter' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per record returned, not per entry submitted. |
cityFilter | string | no | — | Only return records where the city contains this text (case-insensitive). Leave blank for all. |
maxResults | integer | no | 500 | Cap on the number of records returned PER ENTRY, not per run — so a batch cannot silently return only the first 500 rows overall and read as 'the rest don't exist'. |
county | string | no | — | Directory export (by place and trade, with county derived from the ZIP): A Virginia county or independent city, e.g. 'Fairfax County', 'Richmond city', 'City of Fairfax', 'Loudoun'. Fairfax, Franklin, Richmond and Roanoke are each both a county and a city, so say which. APPROXIMATE: DPOR records no county, so it is derived from the mailing ZIP (each row's county_method says how). For an exact match use City or ZIP. An unrecognised name returns the free county and trade lists instead of failing. |
counties | array | no | [] | Directory export (by place and trade, with county derived from the ZIP): Several counties or independent cities in ONE run. Combined with 'County' if you fill both. |
city | string | no | — | Directory export (by place and trade, with county derived from the ZIP): The city on the licence's mailing address, e.g. 'Vienna', 'Virginia Beach'. Exact match, case-insensitive. |
cities | array | no | [] | Directory export (by place and trade, with county derived from the ZIP): Several mailing cities in ONE run, each searched separately. |
zip | string | no | — | Directory export (by place and trade, with county derived from the ZIP): A 5-digit ZIP code, matched exactly against the licence's mailing ZIP, e.g. '22182'. |
zips | array | no | [] | Directory export (by place and trade, with county derived from the ZIP): Several ZIP codes in ONE run, each searched separately. |
trade | string | no | — | Directory export (by place and trade, with county derived from the ZIP): A DPOR trade, by name or code, e.g. 'Roofing', 'Electrical', 'HVAC', 'Home Improvement', 'ROC'. A word from the name works too: 'roof' finds Roofing. Leave it empty to get every trade in the place. |
trades | array | no | [] | Directory export (by place and trade, with county derived from the ZIP): Several trades in ONE run, e.g. Roofing and Electrical. Combined with 'Trade' if you fill both. A contractor holding two of them is returned (and billed) once. |
licenseClasses | array | no | — | Directory export (by place and trade, with county derived from the ZIP): Which DPOR licence classes to include: A, B, C, and RETR (residential tradesman). Only those files are downloaded. Empty = A, B and C; when empty, the License types above pick the classes. |
inVirginiaOnly | boolean | no | — | Directory export (by place and trade, with county derived from the ZIP): Keep only licences with a Virginia mailing address. About 20% of DPOR's licences have an out-of-state address; turn this off to include them on a statewide trade search. Unset = on. |
listOptionsOnly | boolean | no | false | Directory export (by place and trade, with county derived from the ZIP): If true, skip the download and return Virginia's 95 counties and 38 independent cities plus every trade DPOR's Board for Contractors licenses, with its code. Free, not charged. |
expiresAfter | string | no | — | Only licences expiring on or after this date (YYYY-MM-DD). With 'Expires on or before' it lists licences due for renewal in a window. Works on exports and name searches. |
expiresBefore | string | no | — | Only licences expiring on or before this date (YYYY-MM-DD). |
proxyConfiguration | object | no | {"useApifyProxy":false} | Optional. DPOR's files are reachable directly; a proxy is not needed. |
Pricing
Pay per result (dataset-item) — no charge for empty runs.
Example: 1000 license records at $0.004/result ≈ $4.00.
FAQ
Where does the data come from?
Virginia DPOR publishes free public 'Regulant Lists' as tab-delimited files updated every ~5 business days. This actor downloads and parses those official files directly.
What license types are covered?
Class A, B, and C contractors (the main categories); plus residential tradespeople, backflow prevention workers, elevator mechanics, water well providers, accessibility mechanics, residential energy analysts, and sprinkler inspectors. See licenseTypes input for the full list.
How current is the data?
DPOR refreshes the regulant-list files every ~5 business days (usually Mondays). Each run fetches the current file at that moment.
Can I filter by specialty?
Each record includes a specialties field (e.g. CBC = Commercial Building Construction, ELE = Electrical, H/H = Heating & Air Conditioning). You can filter post-run on this field; the actor's nameFilter and cityFilter cover the most common pre-run narrowing needs.
Can I get every contractor in a county, by trade?
Yes. Give a county or independent city (Fairfax County, Richmond city), a mailing city or a ZIP, and a trade by name or DPOR code (Roofing, Electrical, HVA). Each search returns every matching licence once, with the county derived from the mailing ZIP. Set 'Discovery Mode' to list the accepted counties and trades for free.
How am I charged?
Pay per license record returned. Runs that return no matching records are not charged.
Does this need any account or API key?
No — the DPOR regulant lists are free public files, no auth required.
Guides & use cases
Related actors