# Contractor License Directory: State Records (`getascraper/us-licensed-contractor-directory`) Actor

Search supported U.S. official state registries for licensed contractor records. Use contractor license lookup filters for state, trade, status, expiry, and source coverage. Export transparent shortlists with evidence.

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

## Pricing

from $1.32 / 1,000 contractor records

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

## 🏗️ US licensed contractor directory

<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:#EAF2F8;border:1px solid #B8D1E7"><strong style="color:#0F4C81">🏗️ Contractor directory</strong><br><span style="color:#0F4C81">&#10148; You are here</span></td><td width="50%" style="width:50%;padding:12px;background:#FFFFFF;border:1px solid #B8D1E7"><a href="https://apify.com/getascraper/multistate-contractor-license-verifier" style="color:#0F4C81;text-decoration:none"><strong>✅ License verifier</strong></a><br><span style="color:#57534E">Check known contractors against supported official registries.</span></td></tr></tbody></table>

<table width="100%"><tr><td style="padding:24px;background:#EAF2F8;border:1px solid #B8D1E7;border-top:4px solid #0F4C81"><span style="font-size:22px;font-weight:800;color:#1C1917">Find contractor records with official-source evidence.</span><br><span style="color:#57534E">Search supported state registries by license, business, place, trade, and published status. Keep the source and retrieval time beside each result.</span></td></tr></table>

<table width="100%"><tr><td style="width:25%;padding:12px;background:#FFFFFF;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">🏛️ Official records</span><br><span style="color:#57534E">Know which registry produced each row.</span></td><td style="width:25%;padding:12px;background:#FFFFFF;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">🎯 Published filters</span><br><span style="color:#57534E">Use dates and compliance facts only when published.</span></td><td style="width:25%;padding:12px;background:#FFFFFF;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">🧭 Clear shortlists</span><br><span style="color:#57534E">Sort consistently and see why each row fits.</span></td><td style="width:25%;padding:12px;background:#FFFFFF;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">🔔 Safer monitoring</span><br><span style="color:#57534E">Review field changes and cautious absence signals.</span></td></tr></table>

### 🔍 What does this Actor do?

Use this Actor to build a focused contractor directory from supported public registries. It helps supplier teams research a target area, business-development teams narrow a trade, and compliance teams retain published evidence beside each result.

Each row carries the source state, registry name, source record ID, source query link, and retrieval time. Published business, license, location, phone, expiry, bond, insurance, and trade fields appear only when the selected registry provides them. Missing source values are omitted, never replaced with generic labels.

<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 list.</strong> Source coverage differs by registry, so every result shows where its facts came from.</span></td></tr></table>

### 🗺️ Official coverage

- Connecticut: Home-improvement credentials.
- Illinois: Roofing credentials.
- Oregon: Active Construction Contractors Board licenses.
- Texas: TDLR-regulated trades, not a statewide general-contractor registry.
- Washington: Contractor registrations.

An absent result is not a conclusion that a contractor is unlicensed. Filters and fields vary by official registry, and unsupported filters are reported in the run summary.

### 🚀 How to use it

<table width="100%"><tr><td style="width:33%;padding:14px;background:#EAF2F8;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">STEP 1</span><br><span style="color:#1C1917;font-weight:700">Choose coverage</span><br><span style="color:#57534E">Select the official registries that fit your search.</span></td><td style="width:33%;padding:14px;background:#EAF2F8;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">STEP 2</span><br><span style="color:#1C1917;font-weight:700">Narrow the results</span><br><span style="color:#57534E">Add a license, business, place, trade, or status filter.</span></td><td style="width:33%;padding:14px;background:#EAF2F8;border:1px solid #B8D1E7"><span style="color:#0F4C81;font-weight:800">STEP 3</span><br><span style="color:#1C1917;font-weight:700">Use the evidence</span><br><span style="color:#57534E">Export the records or schedule the same search for change-only results.</span></td></tr></table>

### 🧾 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `states` | array of strings | No | Official registries to search. Defaults to Washington and Oregon. |
| `licenseNumber` | string | No | Exact published license or registration number. |
| `companyName` | string | No | Published business or contractor name. |
| `city` | string | No | City where a selected registry publishes and supports it. |
| `county` | string | No | County where a selected registry supports it. |
| `trade` | string | No | Published trade, specialty, endorsement, or license type. |
| `statuses` | array of strings | No | Normalized published or source-derived status where available. |
| `expiresFrom`, `expiresTo` | date | No | Keep records within a source-published expiry-date range. Missing dates are excluded and reported in coverage. |
| `issuedFrom`, `issuedTo` | date | No | Keep records within a source-published issue-date range. |
| `requirePublishedBondInformation` | boolean | No | Keep records with a published bond value or source-published bond reference. |
| `requirePublishedWorkersCompensationInformation` | boolean | No | Keep records with a source-published workers’ compensation field. |
| `sortBy` | enum | No | Reproducible order by source, company, license, published dates, or published-field completeness. |
| `maxItems` | integer | No | Maximum contractor records across selected registries. |
| `monitorMode` | boolean | No | Emit new, field-level changed, or carefully confirmed missing-record signals after complete checks. |
| `monitorName` | string | No | Stable name for a recurring saved search. |

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `companyName`, `licenseNumber`, `licenseStatus` | strings | Published contractor identity and license facts. |
| `tradeNames` | array of strings | Published trade, specialty, endorsement, or license type. |
| `address`, `city`, `county`, `postalCode`, `phone` | strings | Published location and contact fields when available. |
| `licenseIssuedAt`, `licenseExpiresAt` | strings | Published license dates when available. |
| `bondAmount`, `hasBond`, `hasWorkersCompensation` | number or boolean | Published compliance fields when available. |
| `sourceState`, `sourceName`, `sourceRecordId`, `sourceUrl` | strings | Official-source evidence for the record. |
| `shortlistReasons` | array of strings | Plain-language reasons based on exact matches and source-published facts. No hidden score is used. |
| `monitoringChange`, `changedFields`, `previousValues`, `monitoringReason` | text, array, or object | Explainable monitoring result and previous published values when a field changed. |
| `retrievedAt` | string | Time the official-source result was retrieved. |
| `sourceAttributes` | object | Additional source-specific published facts. |

