# Virginia Contractor License Lookup & List - DPOR Class A, B, C (`loomwise/virginia-contractor-licenses`) Actor

Virginia contractor license list and DPOR lookup: 41,000+ Class A, B and C contractor businesses with license #, specialties, licensed and expiry dates, city, ZIP. Weekly new-contractor leads.

- **URL**: https://apify.com/loomwise/virginia-contractor-licenses.md
- **Developed by:** [Loomwise](https://apify.com/loomwise) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Virginia Contractor License List and DPOR License Lookup (Class A, B, C businesses)

**Every licensed Virginia contractor business, from the Virginia DPOR Board for Contractors' free public regulant lists.** About **41,000 current Class A, B and C contractor businesses**, refreshed by the state every week. Each row has the business name, DPOR license number, class, specialty codes in plain English (residential building, home improvement, electrical, plumbing, HVAC, roofing and 40+ more), first-licensed and expiration dates, business address, city, state, ZIP and a link to the official DPOR License Lookup.

**Sample output** (real rows, a few of the columns):

| `businessName` | `licenseClass` | `licenseNumber` | `specialtyCodes` | `certificationDate` | `city` | `zipCode` |
|---|---|---|---|---|---|---|
| Excel Constructors LLC | Class A | 2705203425 | RBC | 2026-11-06 | Richmond | 23223 |
| Aerovolt Systems LLC | Class C | 2705203296 | ELE | 2026-11-06 | Dunnsville | 22454 |
| Reliable Air Solutions HVAC LLC | Class A | 2705202003 | HVA | 2026-11-06 | Woodbridge | 22191 |
| CMTB LLC | Class A | 2705203422 | RBC, CBC | 2026-11-05 | Richmond | 23226 |

### Quick start: 3 ready-made searches

Press **Try for free**, open the **JSON** view of the input form, paste one of these and press **Start**. Results appear in the **Output** tab in seconds and export to Excel or CSV.

**New Virginia contractors licensed in the last 30 days** (up to 500 rows, so at most $1.50)

```json
{"certifiedWithinDays": 30, "maxResults": 500}
```

**Every current electrical, plumbing and HVAC contractor in Northern Virginia** (up to 3,000 rows, so at most $9.00)

```json
{"specialties": ["ELE", "PLB", "HVA"], "zipCodes": ["220", "221", "222", "223"], "virginiaOnly": true, "maxResults": 3000}
```

**Verify a list of Virginia contractor licenses**

```json
{"licenseNumbers": ["2705203425", "2705203296", "2705202003"]}
```

**Free to try:** Apify's free plan ($5/month in credit, no card needed) covers about **1,600 records** a month.
**Price:** $3.00 per 1,000 results.

No browser, no proxies, no login, no API key. The Actor downloads DPOR's official tab-delimited lists, so a full run takes about 10 seconds.

### Three ways to use it

1. **New-contractor leads.** Set `certifiedWithinDays` (for example 7 or 30) to get every contractor business Virginia licensed in that window, newest first. DPOR updates the lists every 5 business days, so schedule it weekly.
2. **Full Virginia contractor list.** Leave `certifiedWithinDays` at 0 and filter by class, specialty, city, ZIP or business name.
3. **Bulk DPOR license lookup / verification.** Paste license numbers into `licenseNumbers` to check class, specialties and expiration for a whole subcontractor list in one run. Use `expiresFrom` / `expiresTo` to find licenses coming up for renewal.

### What you get

| Field | Example |
|---|---|
| `businessName` | EXCEL CONSTRUCTORS LLC |
| `licenseNumber`, `certificateNumber` | 2705203425, 203425 |
| `licenseClass`, `licenseType` | Class A, Class A Contractor |
| `specialtyCodes`, `specialties` | \["RBC"], \["Residential building contractors"] |
| `certificationDate`, `expirationDate`, `licenseStatus` | 2026-11-06, 2028-11-30, Current (not expired) |
| `businessAddress`, `city`, `state`, `zipCode` | 2809 VALLEY SIDE CT, Richmond, VA, 23223 |
| `verifyUrl` | DPOR License Lookup |
| `sourceUrl`, `sourceAgency`, `retrievedAt` | regulant list page and agency |

**Virginia license classes:** Class A has no single-contract limit, Class B covers contracts under $120,000 (and under $750,000 a year), Class C covers $1,000 to $25,000 (and under $150,000 a year).

### Input

| Field | What it does | Default |
|---|---|---|
| `certifiedWithinDays` | Only businesses first licensed in the last N days (0 = any) | 0 |
| `certifiedFrom` / `certifiedTo` | Exact first-licensed date window | none |
| `licenseClasses` | `A`, `B`, `C` | all |
| `specialties` | DPOR codes such as `RBC`, `CBC`, `HIC`, `ELE`, `PLB`, `HVA`, `ROC`, `H/H`, `GFC`, `FSP` | all |
| `licenseNumbers` | Bulk lookup: only these licenses, any status | none |
| `cities` / `zipCodes` | Location filters | all |
| `keywords` | Business name contains | none |
| `virginiaOnly` | Skip out-of-state contractors licensed in Virginia | false |
| `expiresFrom` / `expiresTo` | Expiration-date window (renewal prospecting) | none |
| `activeOnly` | Skip expired licenses | true |
| `includeAddress` | Business address of record | true |
| `maxResults` | Cap (you pay per result) | 100 |

### Who uses this

- **Building-supply, electrical, plumbing and HVAC distributors** prospecting newly licensed Virginia contractors.
- **Insurance, surety and bonding agents**, including renewal prospecting by expiration date.
- **Construction software, estimating and payments companies** selling to contractors.
- **General contractors, property managers and home-service marketplaces** verifying subcontractors in bulk.

### Privacy by design

- **Businesses only.** Licenses held by an individual are dropped, and so are sole proprietorships listed under a person's name (about 22% of rows). `RUN_SUMMARY.droppedIndividual` and `droppedPersonLikeName` show the counts.
- **No email addresses or phone numbers.** DPOR's lists include an email column; this Actor never outputs it. Phone numbers are not in the lists.
- Tradesman (individual electrician, plumber, HVAC technician) lists are not read.

### Common questions

**Is this data legal to use?** Yes. DPOR publishes these regulant lists for public download, free of charge, and invites you to use them in any spreadsheet software.

**How fresh is it?** DPOR updates the lists every 5 business days, usually on Mondays. Each run downloads the current files and `RUN_SUMMARY.files` shows each file's last-modified date.

**How do I check a Virginia contractor license?** Paste the number into `licenseNumbers`, or part of the business name into `keywords` with `activeOnly` off. You get class, specialties and expiration, and `verifyUrl` opens the DPOR License Lookup. Always confirm there before you hire, since disciplinary history is only on DPOR's site.

**How much does it cost?** Free to try with Apify's free plan ($5/month credit, no credit card), which covers about 1,600 records a month. After that it is $3.00 per 1,000 results, plus a fraction of a cent per run.

**Can I get new contractors automatically every week?** Yes. Save your filters as a task and add a weekly **Schedule** with `certifiedWithinDays: 7`. Send each batch to Google Sheets, Slack, email, Zapier, Make or n8n under **Integrations**.

**Can I call it from code or an AI agent?** Yes. Use the Apify API or the Python/JavaScript clients, or connect it to Claude, ChatGPT or Cursor through the Apify MCP server.

Data: Virginia Department of Professional and Occupational Regulation (DPOR), Board for Contractors regulant lists. Not affiliated with or endorsed by DPOR or the Commonwealth of Virginia.

### More contractor license tools from Loomwise

- [us-contractor-licenses](https://apify.com/loomwise/us-contractor-licenses): contractor license lookup across 13 official sources in 9 states
- [california-contractor-licenses](https://apify.com/loomwise/california-contractor-licenses): CSLB California contractor license lookup and list
- [new-york-contractor-registry](https://apify.com/loomwise/new-york-contractor-registry): NYS Contractor Registry lookup and new contractors
- [colorado-electrical-plumbing-contractors](https://apify.com/loomwise/colorado-electrical-plumbing-contractors): Colorado DORA electrical and plumbing contractors
- [illinois-idfpr-business-licenses](https://apify.com/loomwise/illinois-idfpr-business-licenses): Illinois IDFPR roofing contractors, design firms and licensed businesses
- [wa-contractor-licenses](https://apify.com/loomwise/wa-contractor-licenses): Washington L\&I contractor licenses
- [oregon-electrical-plumbing-contractors](https://apify.com/loomwise/oregon-electrical-plumbing-contractors): Oregon electrical, plumbing, HVAC/R and solar contractors
- [texas-contractor-licenses](https://apify.com/loomwise/texas-contractor-licenses): Texas TDLR HVAC and electrical contractors
- [delaware-business-licenses](https://apify.com/loomwise/delaware-business-licenses): Delaware Division of Revenue business license list (contractors, retailers, restaurants, hotels)

# Actor input Schema

## `certifiedWithinDays` (type: `integer`):

Only contractor businesses whose license was first issued (certified) in the last N days, newest first. 0 = any date.

## `licenseClasses` (type: `array`):

A, B and/or C. Class A: no single-contract limit. Class B: under $120,000 per contract. Class C: $1,000 to $25,000. Empty = all.

## `specialties` (type: `array`):

DPOR classification/specialty codes, for example RBC (residential building), CBC (commercial building), HIC (home improvement), ELE (electrical), PLB (plumbing), HVA (HVAC), ROC (roofing), H/H (highway/heavy), GFC (gas fitting), FSP (fire sprinkler). A row matches if it has any of them. Empty = all.

## `licenseNumbers` (type: `array`):

Paste Virginia contractor license numbers (10-digit like 2705203425, or the 6-digit certificate number). Returns those licenses with any status, ignoring other filters except class. Unmatched numbers are listed in RUN_SUMMARY.

## `cities` (type: `array`):

Exact city names, for example Richmond, Virginia Beach.

## `zipCodes` (type: `array`):

For example 23 or 22031.

## `keywords` (type: `array`):

Case-insensitive, any of these words.

## `virginiaOnly` (type: `boolean`):

Skip out-of-state contractors licensed in Virginia.

## `expiresFrom` (type: `string`):

Renewal prospecting: expiration date on or after.

## `expiresTo` (type: `string`):

Expiration date on or before.

## `certifiedFrom` (type: `string`):

Exact first-licensed date window, overrides 'last N days'.

## `certifiedTo` (type: `string`):

End of the first-licensed date window.

## `activeOnly` (type: `boolean`):

Skip expired licenses still on the list. Ignored in lookup mode.

## `includeAddress` (type: `boolean`):

Business mailing address of record (apartment/unit-style addresses are blanked).

## `maxResults` (type: `integer`):

You pay per result. The full list is about 41,000 current businesses.

## Actor input object example

```json
{
  "certifiedWithinDays": 30,
  "licenseClasses": [
    "A",
    "B",
    "C"
  ],
  "virginiaOnly": false,
  "activeOnly": true,
  "includeAddress": true,
  "maxResults": 100
}
```

# Actor output Schema

## `contractors` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "certifiedWithinDays": 30,
    "licenseClasses": [
        "A",
        "B",
        "C"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("loomwise/virginia-contractor-licenses").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "certifiedWithinDays": 30,
    "licenseClasses": [
        "A",
        "B",
        "C",
    ],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("loomwise/virginia-contractor-licenses").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "certifiedWithinDays": 30,
  "licenseClasses": [
    "A",
    "B",
    "C"
  ],
  "maxResults": 100
}' |
apify call loomwise/virginia-contractor-licenses --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loomwise/virginia-contractor-licenses"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zrwnGFIWl1b51BqQ3/builds/bV88daZU9T77flyic/openapi.json
