Virginia Contractor License Lookup — Class A, B & C Lists avatar

Virginia Contractor License Lookup — Class A, B & C Lists

Pricing

from $4.00 / 1,000 contractor license records

Go to Apify Store
Virginia Contractor License Lookup — Class A, B & C Lists

Virginia Contractor License Lookup — Class A, B & C Lists

Look up Virginia contractor licenses in bulk: export DPOR Class A, B, C and temporary contractors with specialties, expiry dates and emails. USD 5 per 1,000.

Pricing

from $4.00 / 1,000 contractor license records

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

13 hours ago

Last modified

Categories

Share

Virginia Contractor License Lookup exports Virginia DPOR contractor license records in bulk: certificate number, Class A, B, C or temporary class, business or individual name, mailing address, specialty codes, certification and expiration dates, and the email DPOR publishes. It costs USD 5.00 per 1,000 records on the FREE tier (USD 0.005 per record plus one USD 0.005 start fee), and you pay only for records written to your dataset.

It is built for compliance teams, suppliers, insurers, lenders, recruiters and lead-generation teams that need the Virginia contractor list as a spreadsheet instead of checking one license at a time.

What does the Virginia contractor license lookup return?

It returns one row per unique DPOR certificate number, read from DPOR's official current-regulant files for the classes you select.

FieldWhat it holds
licenseNumberDPOR certificate number as text, leading zeroes kept (068419)
licenseType, licenseTypesClass A Contractor, Class B Contractor, Class C Contractor or Temporary Contractor; a certificate that appears on two lists keeps both
licenseRankRank code from the list, such as A
businessName, individualNameLicensed business and, where listed, the individual
address, addressLine1, addressLine2, poBox, city, state, zipCode, zipCodeExtensionMailing address fields, plus the joined address
province, country, postalCodeFilled for addresses outside the United States
certificationDate, expirationDateDates as DPOR prints them (MM/DD/YYYY)
specialtiesDPOR specialty codes, for example CBC (commercial building) or RBC (residential building)
emailEmail published in the DPOR list, or null
sourceFileCode, sourceListCodes, sourceUrl, sourceListUrl, sourceFileLastModifiedThe official file each row came from and DPOR's last-modified time
scrapedAt, warningsRetrieval time and any per-row note

DPOR's contractor lists do not contain phone numbers or disciplinary history, and they have no separate status column: they list certificates on file when DPOR last refreshed the file. DPOR says it updates these lists every five business days.

How do I look up Virginia contractor licenses in bulk?

Choose the license classes, add optional filters, and set maxResults. The prefilled run downloads the Class A files and returns the first 100 records; it finished in about 3 seconds on 2026-10-26.

{
"licenseTypes": ["class_a", "class_b", "class_c"],
"nameFilters": [],
"licenseNumbers": [],
"cityFilter": "RICHMOND",
"stateFilter": "VA",
"maxResults": 1000,
"includeEmail": true
}
  • licenseTypes: any of class_a, class_b, class_c, temporary. Class A reads two DPOR files (2705a and 2701) and merges certificates that appear in both.
  • nameFilters: up to 10 case-insensitive fragments matched against business and individual names.
  • licenseNumbers: up to 1,000 exact certificate numbers.
  • cityFilter and stateFilter: exact matches on the mailing address. Many Class A holders have out-of-state addresses, so leave stateFilter empty to keep them.
  • maxResults: 1 to 50,000 unique records. includeEmail: false returns email as null.

Filters run on the downloaded official files, not on DPOR's interactive lookup page, so a filter never triggers extra requests to DPOR.

Can I check a list of contractor license numbers at once?

Yes. Put the numbers in licenseNumbers and select the classes they belong to (or all four). The run returns one row per number it finds and charges only for those rows; numbers that are not on the selected lists are simply absent from the dataset. That lets you check contractor licenses in Virginia for a vendor file of hundreds of companies in one run.

When should I use this Actor, and when not?

Use it when you need:

  • every Virginia Class A, B, C or temporary contractor, or a filtered slice by city, state or name;
  • a recurring compliance refresh of the contractors you already work with;
  • a lead or territory list of licensed general contractors with specialty codes and published emails.

Do not use it for:

Output example

Two records from the 2026-10-26 default run:

