# Contractor License Lookup - TX FL VA NC WA NV MI (`recordwise/license-verification`) Actor

Verify contractor licenses in North Carolina, Nevada, Texas, Washington, Michigan, Florida and Virginia, plus all Texas TDLR license types. Search by license number or name. Get status, expiry, license type, qualifiers, address and disciplinary actions where published, in one schema for all states.

- **URL**: https://apify.com/recordwise/license-verification.md
- **Developed by:** [Recordwise](https://apify.com/recordwise) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 license records

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

## Contractor License Lookup - TX FL VA NC WA NV MI

Look up contractor and professional licenses on official state licensing-board portals and get
the result in one normalized schema, regardless of which board issued the license.

Use it to verify a contractor before hiring, check credentials during onboarding or KYB, or
monitor license expirations across a vendor list.

### Supported licensing boards

| `jurisdiction` | Board | Lookup by |
|---|---|---|
| `us-fl-contractors` | Florida Department of Business and Professional Regulation (DBPR): Construction Industry Licensing Board (general, building, residential, roofing, plumbing, mechanical, pool and other contractors) and Electrical Contractors' Licensing Board | license number (e.g. `CGC1530424`), business name |
| `us-mi-contractors` | Michigan Department of Licensing and Regulatory Affairs (LARA), Bureau of Construction Codes: residential builders, maintenance and alteration contractors, electrical, mechanical, plumbing, boiler and elevator licenses | license number (e.g. `2102165263`), business name |
| `us-nc-general-contractors` | North Carolina Licensing Board for General Contractors | license number, company name |
| `us-nv-contractors` | Nevada State Contractors Board | license number (e.g. `0038442`), company name |
| `us-tx-tdlr` | Texas Department of Licensing and Regulation: A/C, electrical, elevator and appliance-installation contractors, electricians and every other TDLR license type | license number (e.g. `TACLA00001392C`, `JE - 13380`), person or business name |
| `us-va-contractors` | Virginia Department of Professional and Occupational Regulation (DPOR), Board for Contractors: Class A, B and C contractors and tradesmen (electricians, plumbers, HVAC technicians), backflow prevention device workers, elevator mechanics and water well providers | license number (e.g. `2701000041`), business or person name |
| `us-wa-contractors` | Washington State Department of Labor & Industries: construction, electrical, plumbing and elevator contractors | license number (e.g. `SKANSUB985RT`), business name |

Washington data comes from L\&I's official open dataset on data.wa.gov, which L\&I refreshes
daily, so a change made on the board's site today may appear tomorrow. It includes expired,
suspended and out-of-business licenses. Washington records have no qualifiers or disciplinary
actions; name searches list active licenses first.

Nevada name searches match the start of the company name and list active licenses first.
Nevada records include the monetary limit (`limitation`), qualified individuals and, for
revoked or suspended licenses, the board's reason in `statusRaw`.

Texas license numbers are unique only within a license type. Type the number with its prefix
(`TACLA00001392C`, `JE - 13380`) to get that license; a bare number (`13380`) returns every
license type that uses it. Texas name searches match the start of the name; people are listed
as `LAST, FIRST`.

Michigan name searches match the beginning of the business name (`Pulte` finds "PULTE HOMES OF
MICHIGAN LLC"); put `%` in front to match anywhere in the name (`%Homes`). Individual
tradespeople such as electricians and plumbers have no business name, so look them up by license
number. LARA's status `Issued` is reported as `active`. The address is limited to city, state and
ZIP, and only name searches return it. Michigan records have no qualifiers or disciplinary
actions.

In Florida a contractor license is held by a person who qualifies the business, so `holderName`
is that person and the business appears in `alsoKnownAs`. Name searches match business names
anywhere in the name. Only `Current, Active` licenses are reported as `active`; for example
`Delinquent, Active` (not renewed) is `inactive`. `disciplinaryActions` lists the public
complaints DBPR publishes for the license. Florida records have no qualifiers.

Virginia's DPOR shows a status only when it is exceptional (for example `REVOKED`), so a license
without one is reported as `active` until its expiration date and `inactive` after it; `statusRaw`
is then empty. `limitation` holds the contractor class (`Class A`, `B` or `C`), which caps the
value of a single contract, and `classifications` the specialties. `disciplinaryActions` lists
open and closed complaints. Name searches match anywhere in the name and return at most 200
licenses. DPOR asks for a CAPTCHA after many requests in a short time from one IP address; the
run then fails with a message saying so. Use a proxy for large Virginia runs. Virginia records
have no qualifiers.

More boards are added over time. Request one via the Issues tab.

### Input

```json
{
    "jurisdiction": "us-nc-general-contractors",
    "licenseNumbers": ["L.02077"],
    "names": ["Clancy"],
    "maxResultsPerQuery": 10
}
```

- `licenseNumbers` returns at most one record each (Texas: one per license type for a bare number).
- `names` returns up to `maxResultsPerQuery` records each.

### Output

One dataset item per license record:

```json
{
    "jurisdiction": "us-nc-general-contractors",
    "licenseNumber": "L.02077",
    "licenseType": "License",
    "holderName": "Clancy & Theys Construction Co.",
    "alsoKnownAs": [],
    "status": "active",
    "statusRaw": "Active",
    "issuedDate": "1949-07-07",
    "expirationDate": "2026-12-31",
    "address": { "street": "421 N. Harrington Street, Suite 200", "city": "Raleigh", "state": "NC", "postalCode": "27603" },
    "phone": "9198343601",
    "classifications": ["Unclassified"],
    "limitation": "Unlimited",
    "qualifiers": [{ "name": "David Timothy Clancy", "number": "Q.00181", "status": "Active" }],
    "disciplinaryActions": [],
    "sourceUrl": "https://portal.nclbgc.org/Public/_ShowAccountDetails/?key=...",
    "fetchedAt": "2026-10-07T04:30:00Z",
    "query": { "licenseNumber": "L.02077" }
}
```

`status` is normalized to `active`, `inactive` or `unknown`; `statusRaw` keeps the board's own
wording. Fields the board does not publish are `null` or empty.

### Pricing

Pay per event: you are charged once per `license-record` returned. Queries with no match are free.

### Data source and legality

All data comes from public license-verification pages that the boards publish for exactly this
purpose. No login, no personal data beyond what the board itself makes public.

# Actor input Schema

## `jurisdiction` (type: `string`):

Which licensing-board portal to query.

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

License or account numbers to look up, e.g. `CGC1530424` (Florida), `2102165263` (Michigan), `L.02077` or `2077` (North Carolina), `0038442` (Nevada), `TACLA00001392C` or `JE - 13380` (Texas), `2701000041` (Virginia) or `SKANSUB985RT` (Washington).

## `names` (type: `array`):

Name searches; each returns up to Max results per query records.

## `maxResultsPerQuery` (type: `integer`):

Cap on records returned for each name search. License-number lookups return at most one record, except a bare Texas number, which returns one per license type up to this cap.

## `proxyConfiguration` (type: `object`):

Optional. Government portals rarely block datacenter IPs; enable Apify Proxy only if requests start failing.

## Actor input object example

```json
{
  "jurisdiction": "us-nc-general-contractors",
  "licenseNumbers": [
    "L.02077"
  ],
  "maxResultsPerQuery": 10
}
```

# Actor output Schema

## `licenses` (type: `string`):

One record per license found: status, expiration, license type, classifications, qualifiers, address and disciplinary actions where the board publishes them.

# 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 = {
    "licenseNumbers": [
        "L.02077"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordwise/license-verification").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 = { "licenseNumbers": ["L.02077"] }

# Run the Actor and wait for it to finish
run = client.actor("recordwise/license-verification").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 '{
  "licenseNumbers": [
    "L.02077"
  ]
}' |
apify call recordwise/license-verification --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordwise/license-verification"
        }
    }
}
```

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/Rt2dzh9b54NpAdfWB/builds/CFaxtlewn8FF7z16K/openapi.json
