# Contractor License Verification: Multi-State (`getascraper/multistate-contractor-license-verifier`) Actor

Verify contractor licenses across supported U.S. official state registries by license number or company name. Retain match evidence, source coverage, expiry fields, batch review rows, and explainable monitoring. $0.00352 per verification result.

- **URL**: https://apify.com/getascraper/multistate-contractor-license-verifier.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.64 / 1,000 license verifications

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ✅ Multi-state contractor license verifier

<table width="100%" style="width:100%;min-width:100%;border-collapse:collapse;table-layout:fixed"><tbody style="display:table;width:100%;min-width:100%;border-collapse:collapse;table-layout:fixed"><tr style="width:100%"><td colspan="2" style="padding:14px 18px;background:#EAF2F8;border-top:3px solid #0F4C81"><strong style="color:#1C1917">Contractor intelligence suite</strong><br><span style="color:#57534E">Official-registry discovery and source-aware verification for U.S. contractor workflows.</span></td></tr><tr style="width:100%"><td width="50%" style="width:50%;padding:12px;background:#FFFFFF;border:1px solid #B8D1E7"><a href="https://apify.com/getascraper/us-licensed-contractor-directory" style="color:#0F4C81;text-decoration:none"><strong>🏗️ Contractor directory</strong></a><br><span style="color:#57534E">Find published contractor records across supported registries.</span></td><td width="50%" style="width:50%;padding:12px;background:#EAF2F8;border:1px solid #B8D1E7"><strong style="color:#0F4C81">✅ License verifier</strong><br><span style="color:#0F4C81">&#10148; You are here</span></td></tr></tbody></table>

<table width="100%"><tr><td style="padding:24px 28px;background:#EAF2F8;border:1px solid #B8D1E7;border-top:4px solid #0F4C81;border-radius:12px"><span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Verify contractor license claims against published state records.</span><br><span style="font-size:15px;color:#57534E;line-height:1.6">Match a license number or company name, retain official-source evidence, and review a batch through one repeatable workflow.</span></td></tr></table>

<table width="100%"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D1E7;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#0F4C81">🏛️ Official evidence</span><br><span style="font-size:12px;color:#57534E">Keep the public registry source beside each result.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D1E7;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#0F4C81">🎯 Clear match basis</span><br><span style="font-size:12px;color:#57534E">Separate license matches from company-name candidates.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D1E7;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#0F4C81">📦 Review-ready batch</span><br><span style="font-size:12px;color:#57534E">Review up to 250 supplied checks in one run.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D1E7;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#0F4C81">🔔 Explainable changes</span><br><span style="font-size:12px;color:#57534E">See fields changed and cautious absence signals.</span></td></tr></table>

### 🔍 What does multi-state contractor license verifier do?

Use this Actor to check a supplied license number or company name against supported public state registries. It returns a source-backed verification outcome, match basis, published contractor facts, and practical caveats.

<table width="100%"><tr><td style="padding:12px 18px;background:#EAF2F8;border-left:4px solid #0F4C81"><span style="color:#1C1917">&#9889; <strong>Keep the evidence with the decision.</strong> Company-name matches are candidates, and every result keeps its public-source link and registry context.</span></td></tr></table>

### 👥 Who is it for?

- **Vendor-risk teams:** “I need a consistent evidence trail before onboarding a contractor.”
- **General contractors:** “I need to check a subcontractor list before work begins.”
- **Procurement teams:** “I need to verify supplier claims without reviewing one registry at a time.”
- **Compliance teams:** “I need a repeatable watchlist for records that may change.”

### 🧭 How it works

<table width="100%"><tr><td style="padding:16px 14px;width:33%;background:#EAF2F8;border:1px solid #B8D1E7;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#0F4C81;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Add checks</span><br><span style="font-size:12px;color:#57534E">Provide a state and a license number or company name.</span></td><td style="padding:16px 14px;width:33%;background:#EAF2F8;border:1px solid #B8D1E7;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#0F4C81;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Review evidence</span><br><span style="font-size:12px;color:#57534E">Use the match basis, published facts, warnings, and source link.</span></td><td style="padding:16px 14px;width:33%;background:#EAF2F8;border:1px solid #B8D1E7;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#0F4C81;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Monitor changes</span><br><span style="font-size:12px;color:#57534E">Schedule a stable batch to receive changed verified records.</span></td></tr></table>

