# Contractor License Lookup & Verifier (WA, OR, FL) (`datapenguin/contractor-license-lookup`) Actor

Check whether a contractor's license is active in Washington, Oregon or Florida, or search for licensed contractors by trade, city or ZIP code. Uses official state open data: status, expiration, trade, bond and insurance. No scraping, no API key.

- **URL**: https://apify.com/datapenguin/contractor-license-lookup.md
- **Developed by:** [Data Penguin](https://apify.com/datapenguin) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### Check a contractor's license in Washington, Oregon or Florida

Contractor License Lookup tells you whether a contractor's license is active, suspended or expired, and what trade it covers, when it expires and who holds it. It can also build a list of licensed contractors in a city or ZIP code, or find licenses that are about to come up for renewal.

The results come from the open data files that each state's licensing agency publishes itself, so there is no scraping of state websites, no login and no API key. Every result carries a link to its source file and to the state's official verification page.

Typical uses: a general contractor checking a subcontractor's license before signing, an insurance or surety team checking a batch of license numbers, a property manager keeping tabs on vendors, or a sales team building a list of licensed trades in one market.

#### Check a license

1. Click **Try for free** and open the **Input** tab.
2. Enter one or more license numbers under **License numbers**. For example `ECOSTSC758NN` (Washington), `100215` (Oregon) or `CBC0015082` (Florida). Keep all three states selected, or choose one.
3. Click **Start**, then open the **Output** tab.

To find contractors instead of checking known licenses, leave the license numbers empty and use **Trade**, **Cities**, **ZIP code prefixes** and **License status**.

#### Example input

This finds active general contractors in three ZIP code areas whose licenses expire within 90 days:

```json
{
    "states": ["WA", "OR", "FL"],
    "trades": ["general"],
    "zipCodes": ["981", "972", "331"],
    "statuses": ["ACTIVE"],
    "expiresWithinDays": 90,
    "maxItems": 100
}
```

#### What you get

For each license: state, license number, license type and trade (general, specialty, electrical, plumbing, HVAC, roofing or pool), business name, the license holder or principal, status, expiration date and days left, plus city, county and ZIP code. Oregon records also include the bond and insurance company, amount and expiry date. Street address and phone number are available if you turn on **Include street address and phone**.

#### Pricing

You pay $0.003 per license returned, which is $3 per 1,000, plus a start fee of $0.00005. A search that returns nothing costs only the start fee. Use **Max results** to set a ceiling on what a single run can cost.

#### Questions

##### Where does the data come from?

Washington Department of Labor & Industries (data.wa.gov), the Oregon Construction Contractors Board (data.oregon.gov) and the Florida DBPR Construction Industry Licensing Board public records file. Each result lists its source and the date that file was last updated.

##### How current is it?

Washington and Oregon refresh daily. The Florida file is updated by the state on most days, and the Actor's copy of it is rebuilt every day. Confirm on the state's own lookup before you hire someone or rely on a license.

##### How fast is a Florida lookup?

Florida publishes one large file and blocks direct downloads from cloud servers. To keep lookups quick, the Actor keeps a trimmed copy of that file, rebuilt every day, so a license number lookup usually finishes in under a minute. If the copy is missing or more than two days old, the Actor downloads the state's file itself, which can take a few minutes. Washington and Oregon lookups take a few seconds.

##### Why are addresses and phone numbers left out?

Many sole proprietors list a home address, so they are off by default. If you have a lawful reason to use them, turn on **Include street address and phone**.

##### Why does Oregon only show active licenses?

That is how the state publishes its file. Washington and Florida also list suspended, inactive and other statuses.

##### Which states are next?

Texas (air conditioning and electrical) and California are the candidates. Tell me which one you need in the **Issues** tab.

#### Good to know

This is an independent tool. It is not affiliated with or endorsed by any state agency. The data can be incomplete or out of date, and nothing here is legal advice.

#### Changelog

- **0.2.6** (October 27, 2026): Florida license number lookups are much faster. The Actor now keeps a daily copy of the Florida file instead of downloading it on every run.
- **0.2.3** (October 27, 2026): Wording fixes.
- **0.2** (October 27, 2026): Plainer input form, 1 GB default memory.
- **0.1** (October 27, 2026): First release for Washington, Oregon and Florida.

# Changelog

This Actor's version history is a separate document: https://apify.com/datapenguin/contractor-license-lookup/changelog.md

# Actor input Schema

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

Which states to search. When you browse with filters, results are split evenly between the states you pick. A Florida license number lookup usually takes under a minute.

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

Exact license numbers, for example <code>ECOSTSC758NN</code> (WA), <code>100215</code> (OR) or <code>CBC0015082</code> (FL). Digits alone work too. Leave empty to browse with filters.

## `searchTerms` (type: `array`):

Text to look for in the business name, DBA name or license holder name. Not case sensitive.

## `trades` (type: `array`):

Leave empty for all trades. Not every state publishes every trade. Washington has electrical and plumbing, Oregon has general and specialty contractors, and Florida (construction board) has general, HVAC, roofing, plumbing, pool and specialty.

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

Active licenses only by default. Add Suspended or Expired to find problem licenses. Oregon's file only lists active licenses.

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

Exact city names, not case sensitive, for example SEATTLE, PORTLAND or MIAMI.

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

The first digits of a ZIP code. 981 matches 98101 and 98199.

## `counties` (type: `array`):

County names for Oregon and Florida, for example Multnomah or Miami-Dade.

## `expiresWithinDays` (type: `integer`):

Only licenses that expire between today and this many days from now. Use 60 to see renewals coming up.

## `includeContact` (type: `boolean`):

Off by default, because sole proprietors often list a home address. Turn it on only if you have a lawful reason, and follow the rules for contacting people where you work.

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

The most results to return. You are charged per result, so this also caps what a run can cost.

## Actor input object example

```json
{
  "states": [
    "WA",
    "OR",
    "FL"
  ],
  "statuses": [
    "ACTIVE"
  ],
  "includeContact": false,
  "maxItems": 25
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `summary` (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 = {
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("datapenguin/contractor-license-lookup").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 = { "maxItems": 25 }

# Run the Actor and wait for it to finish
run = client.actor("datapenguin/contractor-license-lookup").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 '{
  "maxItems": 25
}' |
apify call datapenguin/contractor-license-lookup --silent --output-dataset

```

## MCP server setup

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

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/jUUSTIYvnKUpzZmRS/builds/LqZ9pOEzh4vYMihyU/openapi.json
