← Health board

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.

100%golden-diff pass
Run it on Apify → verified nightly

Verification

100%golden-diff success
43canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
license_numberstring|null
license_typestring|null
license_rankstring|null
individual_namestring|null
business_namestring|null
addressstring|null
citystring|null
statestring|null
zip_codestring|null
countrystring|null
expiration_datestring|null
certification_datestring|null
specialtiesarray|null
emailstring|null
source_urlstring|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

FieldTypeReqDefaultDescription
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