# US Contractor Licenses – Multi-State Leads (`orventasystems/contractor-licenses`) Actor

Licensed contractors from official state licensing open data (WA, OR, TX, CO, CT, IL, NY) in one format: business name, license, trade, status, expiry, address and phone where published. Filter by trade, city, ZIP or newly licensed; only-new mode for alerts.

- **URL**: https://apify.com/orventasystems/contractor-licenses.md
- **Developed by:** [Purvin Patel](https://apify.com/orventasystems) (community)
- **Security:** Limited permissions
- **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 Licenses – Multi-State Leads

Get **licensed contractors from 7 US states in one clean format**: business name, license type and number, trade, status, first-issue and expiration dates, address and phone (where the state publishes them).

Find **newly licensed contractors** (brand-new businesses), build trade-specific lead lists by city or ZIP, or verify a contractor's license. All data comes from **official state licensing open data**. No API key, no login.

### States covered

| State | Licensing body | Contractors included | Phone | First-issue date |
|---|---|---|---|---|
| **Washington** | L\&I | All construction, electrical, plumbing & elevator contractors | ✅ | ✅ |
| **Oregon** | Construction Contractors Board | All residential & commercial contractors (+ bond & insurance amounts) | ✅ | ✅ |
| **Texas** | TDLR | A/C (HVAC), electrical, electrical sign, appliance installation & elevator contractors | ✅ | – |
| **Colorado** | DORA | Electrical & plumbing contractors | – | ✅ |
| **Connecticut** | DCP | Home improvement, new home, major, electrical, HVAC, plumbing, demolition, pool & more | – | ✅ |
| **Illinois** | IDFPR | Roofing contractors, alarm contractor agencies | – | ✅ |
| **New York** | NYS DOL | Contractor Registry for public work (+ MWBE & debarment flags) | ✅ | ✅ |

That's over 250,000 active contractor licenses in total, with roughly **3,000 newly licensed contractors a month**.

### What people use it for

- **Selling to contractors**: building materials, tools, equipment rental, insurance, bonding, software, financing, marketing services
- **New-business outreach**: reach contractors in their first weeks of business, when they're choosing suppliers and vendors
- **Recruiting and partnerships**: find licensed electricians, plumbers, HVAC and roofing companies in a territory
- **Verification and compliance**: check license status, expiry, bond and insurance (OR), and public-work registration (NY)

### Features

- 🗂️ **One schema for 7 states**, with every license mapped to a common **trade category** (general, electrical, plumbing, HVAC, roofing, home improvement, specialty, fire protection, elevator, demolition, asbestos/lead, pools, landscaping, security/alarm…)
- 🆕 **Newly licensed within N days**: only contractors whose license was *first* issued recently (WA, OR, CO, CT, IL, NY)
- 🔁 **Only new licenses**: remembers what you've already received, so a weekly schedule gives you just the new ones in *every* state, Texas included
- 📍 **City and ZIP filters** (ZIP prefixes like `981` work), plus keywords and an "active only" option
- ⚡ **Fast**: official data APIs only. A month of new licenses across 6 states takes about 25 seconds.
- 🔒 **Business data only**: contractor-level licenses only, no apprentice, journeyman or other personal licenses, and owner, officer and principal names are never collected

### Example input

```json
{
  "states": ["WA", "OR", "CT"],
  "categories": ["roofing", "general", "home_improvement"],
  "newlyLicensedWithinDays": 30,
  "activeOnly": true
}
```

**Weekly alert:** create a Task, set your states, trades and area, turn on **Only new licenses**, and schedule it weekly. Send results to Google Sheets, your CRM, Slack or email with Apify integrations.

### Example output

```json
{
  "id": "WA:CONSTRUCTION CONTRACTOR:ACMEBBL123AB",
  "state": "WA",
  "businessName": "ACME BUILDERS LLC",
  "licenseNumber": "ACMEBBL123AB",
  "licenseType": "CONSTRUCTION CONTRACTOR",
  "category": "roofing",
  "specialties": ["ROOFING"],
  "status": "ACTIVE",
  "issueDate": "2026-10-01",
  "expirationDate": "2028-10-01",
  "address": "1 MAIN ST",
  "city": "SEATTLE",
  "addressState": "WA",
  "zip": "98101",
  "phone": "(206) 555-0100",
  "entityType": "Limited Liability Company",
  "businessId": "600000001",
  "source": "https://data.wa.gov/d/m8qx-ubtq"
}
```

Other fields where available: `dba`, `effectiveDate`, `county`, `bondAmount` and `insuranceAmount` (OR), `verifyUrl` (CO), and `mwbeOwned` / `debarred` (NY).

### Input reference

| Field | What it does |
|---|---|
| States | Which states to search (default: Connecticut). |
| Trades | Normalized trade categories to include. |
| Newly licensed within N days | Original issue date in the last N days. Texas doesn't publish issue dates, so it's skipped for this filter. |
| Cities / ZIP codes | Location filters (ZIP prefixes supported). |
| Keywords | Match on business name, license type or specialty. |
| Active licenses only | Skip expired, suspended or revoked licenses (default on). |
| Only new licenses | Return only licenses not seen in earlier runs with the same filters. |
| Maximum results | Cap per run, across all states. |

### Notes

- Data is as published by each state licensing body, usually updated daily.
- For sole proprietors, the licensed business name may be the owner's own name; that is the public name the license is issued under.
- If a state's portal is temporarily unavailable, that state is skipped for the run (with a warning) and the others still complete.

### Related Actors

- **[US Building Permits Monitor – Contractor Leads](https://apify.com/orventasystems/building-permits-monitor)**: see which contractors are pulling permits right now, and for what projects, in Chicago, NYC, LA, Austin, Seattle, San Francisco and more.
- **[SAM.gov Contract Opportunities Monitor](https://apify.com/orventasystems/samgov-opportunities-monitor)**: new federal contract bids by NAICS and set-aside.

### Support

Want another state or license type? Open an issue on the **Issues** tab. I typically reply within one business day.

# Actor input Schema

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

Which states' official contractor-license records to search.

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

Only these trade categories. Leave empty for all.

## `newlyLicensedWithinDays` (type: `integer`):

Only contractors whose license was FIRST issued in the last N days – great for reaching brand-new businesses. Works for WA, OR, CO, CT, IL and NY (Texas doesn't publish issue dates; use 'Only new licenses' with a schedule for Texas).

## `cities` (type: `array`):

Only contractors located in these cities (business/mailing address), e.g. Seattle, Hartford.

## `zipCodes` (type: `array`):

Only these ZIP codes. Prefixes work too, e.g. 981 for the Seattle area.

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

Only licenses whose business name, license type or specialty contains one of these, e.g. solar, roofing, LLC.

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

Skip expired, suspended or revoked licenses (where the state publishes status).

## `onlyNew` (type: `boolean`):

Remember licenses already returned by earlier runs with the same filters and output only new ones. Schedule it weekly to catch every newly licensed contractor – in every state.

## `maxResults` (type: `integer`):

Stop after this many licenses are saved (across all states).

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

Optional free token from any Socrata open-data portal. Only useful for very large pulls if a portal rate-limits. Not required.

## Actor input object example

```json
{
  "states": [
    "CT"
  ],
  "categories": [],
  "cities": [],
  "zipCodes": [],
  "keywords": [],
  "activeOnly": true,
  "onlyNew": false,
  "maxResults": 100
}
```

# Actor output Schema

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

Contractor licenses found by this run.

# 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": [
        "CT"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("orventasystems/contractor-licenses").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": ["CT"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("orventasystems/contractor-licenses").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": [
    "CT"
  ],
  "maxResults": 100
}' |
apify call orventasystems/contractor-licenses --silent --output-dataset

```

## MCP server setup

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

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/wbg8zGHqBfvs2MrOi/builds/qIwC1bBwkjDFhe1Ja/openapi.json