### ✅ Matching policy

A license-number match is stronger than a company-name candidate. Company-name searches return candidates, not identity claims. A capped or incomplete search does not make an absence claim. Review the returned warnings and source link before making a compliance decision.

### 🗺️ Supported registry scope

| State | Published registry scope |
| --- | --- |
| Connecticut | Home-improvement credentials |
| Illinois | Roofing |
| Oregon | Active Construction Contractors Board licenses |
| Texas | TDLR-regulated trades |
| Washington | Contractor registrations |

### 🧾 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `checks` | array of checks | No | Up to 250 named contractors or license numbers for batch verification. Every `inputId` must be unique. |
| `checksCsv` | text | No | Pasted CSV with `inputId`, `state`, `licenseNumber`, and `companyName` columns. It takes precedence over the JSON list. |
| `state` | enum | No | State for one check: CT, IL, OR, TX, or WA. |
| `licenseNumber` | text | No | Published license or registration number for one check. |
| `companyName` | text | No | Published contractor name for candidate matching. |
| `maxCandidatesPerCheck` | integer | No | Maximum source rows examined for each supplied contractor. |
| `monitorMode` | boolean | No | Emit new, field-level changed, or cautious missing-record signals after complete checks. |
| `monitorName` | text | No | Stable name for a saved verification batch. |

Provide either `checks`, or a single `state` with a `licenseNumber` or `companyName`.

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `inputId` | text | Your supplied reference, copied to the result. |
| `state` | text | Registry state checked. |
| `outcome` | text | Verification outcome for the supplied check. |
| `matchType` | text | Basis of the returned match. |
| `requestedLicenseNumber`, `requestedCompanyName` | text | Submitted details retained with each review row. |
| `candidateRank`, `candidateCount` | integer | Deterministic candidate position and total returned candidates for that input. |
| `reviewRequired`, `reviewReasons`, `matchEvidence` | boolean or array of text | Clear review guidance and the exact matching basis. No opaque score is used. |
| `companyName` | text | Contractor name published by the registry. |
| `licenseNumber` | text | Published license or registration number. |
| `licenseStatus` | text | Published or inferred registry status when available. |
| `licenseExpiresAt` | date | Published expiry date when available. |
| `tradeNames` | array of text | Published trade or specialty names when available. |
| `sourceUrl` | link | Official-source query or record evidence. |
| `warnings` | array of text | Registry scope and result caveats. |
| `monitoringChange`, `monitoringChangedFields`, `monitoringPreviousValues`, `monitoringReason` | text, array, or object | Explainable monitoring result and prior published values when available. |
| `sourceAttributes` | object | Additional published facts specific to the registry. |

Empty fields are omitted. The Actor does not invent missing registry facts.

### 💰 Pricing

Pricing is pay per result. Empty runs cost nothing, and there are no subscriptions.

### ⭐ Enjoying multi-state contractor license verifier?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:20px 24px 14px;background:#EAF2F8;border:1px solid #B8D1E7;border-left:5px solid #0F4C81;border-radius:10px 10px 0 0"><span style="font-size:20px;letter-spacing:4px;color:#1C1917">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">Did this save your team from checking contractor licenses one at a time?</span><br><span style="font-size:14px;color:#57534E">A rating helps procurement, compliance, and research teams find a source-backed verification workflow.</span></td></tr><tr><td style="padding:0;background:#0F4C81;border:1px solid #B8D1E7;border-top:none;border-radius:0 0 10px 10px;text-align:center"><a href="https://apify.com/getascraper/multistate-contractor-license-verifier/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Which states can I verify at launch?

Connecticut, Illinois, Oregon, Texas, and Washington are supported. Each registry has its own published scope, shown above.

