DPOR
Virginia Contractor Directory & Leads Scraper (DPOR)
Every licensed Virginia contractor in a county, city or ZIP, by trade — business name, email, mailing address, licence class, trades and expiry — from DPOR's Board for Contractors licence lists.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
business_name | string|null |
individual_name | string|null |
email | string|null |
phone | string|null |
address | string|null |
city | string|null |
zip_code | string|null |
address_state | string|null |
state | string|null |
county | string|null |
county_method | string|null |
license_number | string|null |
board_occupation | string|null |
license_class | string|null |
license_type | string|null |
status | string|null |
specialties | array|null |
specialty_labels | array|null |
certification_date | string|null |
expiration_date | string|null |
requested_county | string|null |
requested_city | string|null |
requested_zip | string|null |
requested_trade | string|null |
matched_by | string|null |
county_name | string|null |
trade | string|null |
trade_code | string|null |
notice | string|null |
notice_type | string|null |
source_url | string|null |
Sample row
{
"business_name": "FSR ROOFING CONTRACTOR INC",
"individual_name": null,
"email": "fsrconstruction4u@gmail.com",
"address": "8300 OLD COURTHOUSE RD",
"city": "VIENNA",
"zip_code": "22182",
"address_state": "VA",
"county": "Fairfax County",
"county_method": "zip_single",
"license_class": "B",
"license_type": "Class B Contractor",
"specialties": [
"ROC",
"HIC"
],
"specialty_labels": [
"Roofing",
"Home Improvement"
],
"certification_date": "03/09/2004",
"expiration_date": "12/31/2027",
"license_number": "083272",
"board_occupation": "2705",
"phone": null,
"requested_county": "Fairfax County",
"requested_trade": "Roofing",
"source_url": "https://www.dpor.virginia.gov/sites/default/files/Records%20and%20Documents/Regulant%20List/2705b__crnt.txt"
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
listOptionsOnly | boolean | no | false | 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. |
trade | string | no | "Roofing" | 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 | ["Roofing","Electrical"] | 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. |
county | string | no | "Fairfax County" | 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 | [] | Several counties or independent cities in ONE run. Combined with 'County' if you fill both. |
city | string | no | — | The city on the licence's mailing address, e.g. 'Vienna', 'Virginia Beach'. Exact match, case-insensitive. |
cities | array | no | [] | Several mailing cities in ONE run, each searched separately. |
zip | string | no | — | A 5-digit ZIP code, matched exactly against the licence's mailing ZIP, e.g. '22182'. |
zips | array | no | [] | Several ZIP codes in ONE run, each searched separately. |
licenseClasses | array | no | ["A","B","C"] | Which DPOR licence classes to include: A, B, C, and RETR (residential tradesman). Only those files are downloaded. Default: A, B and C. |
inVirginiaOnly | boolean | no | true | 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. |
maxResults | integer | no | — | Cap on the contractors returned PER place + trade search, not per run, so adding places can never silently truncate the ones later in the list. Leave empty to return every match. |
proxyConfiguration | object | no | {"useApifyProxy":false} | Optional. DPOR answers direct requests; enable a proxy only if runs come back with a 'blocked' notice. |
Pricing
Pay per result (dataset-item) — no charge for empty runs.
Example: 118 Fairfax County roofing contractors at $0.002/result ≈ $0.24.
FAQ
Where does the data come from?
Virginia DPOR's public regulant lists — one tab-delimited file per licence class (Class A, B, C, legacy Class A, temporary and residential tradesman), published at dpor.virginia.gov/RegulantLists. They list current licences and were last refreshed 2026-10-05 when we checked. This actor downloads only the classes your run needs.
Is there a phone number?
No. DPOR's licence lists publish no phone number for any licence, so the phone field is always null. Email is on 41,484 of 53,779 licences (77%, 2026-10-06), and the mailing address and ZIP on every one.
How accurate is the county?
Approximate. DPOR records no county, so it is derived from the mailing ZIP with the Census Bureau's 2020 ZIP-to-county file. Of 43,223 Virginia-address licences, 24,189 have a ZIP that lies in one county (county_method zip_single), 18,652 a ZIP that crosses a county line, where we use the county holding most of the ZIP (zip_majority), and 382 a PO-box ZIP with no area (unmapped, never matched by a county search). If you need precision, use the city or ZIP filter, which are exact.
Why does 'Fairfax' not work as a county?
Fairfax, Franklin, Richmond and Roanoke are each both a county and an independent city in Virginia. Say 'Fairfax County' or 'Fairfax city' (or 'City of Fairfax'); a bare name returns the free county list rather than guessing. Some small independent cities, Fairfax city among them, cover no ZIP's majority, so a county search for them returns a free row naming the ZIPs to search instead.
How many contractors does a search return?
Counted 2026-10-06, all three classes: Fairfax County roofing 118, electrical 451, home improvement 1,575; Richmond city roofing 13, electrical 41, home improvement 144.
How do I name a trade?
By name ('Roofing', 'Electrical', 'HVAC', 'Home Improvement'), by a word from the name ('roof' finds Roofing), or by DPOR code ('ROC', 'H/H'). Turn on Discovery Mode to get every trade with its code, free.
What about out-of-state contractors?
10,556 of DPOR's licences have a mailing address outside Virginia. They are left out by default; turn off 'Virginia addresses only' to include them on a statewide trade search.
How am I charged?
One event per contractor returned ($0.002). A licence that matches two of your searches is returned and charged once. The county and trade lists, and any row explaining a source or input problem, are free.
Guides & use cases
Related actors