# Contractor License Lookup & Verify: WA, OR, CT, TX, NY & NYC (`eriksharon10/contractor-license-check`) Actor

Contractor license lookup and verification by name or license number against official registries: Washington L\&I, Oregon CCB, Connecticut DCP, Texas TDLR, NYC DCWP and NY State DOL. Status, expiry, bond, insurance, debarment flags and an OK / CHECK / PROBLEM verdict. Official open data.

- **URL**: https://apify.com/eriksharon10/contractor-license-check.md
- **Developed by:** [Erik Sharon](https://apify.com/eriksharon10) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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 & Verification: WA, OR, CT, TX, New York State & NYC

Check whether a contractor is licensed before you hire them, pay them or add them to your vendor list. Type a business name or a license number and get the official record back from six government registries in one run, with a plain verdict: **OK**, **CHECK** or **PROBLEM**.

### Contractor license lookup in six registries at once

- **Official data, not scraping.** Every record comes from the state's or city's own open-data API (Socrata). No HTML parsing, no captchas, nothing that breaks when a website changes.
- **Six registries in one run:** Washington L\&I contractors, Oregon Construction Contractors Board (with bond and insurance), Connecticut DCP contractor credentials (home improvement, electrical, plumbing, HVAC, new home and more), Texas TDLR contractor licenses (A/C, electrical, elevator, appliance), NYC DCWP Home Improvement Contractor licenses, and the New York State Department of Labor Contractor Registry (every contractor bidding on NYS public work over $25,000 must be registered).
- **Flags you can act on:** NOT_ACTIVE, EXPIRED, EXPIRES_SOON, for Oregon BOND_EXPIRED / INSURANCE_EXPIRES_SOON, and for New York State DEBARRED, WAGE_ASSESSMENTS_OUTSTANDING, LABOR_OR_TAX_LAW_VIOLATION, SAFETY_VIOLATION and NO_WORKERS_COMP.
- **Fast and cheap:** about 25 lookups in 6 seconds. You pay only for records found; "not found" rows are free.

### Bulk contractor license verification: input

| Field | What it does |
|---|---|
| `names` | Business names, one per line. Every word must be in the licensed name. |
| `licenseNumbers` | License numbers exactly as issued (`ECOSTSC758NN`, `126960`, `HIC.0704738`, `36159`, `0673029-DCA`, `25-649OY-CR`). |
| `jurisdictions` | Any of `WA`, `OR`, `CT`, `TX`, `NYC`, `NYS`. Empty = all six. |
| `maxResultsPerQuery` | Matches per query per registry (default 5). Active first, latest expiry next. |
| `includeInactive` | Keep lapsed licenses, flagged PROBLEM (default on). |
| `expiryWarningDays` | Window for EXPIRES_SOON (default 30). |
| `reportNotFound` | One free NOT_FOUND row per query and registry (default on). |

```json
{ "names": ["Mr Handyman"], "licenseNumbers": ["0673029-DCA"], "jurisdictions": ["CT", "WA", "NYC"] }
```

### Output (one row per license)

```json
{
  "query": "Mr Handyman",
  "jurisdiction": "NYC",
  "verdict": "OK",
  "businessName": "MR. FIXIT HANDYMAN & HOME IMPROVEMENT CORP.",
  "licenseNumber": "1471429-DCA",
  "licenseType": "Home Improvement Contractor",
  "statusRaw": "ACTIVE",
  "active": true,
  "issued": "2014-07-22",
  "expires": "2027-02-28",
  "daysToExpiry": 117,
  "flags": [],
  "city": "BRONX", "state": "NY", "zip": "10461", "borough": "Bronx",
  "source": "NYC DCWP Home Improvement Contractor licenses",
  "officialVerifyPage": "https://www.nyc.gov/site/dca/businesses/check-license.page",
  "sourceApiQuery": "https://data.cityofnewyork.us/resource/w7w3-xahh.json?...",
  "checkedAt": "2026-11-03T00:57:02Z"
}
```

Oregon rows add `bond` and `insurance` (company, amount, expiry). Washington rows add `specialties` and `ubi`. New York State rows add `compliance` (debarred, outstanding wage assessments, labor/tax and safety violations, workers' comp, apprenticeship) and `mwbeOwned`.

### Good to know

- Texas publishes no status field; a Texas license counts as active until its expiration date.
- The New York State registry lists active certificates only, so a lapsed one shows as NOT_FOUND. It covers public-work contractors, not every home contractor; for New York City home improvement use `NYC`.
- Oregon's dataset lists active licenses only, so a lapsed Oregon license shows as NOT_FOUND.
- Business data only: no owner names, phone numbers or street addresses are returned.
- Data is as fresh as each registry's open-data feed (most refresh daily). For a legal decision, confirm on the `officialVerifyPage`.

### FAQ

**How do I look up a contractor license by name?** Put the business name in `names`. Every word you type must appear in the licensed name, so "Bee Cave" finds "BEE CAVE ELECTRIC" in Texas. Leave `jurisdictions` empty to search all six registries.

**Can I verify a list of contractors in bulk?** Yes. Paste hundreds of names or license numbers in one run; each one is checked against every registry you pick, and the dataset exports to CSV, Excel or JSON. About 25 lookups take 6 seconds.

**Which states does it cover?** Washington (L\&I contractor registration), Oregon (CCB, with bond and insurance), Connecticut (DCP home improvement, electrical, plumbing, HVAC and other trade credentials), Texas (TDLR A/C, electrical, elevator and appliance licenses), New York City (DCWP Home Improvement Contractor licenses) and New York State (DOL Contractor Registry for public work, with debarment and wage flags). Other states are not covered yet.

**Is this a scraper?** No. It reads each government's official open-data API, so it does not break when a website redesigns and it never solves captchas or logs in anywhere.

**How do I check if a contractor is debarred in New York?** Use `jurisdictions: ["NYS"]`. A debarred contractor gets the DEBARRED flag and a PROBLEM verdict; outstanding wage assessments, labor or tax law violations, safety violations and missing workers' comp are flagged too.

**Does a NOT_FOUND mean the contractor is unlicensed?** Not on its own. Some registries list only active licenses, names can be registered differently (a DBA versus the legal name), and some trades are licensed by another agency. Try the license number, then confirm on the `officialVerifyPage` link.

### Pricing

Pay per license record found. Not-found rows are free. Set a maximum charge per run in Apify and the run stops when it is reached.

# Actor input Schema

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

One per line. Every word must appear in the licensed name ("Bee Cave Electric"). Leave out LLC / Inc for wider matches.

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

One per line, exactly as issued (WA "ECOSTSC758NN", OR "126960", CT "HIC.0601234" or the number alone, TX "36159", NYC "0673029-DCA", NY State registry "25-649OY-CR").

## `jurisdictions` (type: `array`):

Leave empty to search all six.

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

Active licenses come first, then the latest expiry.

## `includeInactive` (type: `boolean`):

Keep them (flagged PROBLEM) so you can see a lapsed license.

## `expiryWarningDays` (type: `integer`):

License, bond or insurance expiring within this many days is flagged CHECK.

## `reportNotFound` (type: `boolean`):

One free NOT_FOUND row per query and registry with no match, so batch results line up.

## `socrataAppToken` (type: `string`):

Only for very large batches; raises the open-data rate limit.

## Actor input object example

```json
{
  "names": [
    "Bee Cave Electric",
    "Express Excavation"
  ],
  "maxResultsPerQuery": 5,
  "includeInactive": true,
  "expiryWarningDays": 30,
  "reportNotFound": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per contractor checked: license status, expiry, bond and insurance where published, and an OK / CHECK / PROBLEM flag.

# 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 = {
    "names": [
        "Bee Cave Electric",
        "Express Excavation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eriksharon10/contractor-license-check").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 = { "names": [
        "Bee Cave Electric",
        "Express Excavation",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eriksharon10/contractor-license-check").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 '{
  "names": [
    "Bee Cave Electric",
    "Express Excavation"
  ]
}' |
apify call eriksharon10/contractor-license-check --silent --output-dataset

```

## MCP server setup

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

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/B6hfGduPHxNsjuLOF/builds/FyszqfmEVnfYldzdN/openapi.json
