# New Contractor Licenses Feed - WA, OR, NY (official data) (`allencnyj/new-contractor-licenses`) Actor

Newly issued contractor licenses from state open-data APIs, normalized into one schema with business name, license type, phone, address, principal and verify link. Filter by state, license type and days back.

- **URL**: https://apify.com/allencnyj/new-contractor-licenses.md
- **Developed by:** [Allen Chen](https://apify.com/allencnyj) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.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

## New Contractor Licenses Feed — WA, OR, NY (official state data)

Every week thousands of contractors get their first license. This Actor returns the **newly issued contractor licenses** from official state registries as one clean, normalized list: business name, license type, phone, address, principal, issue and expiry dates, and a link to verify the license on the state site.

Sources are the states' own open-data APIs, not scraped web pages, so the feed does not break when a website changes.

### Who uses this

- **Building-material suppliers, tool and equipment dealers** — a new license means a new account to open.
- **Contractor insurance and surety bond agents** — new licensees must carry bonds and liability coverage from day one.
- **Software vendors** (estimating, invoicing, scheduling, CRM) — reach contractors before they pick their tools.
- **Marketing agencies and lead-gen shops** serving the trades.
- **Lenders and payment processors** targeting small construction businesses.

### Covered states

| State | Registry | Refresh | New per week (typical) |
|---|---|---|---|
| Washington | L\&I Contractor License Data | Daily | about 200 |
| Oregon | CCB Active Licenses | Daily | about 130 |
| New York | DOL Contractor Registry Certificates | Daily | about 250 |

More states are added on request. Open an issue with the state you need.

### What you get per license

| Field | Example |
|---|---|
| state | OR |
| licenseNumber | 259931 |
| businessName | NORTHWEST PEAK BUILDERS LLC |
| licenseType / licenseTypeCode | Residential General Contractor / RGC |
| endorsement | Residential General Contractor |
| status | Active |
| issuedDate / expirationDate | 2026-09-19 / 2028-09-19 |
| phone | (503) 555-0142 |
| address, city, zip, county | 123 MAIN ST, PORTLAND, 97201, Multnomah |
| principalName | JANE DOE |
| businessType | Limited Liability Company (WA, NY) |
| bondCompany / bondAmount | WESTERN SURETY COMPANY / 25000 (OR) |
| insuranceCompany / insuranceAmount | SCOTTSDALE INSURANCE CO / 1000000 (OR) |
| extra | state-specific fields such as WA UBI number or NY workers-comp and debarment flags |
| verifyUrl | link to the state's license lookup |

### Filters

- **States** — any combination of WA, OR, NY
- **Issued within the last N days** or an explicit **since date**
- **License type contains** — e.g. GENERAL, ELECTRICAL, RESIDENTIAL, PLUMBING, HOME INSPECTOR
- **Require phone**
- **Maximum results** to cap spend

### How to run

1. Click **Try for free**.
2. Pick your states and how many days back.
3. Run. Download from the **Output** tab as CSV, Excel or JSON, or connect Google Sheets, Zapier or Make.

Schedule it weekly with **days back = 7** to receive each week's new licensees automatically.

### Pricing

You pay per license returned. Filtering is free. Use **Maximum results** to cap any run.

### Data sources

- Washington: L\&I Contractor License Data, data.wa.gov dataset `m8qx-ubtq`
- Oregon: CCB Active Licenses, data.oregon.gov dataset `g77e-6bhs`
- New York: Contractor Registry Certificate, data.ny.gov dataset `i4jv-zkey`

All three are public records published by the state agencies. You are responsible for complying with TCPA, CAN-SPAM and state telemarketing rules when you contact these businesses.

### Related Actors

- FMCSA New Carrier Leads — newly registered trucking companies with phone and email
- ATS Job Feeds — job postings from SmartRecruiters, Teamtailor and Personio career sites

# Actor input Schema

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

Which state registries to pull. Currently Washington (L\&I), Oregon (CCB) and New York (DOL Contractor Registry).

## `daysBack` (type: `integer`):

Return licenses issued or first registered within this many days. Ignored if 'Since date' is set.

## `sinceDate` (type: `string`):

Return licenses issued on or after this date, format YYYY-MM-DD. Overrides 'daysBack'.

## `licenseTypeContains` (type: `array`):

Keep only licenses whose type or endorsement contains one of these words, e.g. GENERAL, ELECTRICAL, RESIDENTIAL, PLUMBING. Case-insensitive.

## `requirePhone` (type: `boolean`):

Only return licenses that list a phone number.

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

Stop after this many licenses in total. Controls your cost.

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

Free token from any Socrata portal to raise rate limits on very large pulls. Not required.

## Actor input object example

```json
{
  "states": [
    "WA",
    "OR",
    "NY"
  ],
  "daysBack": 7,
  "licenseTypeContains": [],
  "requirePhone": false,
  "maxResults": 2000
}
```

# Actor output Schema

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

One record per newly issued license with business name, type, phone, address, principal and verify link.

## `summary` (type: `string`):

Counts, filters used and finish time for 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": [
        "WA",
        "OR",
        "NY"
    ],
    "daysBack": 7,
    "licenseTypeContains": [],
    "maxResults": 2000
};

// Run the Actor and wait for it to finish
const run = await client.actor("allencnyj/new-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": [
        "WA",
        "OR",
        "NY",
    ],
    "daysBack": 7,
    "licenseTypeContains": [],
    "maxResults": 2000,
}

# Run the Actor and wait for it to finish
run = client.actor("allencnyj/new-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": [
    "WA",
    "OR",
    "NY"
  ],
  "daysBack": 7,
  "licenseTypeContains": [],
  "maxResults": 2000
}' |
apify call allencnyj/new-contractor-licenses --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,allencnyj/new-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/dwHhiSVIz3zgHovRf/builds/cJr7f6taVQJH96q4y/openapi.json