[
{
"licenseNumber": "175352",
"licenseType": "Class A Contractor",
"licenseTypes": ["Class A Contractor"],
"licenseRank": "A",
"businessName": "WOOD GROUP USA INC",
"individualName": null,
"address": "17325 PARK ROW, HOUSTON, TX, 77084",
"addressLine1": "17325 PARK ROW",
"addressLine2": null,
"poBox": null,
"city": "HOUSTON",
"state": "TX",
"zipCode": "77084",
"zipCodeExtension": "0000",
"province": null,
"country": null,
"postalCode": null,
"expirationDate": "04/30/2027",
"certificationDate": "04/06/2021",
"specialties": ["EMC", "H/H"],
"email": "licensing@woodplc.com",
"sourceFileCode": "2705a",
"sourceListCodes": ["2705a"],
"sourceUrl": "https://www.dpor.virginia.gov/sites/default/files/Records%20and%20Documents/Regulant%20List/2705a__crnt.txt",
"sourceListUrl": "https://www.dpor.virginia.gov/RegulantLists",
"sourceFileLastModified": "Tue, 20 Oct 2026 13:13:19 GMT",
"scrapedAt": "2026-10-26T07:21:34.381Z",
"warnings": []
},
{
"licenseNumber": "068419",
"licenseType": "Class A Contractor",
"licenseTypes": ["Class A Contractor"],
"licenseRank": "A",
"businessName": "GHD SERVICES INC",
"individualName": null,
"address": "320 GODDARD WAY, STE 200, IRVINE, CA, 92618",
"addressLine1": "320 GODDARD WAY",
"addressLine2": "STE 200",
"city": "IRVINE",
"state": "CA",
"zipCode": "92618",
"expirationDate": "04/30/2028",
"certificationDate": "04/22/2002",
"specialties": ["H/H"],
"email": "na-licensing@ghd.com",
"sourceFileCode": "2705a"
}
]

The second record is shortened; every row has the same fields as the first. The run's OUTPUT record lists the files read, DPOR's list update date, duplicates merged and malformed rows skipped (15 rows with a broken column count were skipped in the default run rather than mapped to the wrong columns).

How much does a Virginia contractor license export cost?

Pay per event, with Apify platform usage included. Records are charged automatically, one event per dataset row, after the row is stored.

EventFREEBRONZESILVERGOLD / PLATINUM / DIAMOND
Actor start (per started GB of allocated memory)USD 0.005USD 0.005USD 0.005USD 0.005
Contractor license recordUSD 0.005USD 0.004875USD 0.00475USD 0.004

The Actor runs at 256 MB by default (512 MB maximum), so every run has exactly one start event.

  • Default run, 100 records (FREE): 0.005 + 100 × 0.005 = USD 0.505.
  • 5,000 records (FREE): 0.005 + 5,000 × 0.005 = USD 25.005; on GOLD, 0.005 + 5,000 × 0.004 = USD 20.005.

maxResults caps the record charges, and the run honors your maxTotalChargeUsd limit.

Use it from an AI assistant

The Actor works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/virginia-contractor-license-lookup to your client.

Example prompt: "List 50 Class B contractors in Virginia Beach, Virginia, with license number, specialties, expiration date and email."

Run it from the API

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/virginia-contractor-license-lookup').call({
licenseTypes: ['class_a', 'class_b', 'class_c'],
cityFilter: 'RICHMOND',
maxResults: 250,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python (apify-client 3.x):

from apify_client import ApifyClient
client = ApifyClient(token='YOUR_APIFY_TOKEN')
run = client.actor('muhammadafzal/virginia-contractor-license-lookup').call(run_input={
'licenseTypes': ['class_a', 'class_b', 'class_c'],
'licenseNumbers': ['175352', '068419'],
'maxResults': 100,
})
items = client.dataset(run.default_dataset_id).list_items().items

FAQ

Is this the official DPOR contractor license lookup?

No. It is an independent Actor that reads DPOR's public regulant-list files. Each row links to the exact official file in sourceUrl, so you can confirm any record with DPOR.

What is the difference between Class A, B and C contractors?

DPOR sets the class by the value of single contracts and total annual work a contractor may take on; Class A has the highest limits and Class C the lowest. Select the classes you need in licenseTypes.

How current is the data?

As current as DPOR's files. DPOR says it refreshes them every five business days, and each row carries the file's sourceFileLastModified time.

Does it return phone numbers?

No. DPOR does not publish phone numbers in these lists. It does publish an email for many contractors, which the Actor returns unless you set includeEmail to false.

What happens if DPOR is unavailable?

The run retries, then reports a blocked or partial status in OUTPUT and the status message. It never writes placeholder rows, so nothing is charged for a file it could not read.

How many records can one run return?

Up to 50,000 unique records per run (maxResults).

Responsible use

DPOR states that its online information can be delayed or incomplete. Confirm current status with DPOR before a legal, hiring, payment or compliance decision. Use published names, addresses and emails lawfully, keep them only as long as needed and follow email and privacy laws. This Actor is not affiliated with or endorsed by the Commonwealth of Virginia or DPOR.

Last verified: 2026-10-27