#### Does a company-name result prove the contractor’s identity?

No. Company-name searches return candidates. License-number matches carry stronger evidence. Use the official-source link and warnings for review.

#### Does no result mean a contractor is unlicensed?

No. A missing result can reflect registry scope, supplied information, or an incomplete search. The Actor avoids making that claim.

#### Can I monitor contractor records?

Yes. Turn on monitoring and use the same monitor name for a stable batch. Field changes include changed fields. The first complete-source absence is a review signal, and a second confirms the monitoring signal.

### 🔗 Other actors

- [SAM.gov Contract Monitor: Federal Opportunities Scraper](https://apify.com/getascraper/sam-gov-contract-monitor) ↗: Monitor U.S. federal opportunities.
- [Federal Register RAG Extractor: Rules, EOs & CFR Chunking](https://apify.com/getascraper/federal-register-rag-extractor) ↗: Collect public federal rulemaking records.
- [NIH & NSF grant monitor: research funding status](https://apify.com/getascraper/research-grant-status-monitor) ↗: Monitor public grant-status information.
- [Bahrain Tender Scraper: مناقصات البحرين](https://apify.com/getascraper/bahrain-tender-board-scraper) ↗: Collect public Bahrain Tender Board opportunities.

# Actor input Schema

## `checks` (type: `array`):

Submit up to 250 named contractors or license numbers. Every inputId must be unique. A license-number match is stronger than a company-name candidate and every candidate retains official-source evidence.

## `checksCsv` (type: `string`):

Paste a header row using inputId,state,licenseNumber,companyName followed by up to 250 checks. inputId is optional but must be unique when supplied; every row needs a supported state and either licenseNumber or companyName. Quoted commas and line breaks are supported. When CSV is supplied, it takes precedence over the JSON list.

## `state` (type: `string`):

Use these single-check fields instead of the batch list when verifying one contractor. Pasted CSV takes precedence; otherwise populated single-check fields take precedence over the JSON list.

## `licenseNumber` (type: `string`):

Published license or registration number for one contractor.

## `companyName` (type: `string`):

Published company or contractor name for one candidate search.

## `maxCandidatesPerCheck` (type: `integer`):

Caps published candidate rows returned for each contractor. Each candidate is emitted as a separately ranked review row. When this cap is reached, the result stays source-limited rather than making an absence claim.

## `monitorMode` (type: `boolean`):

Save source-scoped snapshots and emit new, field-level updated, or missing-record review signals after complete, uncapped checks. A first absence is a candidate; confirmation requires two consecutive complete checks. Source failures and capped searches never advance the snapshot.

## `monitorName` (type: `string`):

Optional stable name for this saved verification batch.

## Actor input object example

```json
{
  "checks": [
    {
      "inputId": "sample-wa-license",
      "state": "WA",
      "licenseNumber": "04CONCL862CR"
    }
  ],
  "maxCandidatesPerCheck": 5,
  "monitorMode": false
}
```

# Actor output Schema

## `verificationResults` (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 = {
    "checks": [
        {
            "inputId": "sample-wa-license",
            "state": "WA",
            "licenseNumber": "04CONCL862CR"
        }
    ],
    "maxCandidatesPerCheck": 5,
    "monitorMode": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/multistate-contractor-license-verifier").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 = {
    "checks": [{
            "inputId": "sample-wa-license",
            "state": "WA",
            "licenseNumber": "04CONCL862CR",
        }],
    "maxCandidatesPerCheck": 5,
    "monitorMode": False,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/multistate-contractor-license-verifier").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "checks": [
    {
      "inputId": "sample-wa-license",
      "state": "WA",
      "licenseNumber": "04CONCL862CR"
    }
  ],
  "maxCandidatesPerCheck": 5,
  "monitorMode": false
}' |
apify call getascraper/multistate-contractor-license-verifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=getascraper/multistate-contractor-license-verifier",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/fRBrNvJx1fidXrrWV/builds/zTfRPRuKmY5Vpgukt/openapi.json
