# US Contractor License Lookup: WA, OR, CT, NY, CO, DE Data (`jp-data-lab/us-contractor-licenses-official-data`) Actor

Verify contractor licenses by number or list licensed businesses from six official state open data portals, in one schema: status, type, trade, issue and expiry dates, city and ZIP. Licence-checked sources only. No owner names, phones, emails or street addresses.

- **URL**: https://apify.com/jp-data-lab/us-contractor-licenses-official-data.md
- **Developed by:** [JP Data Lab](https://apify.com/jp-data-lab) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 licenses

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

## US Contractor License Lookup: WA, OR, CT, NY, CO, DE Data

Verify contractor licenses by number, or list licensed construction businesses, from six official state open data portals in **one JSON schema**. Each source's licence or terms were checked first, and every source is the state's own published open dataset. License search pages are never scraped.

| `source` | State | Dataset | Covers | Licence or terms |
|---|---|---|---|---|
| `washington` | Washington | [L\&I Contractor License Data - General](https://data.wa.gov/d/m8qx-ubtq) | Construction, electrical, plumbing and elevator contractors | ODC Public Domain Dedication and License |
| `oregon` | Oregon | [CCB Active Licenses](https://data.oregon.gov/d/g77e-6bhs) | Residential and commercial contractors | Public Domain U.S. Government |
| `connecticut` | Connecticut | [State Licenses and Credentials](https://data.ct.gov/d/ngch-56tr) | Home improvement, new home, major, electrical, plumbing, HVAC and other contractors | Public Domain |
| `new-york` | New York | [Contractor Registry Certificate](https://data.ny.gov/d/i4jv-zkey) | Contractors registered for public work | OPEN-NY Terms of Use |
| `colorado` | Colorado | [Professional and Occupational Licenses](https://data.colorado.gov/d/7s5z-vewr) | Electrical and plumbing contractors | Public Domain, see "Colorado notice" |
| `delaware` | Delaware | [Delaware Business Licenses](https://data.delaware.gov/d/5zy2-grhr) | Resident and non-resident contractor business licenses | Public Domain |

Use it to check vendors and subcontractors before you hire them, keep an insurance or compliance file current, find newly licensed contractors, or give an AI agent a way to answer "is this license active?". This is a list of licenses, not of people: it has no owner names, phones or emails.

### Two ways to use it

**Verify license numbers.** Put numbers in `licenseNumbers`. Each one is checked in the selected states, and all other filters are ignored:

```json
{ "licenseNumbers": ["HIC.0707536", "AARALAA744PT"], "states": ["connecticut", "washington"] }
```

Numbers with no match are listed under `licenseNumbersNotFound` in `RUN_SUMMARY` and are not charged. Choose the state when you can, because the same number can exist in more than one state or license type.

**List businesses.** Leave `licenseNumbers` empty and filter by state, name, trade, issue date or expiry date:

```json
{ "states": ["washington"], "categories": ["electrical"], "issuedWithinDays": 30, "maxItems": 200 }
```

### Output

One item per license:

```json
{
  "id": "connecticut:HIC.0707536:HIC",
  "source": "connecticut",
  "state": "CT",
  "licenseNumber": "HIC.0707536",
  "licensee": "USA WILDLIFE & EXCLUSION LLC",
  "nameConfirmed": true,
  "category": "general",
  "active": true,
  "url": "https://data.ct.gov/d/ngch-56tr",
  "attribution": "Connecticut Department of Consumer Protection, https://data.ct.gov/d/ngch-56tr (Public Domain)",
  "licenseType": "HOME IMPROVEMENT CONTRACTOR",
  "licenseTypeCode": "HIC",
  "status": "ACTIVE",
  "issuedAt": "2026-10-29",
  "expiresAt": "2027-03-31",
  "legalForm": "LIMITED LIABILITY COMPANY",
  "specialties": [],
  "debarred": null,
  "city": "PLYMOUTH",
  "businessState": "CT",
  "zip": "06782",
  "county": null,
  "scrapedAt": "2026-11-01T09:00:00+00:00"
}
```

| Field | Meaning |
|---|---|
| `id` | Stable key. Use it to remove repeats between runs |
| `state` | The state that issued the license |
| `licenseNumber` | The state's own number. Use it to confirm the license with the state |
| `licensee` | Business name. `null` when `nameConfirmed` is `false`, see "Personal data" |
| `category` | `general`, `electrical`, `plumbing`, `hvac`, `specialty` or `unclassified`. New York and Delaware publish no trade, so they are `unclassified` |
| `active` | `true` if the status counts as current. Oregon, New York and Delaware only publish current licenses, so it is always `true` there |
| `licenseType`, `licenseTypeCode` | The source's own wording and code |
| `status` | The source's own status wording. Not published by Oregon and Delaware |
| `issuedAt` | Washington, Oregon, Connecticut and Colorado: the date the license began. New York: the date of the current certificate. Delaware publishes none, so it is `null` |
| `expiresAt` | Expiry date. In Delaware, the end of the current license term |
| `legalForm` | The source's own wording. Washington, Connecticut and New York only |
| `specialties` | Trades on the license in Washington, and all license endorsements in Oregon |
| `debarred` | `true` if New York records that the business was debarred. `null` in other states, which does not mean the business is clear |
| `city`, `businessState`, `zip`, `county` | Business location on file. `county` is Oregon only. An out-of-state contractor shows its home location |
| `url` | The official dataset page |

### Input

| Field | Default | |
|---|---|---|
| `licenseNumbers` | none | Up to 1,000 numbers to verify. Other filters are then ignored |
| `states` | all | Any of the `source` values above |
| `keywords` | none | Business name contains any keyword |
| `categories` | none | Any of the `category` values. States without that trade are not read |
| `activeOnly` | `true` | Leave out expired, suspended and revoked licenses |
| `issuedWithinDays` | 0 | Licenses issued in the last N days. Delaware is skipped |
| `expiringWithinDays` | 0 | Licenses expiring in the next N days, soonest first |
| `maxItems` | 100 | Total for the run, shared evenly across states, newest first. You pay per result |

A default run takes under a minute. Delaware has no issue date, so it is ordered by license number.

### Personal data

Many contractors are sole proprietors, so a license record can be a record about a person. This Actor is built not to return their names:

- **No people.** Principal, officer, owner, responsible managing individual and similar columns are never requested from the source.
- **No phones, emails or street addresses.** A small contractor's address is often a home, so location stops at city and ZIP code.
- **Names must look like a business.** A name is returned only if it contains a legal word such as `LLC`, `Inc` or `Corp`, or if the source lists an LLC or corporation and the name contains a trade word such as `Plumbing`. A legal form alone is not trusted, because New York lists personal names under `Corporation`. A company name that itself contains a name, such as `Jane Doe Construction LLC`, is still returned as the registered name of the company.
- **Lists leave out unconfirmed names.** Sole proprietors and other unconfirmed names are not listed, and are counted as `nameNotConfirmed` in `RUN_SUMMARY`. In a recent sample this left 91 to 99 percent of rows in Washington, Oregon, Connecticut and New York, 74 percent in Colorado and 68 percent in Delaware.
- **Lookups keep the status only.** When you ask for a license number and its name cannot be confirmed, you get the license status and dates with `nameConfirmed: false`, and `licensee`, `legalForm`, `city`, `businessState`, `zip` and `county` set to `null`.
- Washington's `PASSED AWAY` status is never read.

### Limitations

- **Only 6 states are covered, and coverage differs.** Connecticut's electrical, plumbing and HVAC contractor licenses are held by individuals, so its lists show home improvement, new home and major contractors, while its trade licenses can still be checked by number. Colorado means electrical and plumbing contractors only, because the state does not license general contractors. New York means contractors registered for public work, not every contractor in the state. Delaware's licenses are business licenses, which do not prove a trade qualification.
- **Why not California, Arizona, Florida or Texas.** Official bulk files for California, Arizona and Florida could not be reached with an honest automated client, and Texas publishes no reuse licence on its dataset and disallows its CSV files in robots.txt. This Actor does not work around those.
- **A missing license is not proof of no license.** A lookup can miss a license that is outside the source, such as a new license the state has not published yet. Oregon, New York and Delaware drop licenses that are no longer current, so an expired license there shows as not found.
- **Status is what the source shows on the day of the run.** Confirm with the state before relying on it for a hiring, payment or legal decision.
- **`categories` for Washington are applied after reading,** at most 20,000 rows per state. Use a shorter date range if the log says the limit was reached.
- If one source is down, the run still succeeds with the others. See `RUN_SUMMARY` for per-source counts and errors.
- Not affiliated with any state government.

### Colorado notice

The terms of data.colorado.gov ask applications using its data to show this disclaimer:

> The data made available here has been modified for use from its original source, which is the State of Colorado. THE STATE OF COLORADO MAKES NO REPRESENTATIONS OR WARRANTY AS TO THE COMPLETENESS, ACCURACY, TIMELINESS, OR CONTENT OF ANY DATA MADE AVAILABLE THROUGH THIS SITE. THE STATE OF COLORADO EXPRESSLY DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. The data is subject to change as modifications and updates are complete. It is understood that the information contained in the Web feed is being used at one's own risk.

### Data sources and attribution

Each item carries its own `attribution` field with the publisher, dataset link and licence, so you can keep the credit when you pass the data on.

***

### 日本語

米国の 6 州（ワシントン・オレゴン・コネチカット・ニューヨーク・コロラド・デラウェア）の公式オープンデータから、建設業者の免許を同じ形式で取得します。免許番号での照合と、新しい順の一覧の 2 通りで使えます。各データ源の許諾または利用規約は事前に確認しており、免許検索の画面は巡回しません。出力は事業者名・免許の種類・状態・発行日・有効期限・市・郵便番号までで、個人事業主の氏名、役員の氏名、番地、メール、電話は出力しません。

# Actor input Schema

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

Optional, up to 1,000. Exact license numbers to look up, such as HIC.0512411 (Connecticut) or UDREABI745PT (Washington). When set, the other filters below are ignored and each number is checked in the selected states. Numbers with no match are listed in RUN_SUMMARY and are not charged.

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

Which official state sources to read. Leave all selected for every source.

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

Keep licenses whose business name contains any of these words, e.g. roofing, solar. Case-insensitive.

## `categories` (type: `array`):

Optional. New York and Delaware do not publish a trade, so they only match Unclassified.

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

Leave out expired, suspended and revoked licenses. Oregon, New York and Delaware only publish current licenses.

## `issuedWithinDays` (type: `integer`):

Only licenses issued in the last N days, to find newly licensed contractors. 0 = no date limit. Delaware publishes no issue date, so it is skipped when this is set.

## `expiringWithinDays` (type: `integer`):

Only licenses that expire in the next N days. 0 = no limit.

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

Total for the whole run, shared evenly across states, newest first within each state. You are charged per result.

## Actor input object example

```json
{
  "licenseNumbers": [],
  "states": [
    "washington",
    "oregon",
    "connecticut",
    "new-york",
    "colorado",
    "delaware"
  ],
  "keywords": [],
  "categories": [],
  "activeOnly": true,
  "issuedWithinDays": 0,
  "expiringWithinDays": 0,
  "maxItems": 100
}
```

# Actor output Schema

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

One item per license: state, license number, business name, trade category, license type, status, issue and expiry dates, city and ZIP, source URL and attribution.

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

Rows read and results returned per source in this run, with any source errors and any license numbers that were not found.

# 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": [
        "washington",
        "oregon",
        "connecticut",
        "new-york",
        "colorado",
        "delaware"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jp-data-lab/us-contractor-licenses-official-data").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": [
        "washington",
        "oregon",
        "connecticut",
        "new-york",
        "colorado",
        "delaware",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jp-data-lab/us-contractor-licenses-official-data").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 '{
  "states": [
    "washington",
    "oregon",
    "connecticut",
    "new-york",
    "colorado",
    "delaware"
  ]
}' |
apify call jp-data-lab/us-contractor-licenses-official-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jp-data-lab/us-contractor-licenses-official-data"
        }
    }
}
```

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/oMP0MoZihgYumdg7r/builds/n4DEHcNrBKgQD0v7a/openapi.json