### 💰 Pricing

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

### ⭐ Enjoying US licensed contractor directory?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:18px;background:#EAF2F8;border-left:5px solid #0F4C81"><span style="color:#1C1917;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="color:#1C1917;font-weight:800">Did this save your team from checking contractor records one at a time?</span><br><span style="color:#57534E">A rating helps procurement, compliance, and research teams find a source-backed starting point.</span></td></tr><tr><td style="padding:0;background:#0F4C81;text-align:center"><a href="https://apify.com/getascraper/us-licensed-contractor-directory/reviews" style="display:block;padding:12px;color:#FFFFFF;text-decoration:none;font-weight:800">Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Does a missing record mean the contractor is unlicensed?

No. Registry coverage and search scope vary. Treat a missing record as a research signal, not a license determination.

#### Which state should I use for a general contractor search?

Washington is the broadest initial construction-registration source. Texas covers regulated trades, not statewide general contractors.

#### Can I use published business details for outreach?

Use only published business fields and follow your own consent and regional compliance requirements.

#### Can I monitor a saved search?

Yes. Reuse the same scope with monitoring enabled. Field changes show their changed fields. The first complete-source absence is a review signal, and a second confirms the monitoring signal. A partial or capped source does not advance the saved snapshot.

### 🔗 Other actors

- [Multi-State Contractor License Verifier](https://apify.com/getascraper/multistate-contractor-license-verifier) ↗: Check supplied contractor records against supported official registries.
- [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.

# Actor input Schema

## `states` (type: `array`):

Choose supported official registries. CT covers home-improvement credentials, IL covers roofing, OR returns active CCB licenses, TX covers TDLR-regulated trades, and WA covers contractor registrations.

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

Use an exact published license or registration number when you have it.

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

Search the published business or contractor name. Results can include name candidates, so use a license number for identity-level precision.

## `city` (type: `string`):

Filter by a city where the selected official registry publishes a city field.

## `county` (type: `string`):

Filter by county where the selected official registry supports it. Unsupported state filters are reported in run coverage.

## `trade` (type: `string`):

Search the source-published trade, specialty, endorsement, or license type.

## `statuses` (type: `array`):

Filter only where a selected registry exposes an equivalent status. TX uses its published expiry date as an inference and is not status-filtered at the source.

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

Keep only records whose official source publishes an expiry date on or after this date. Records without a usable published expiry are excluded and reported in source coverage.

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

Keep only records whose official source publishes an expiry date on or before this date.

## `issuedFrom` (type: `string`):

Keep only records whose official source publishes an issue date on or after this date.

## `issuedTo` (type: `string`):

Keep only records whose official source publishes an issue date on or before this date.

## `requirePublishedBondInformation` (type: `boolean`):

Keep only records that contain a bond value published by the official source. This does not infer compliance when the source omits the field.

## `requirePublishedWorkersCompensationInformation` (type: `boolean`):

Keep only records whose official source publishes a workers’ compensation field, regardless of the published boolean value.

## `sortBy` (type: `string`):

Choose a reproducible order. Missing values are placed last, and official source identity breaks ties consistently.

## `maxItems` (type: `integer`):

Stops after this many directory records across all selected registries. Keep runs focused for faster, safer monitoring.

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

Save a source-scoped snapshot and output only new or changed contractor records after the first complete run. A partial or capped source never advances the snapshot.

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

Optional stable name for this saved search. Leave blank to derive one from the selected filters.

## Actor input object example

```json
{
  "states": [
    "WA",
    "OR"
  ],
  "statuses": [],
  "requirePublishedBondInformation": false,
  "requirePublishedWorkersCompensationInformation": false,
  "sortBy": "SOURCE_ORDER",
  "maxItems": 10,
  "monitorMode": false
}
```

# Actor output Schema

## `contractorRecords` (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 = {
    "states": [
        "WA",
        "OR"
    ],
    "statuses": [],
    "requirePublishedBondInformation": false,
    "requirePublishedWorkersCompensationInformation": false,
    "sortBy": "SOURCE_ORDER",
    "maxItems": 10,
    "monitorMode": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/us-licensed-contractor-directory").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 = {
    "states": [
        "WA",
        "OR",
    ],
    "statuses": [],
    "requirePublishedBondInformation": False,
    "requirePublishedWorkersCompensationInformation": False,
    "sortBy": "SOURCE_ORDER",
    "maxItems": 10,
    "monitorMode": False,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/us-licensed-contractor-directory").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 '{
  "states": [
    "WA",
    "OR"
  ],
  "statuses": [],
  "requirePublishedBondInformation": false,
  "requirePublishedWorkersCompensationInformation": false,
  "sortBy": "SOURCE_ORDER",
  "maxItems": 10,
  "monitorMode": false
}' |
apify call getascraper/us-licensed-contractor-directory --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/PoGKqgDToxoa03GQT/builds/5dda7xYNdzQGXDZxl/openapi.json
