Use case
Build a Richmond, VA HVAC and Electrical Contractor List
Every DPOR-licensed electrical and HVAC contractor in Richmond city and Henrico County, Virginia, with email, mailing address, licence class, trades and expiry.
Suppose you run the contractor network for a home-warranty company, and Richmond is the market where your service calls keep sitting unassigned: broken heat pumps, dead outlets, a panel that trips. You want to recruit more licensed HVAC and electrical firms in Richmond city and Henrico County, by email, and you want the recruiting list refreshed every few months so an expired licence never gets a dispatch. Virginia’s Board for Contractors, run by DPOR, licenses every one of those firms. On 2026-10-06 the two places held 330 current licences carrying an Electrical or HVAC trade.
The manual way, and what it costs
The free route is real and worth knowing. DPOR publishes every current contractor licence as tab-delimited text files, one per licence class, and on 2026-10-06 the five files behind Class A, B and C held 53,760 licences between them. Open them in Excel, stack them, and filter the trade column, which holds space-separated codes: electrical is ELE and HVAC is HVA. If your network team already works from a fixed list of service ZIP codes, filter the files on those ZIPs and stop there; for one recruiting push that is good enough, and it costs nothing.
What makes it slow is geography. The files carry a mailing ZIP and no county or city jurisdiction, and Richmond is a hard place to guess: 140 of the 255 Henrico County firms in this list have RICHMOND as their mailing city. “Richmond” on its own is also two places in Virginia, Richmond city and Richmond County on the Northern Neck, so a city-name filter answers the wrong question twice.
The faster way
Virginia Contractor Directory & Leads Scraper (DPOR) runs that search once and returns one row per licence.
{
"counties": ["Richmond city", "Henrico County"],
"trades": ["Electrical", "HVAC"]
}
Write “Richmond city” exactly; a bare “Richmond” is ambiguous, and the actor returns the free list of county and city names rather than picking one for you. The run downloads DPOR’s files once and does four searches, one per county and trade. The log for 2026-10-06 read 41 electrical and 45 HVAC in Richmond city, 158 electrical and 124 HVAC in Henrico. A firm licensed for both trades turns up in both searches but comes back, and is charged, once: 11 such repeats in Richmond city and 27 in Henrico, which is how 368 matches become 330 rows. Locally the whole run took 8.1 seconds.
What comes back
{
"business_name": "CHEWNING & WILMER INC",
"email": "info@cw1924.com",
"address": "2508 MECHANICSVILLE TPKE",
"city": "RICHMOND",
"zip_code": "23223",
"county": "Henrico County",
"county_method": "zip_majority",
"license_class": "A",
"license_type": "Class A Contractor",
"specialties": ["GFC", "PLB", "HVA", "ELE", "VCC", "H/H", "EMC"],
"specialty_labels": ["Gas Fitting", "Plumbing", "HVAC", "Electrical", "Vessel Construction", "Highway/Heavy", "Equipment/Machinery"],
"expiration_date": "05/31/2027",
"license_number": "000006",
"board_occupation": "2701",
"phone": null,
"requested_county": "Henrico County",
"requested_trade": "Electrical"
}
That row shows the Richmond trap in one line: a RICHMOND mailing city, filed under Henrico County. For recruiting, email is the column that matters, and it is filled on 262 of the 330 rows, 79%: 60 of 75 in Richmond city and 202 of 255 in Henrico. Every row has a mailing address. Expect personal webmail on a large share; 123 of those 262 addresses are Gmail, Yahoo, Hotmail, AOL, Outlook, iCloud, Comcast or Verizon, which is what small trade firms use.
Use specialties to sort the bench, not requested_trade. The second only records which search found the firm first, so 131 rows say HVAC while 169 rows actually hold the HVA code; 199 hold ELE, and 38 hold both. For a warranty network the 86 firms that also hold Gas Fitting (GFC) are worth their own segment, since a gas furnace call needs that licence too. Licence class splits 204 Class A, 63 Class B and 63 Class C.
What you’d do with it
Export the dataset as CSV and send your recruiting email to the 262 rows with an address, starting with the 38 dual-trade firms that could take either kind of call. Mail a letter to the other 68 using the mailing address. Import with board_occupation and license_number together as the key, so a later run updates the same records. Then put the run on an Apify schedule: at today’s 330 rows it costs $0.66 a time ($0.002 a row), and 35 of these licences carry a 2026 expiry date, so the next pull tells you which of them renewed before you dispatch to them again.
Worth knowing
There is no phone number in any row. DPOR publishes none, as its own page says, so phone is null on all 330, and a recruiting team that works by phone needs another source. The county comes from the mailing ZIP and is approximate: 160 of the 330 rows sit in a ZIP that crosses a boundary and were assigned to the county that holds most of it (county_method reads zip_majority), including 50 of the 75 in Richmond city. If your service area is defined by ZIP codes, search with zips instead, which match exactly. A firm is listed only where its mailing address is, not everywhere it works, and these are current licences only. For a single county and trade the free file is fine; the Fairfax County roofing list walks through that comparison in more detail.
Run it yourself: How to run Virginia Contractor Directory & Leads Scraper (DPOR) covers each step.
Before a new firm takes its first warranty call, check its licence on its own with Virginia Contractor License Lookup.
Last updated 2026-10-06