# Idaho Contractor License Lookup & List Scraper (DOPL) (`scrapebench/idaho-contractor-license-lookup`) Actor

Export every active Idaho contractor registration (25,863 on 2026-10-14) or look one up, with mailing address, county, DBA, status and issue/expiry dates from DOPL.

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

## Pricing

$0.004 / license record

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

## Idaho Contractor License Lookup & List Scraper (DOPL)

### Pain points

- DOPL's bulk list exports one licence type at a time through a click-through web form, as an .ods spreadsheet that mixes every status: the General Contractor file is 52,966 rows, of which 25,863 are active (2026-10-14).
- Picking a trade board rather than one licence type pulls in journeymen and apprentices: the Electrical board exports 47,289 rows, of which 3,327 are Electrical Contractor Licenses.
- Out-of-state firms are mixed in with local ones: 5,981 of the 25,863 active registrations have a mailing address outside Idaho, most often Washington (2,008) and Utah (1,126).

### What we solve

- One run returns the whole state, or the slice you need: filter by status (default Active), Idaho county, city or Idaho mailing addresses only, each with a batch list.
- Every row carries the business name, DBA, licence type, status, mailing street address, city, county, ZIP and the original issue and expiry dates, as clean columns with ISO dates.
- Trade contractors too: electrical, limited electrical, plumbing, plumbing specialty, HVAC, HVAC specialty and HVAC limited heating specialty contractor licences (5,183 active), contractor level only — no journeymen or apprentices.
- Verify in bulk: a list of licence numbers or business, DBA or licensee names returns each match, in every status.

### Summary

Idaho contractor licences from the Idaho Division of Occupational and Professional Licenses (DOPL), downloaded live from DOPL's own public bulk list on every run. Export mode returns active General Contractor Registrations statewide — 25,863 on 2026-10-14 — or any of seven trade contractor licence types, filtered by status, county, city or Idaho-only addresses. Lookup mode takes licence numbers or names. Every row has the business, DBA, mailing address, county, status and issue/expiry dates; phone and email appear only where DOPL has them, which is about 1 row in 9. Pay per licence returned.

### Who it's for

- Sales teams selling materials, equipment, insurance or software to Idaho builders and remodelers
- Direct-mail and lead-generation agencies building contractor mailing lists by county or city
- Suppliers and general contractors sourcing licensed electrical, plumbing or HVAC subcontractors
- Lenders, insurers and property managers verifying Idaho registrations in bulk

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "county": "Ada",
  "city": "Boise",
  "maxResults": 5000
}
```

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `license_number` | DOPL licence or registration number, e.g. RCE-54671 |
| `license_type` | General Contractor Registration, Electrical Contractor License, ... |
| `business_name` | Registered business (a sole proprietor's own name when there is none) |
| `dba_name` | Doing-business-as name, when filed |
| `status` | Active, Lapsed, Expired, Canceled, Inactive, Revoked, ... |
| `issue_date` | Original issue date (YYYY-MM-DD) |
| `expiration_date` | Expiry date (YYYY-MM-DD) |
| `address` | Mailing street address, with street 2 and unit |
| `city` | Mailing city |
| `county` | County of the mailing address |
| `address_state` | Mailing state (out-of-state firms register in Idaho) |
| `zip_code` | Mailing ZIP or ZIP+4 |
| `phone` | Phone where DOPL has one (10.9% of active registrations) |
| `email` | Email where DOPL has one (10.6% of active registrations) |
| `person_name` | The individual licensee, when a person holds the licence |
| `has_discipline` | True when DOPL flags public discipline |
| `trade` | general, electrical, plumbing or hvac |
| `matched_by` | export; or license_number, business_name, dba_name, person_name (lookup) |
| `source_url` | DOPL's online services page the export came from |

Sample:

```json
{
  "license_number": "RCE-54671",
  "license_type": "General Contractor Registration",
  "business_name": "SNAKE RIVER SPLICING LLC",
  "dba_name": "SNAKE RIVER SPLICING LLC",
  "status": "Active",
  "issue_date": "2020-05-21",
  "expiration_date": "2028-05-21",
  "address": "4530 W IRVING ST",
  "city": "BOISE",
  "county": "ADA",
  "address_state": "IDAHO",
  "zip_code": "83706-2342",
  "country": "USA",
  "phone": "(208) 994-4748",
  "email": "SNAKERIVERSPLICING@GMAIL.COM",
  "person_name": null,
  "has_discipline": false,
  "trade": "general",
  "matched_by": "export",
  "state": "ID",
  "source_url": "https://edopl.idaho.gov/onlineservices/_/"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `licenseType` | no | string | — | Which DOPL licences: general_contractor (General Contractor Registration, the default), electrical_contractor, limited_electrical_contractor, plumbing_contractor, plumbing_specialty_contractor, hvac_contractor, hvac_specialty_contractor, hvac_limited_heating_specialty_contractor — or a group: 'electrical', 'plumbing', 'hvac', 'trades' (all seven trade contractor types) or 'all'. DOPL's own type names work too. Contractor-level licences only: no journeymen or apprentices. Empty = General Contractor Registrations in an export, all eight types in a lookup. |
| `licenseTypes` | no | array | `[]` | Several licence types or groups in ONE run, e.g. electrical_contractor and plumbing_contractor. Combined with 'Licence type' if you fill both. An unrecognised value is dropped with a log line; if nothing you gave is recognised, the run returns a free row saying so instead of downloading anything. |
| `status` | no | string | `"Active"` | Active (default), or 'all' for every status. Lookups always search every status. |
| `statuses` | no | array | `[]` | Several statuses in ONE export, e.g. Lapsed and Expired (a win-back list). When filled, it replaces 'Licence status' (so its Active default does not sneak in). |
| `county` | no | string | — | An Idaho county on the licence's mailing address ('Ada', 'Kootenai County'). A value that is not one of Idaho's 44 counties is dropped and logged. |
| `counties` | no | array | `[]` | Several Idaho counties in ONE export. |
| `city` | no | string | — | Mailing-address city, exact match ignoring case and punctuation ('Boise', 'Coeur d'Alene'). |
| `cities` | no | array | `[]` | Several cities in ONE export. |
| `idahoAddressesOnly` | no | boolean | `false` | Out-of-state firms register in Idaho: 5,981 of the 25,863 active General Contractor Registrations (23%, 2026-10-14) have a mailing address outside Idaho, mostly Washington and Utah. Tick to drop them. |
| `query` | no | string | — | A DOPL licence number ('RCE-52165', 'ELE-C-12345', '065933' — case, spaces and dashes are ignored), or at least 3 letters of a business, DBA or licensee name, matched anywhere in it. Leave empty to run an export instead. |
| `queries` | no | array | `[]` | Several lookups in ONE run, one per line. Combined with the field above if you fill both. The run log says how many licences each one matched. |
| `maxResults` | no | integer | `500` | EXPORT: cap on licences for the WHOLE run — your spend control (25,863 active General Contractor Registrations on 2026-10-14; set 100000 to take everything that matches). LOOKUP: cap per name or number (default 50). |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. DOPL's site answered plain requests in testing; enable a proxy only if a run comes back with a 'blocked' notice. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **2209 active Boise general contractors** at *$0.004/result* ≈ **$8.84**.

The default export (500 licences) costs $2.00; every active General Contractor Registration (25,863 on 2026-10-14) costs $103.45 at maxResults 100000. Apify platform usage is billed separately.

### Use cases

- Direct mail: export every active registered contractor in Ada and Canyon counties with mailing address for a postcard campaign.
- New-business prospecting: re-run monthly and keep the rows with an issue date after your last run — 3,596 active registrations were first issued in 2026.
- Win-back lists: export Lapsed and Expired registrations (25,349 together on 2026-10-14) to reach firms that stopped renewing.
- Vendor compliance: run your subcontractors' licence numbers as a lookup batch and flag any that are not Active or close to expiry.

### Why this actor

- Mailing street address on 25,859 of the 25,863 active registrations, county on 24,358 and a DBA on 19,611 (measured 2026-10-14).
- Straight from DOPL's own public bulk list, downloaded fresh on every run; DOPL says the list is updated on weekday mornings and evenings.
- A file that comes back shorter than DOPL's own result count, or a filter value it does not recognise, returns a free notice row — never a quietly short or widened list.

### Limitations & updates

Contact data is thin: phone on 10.9% and email on 10.6% of active General Contractor Registrations (2026-10-14), so lead with the mailing address. Addresses are mailing addresses: 1,505 active registrations have no county, and 5,981 are outside Idaho. Trade contractor licences carry an address less often (Electrical Contractor 99%, Plumbing Contractor 61%, HVAC Contractor 59%). DOPL's export has no bond, insurance or classification fields. The county filter takes Idaho's 44 counties only. Each run downloads the whole licence type before filtering, so even a small General Contractor export takes about 35 seconds (measured from our workstation, 2026-10-14); trade contractor types take a few seconds.

### FAQ

**Where does the data come from?**

From the Idaho Division of Occupational and Professional Licenses (DOPL) public 'Search for a Bulk List of Licenses' at edopl.idaho.gov, downloaded on every run. DOPL publishes it under the Idaho Public Records Law. Nothing is cached.

**Does it include phone numbers and emails?**

Only where DOPL has them, which is a minority. On 2026-10-14, 2,819 of the 25,863 active General Contractor Registrations (10.9%) had a phone and 2,753 (10.6%) an email; 3,215 (12.4%) had either. Newer filings carry them more often: 943 of the 3,596 registrations first issued in 2026 (26%) have a phone. Trade contractor licences have fewer (Electrical Contractor 11%, Plumbing Contractor 5%, HVAC Contractor 4%). Treat this as an address and registration list, not a phone list.

**How many licences are there?**

25,863 active General Contractor Registrations on 2026-10-14 (52,966 in every status). Largest counties: Ada 4,676, Canyon 3,355, Kootenai 2,903, Bonneville 994. Active trade contractor licences: Electrical Contractor 2,130, Limited Electrical Contractor 313, Plumbing Contractor 1,271, Plumbing Specialty Contractor 221, HVAC Contractor 1,217, HVAC Specialty Contractor 28, HVAC Limited Heating Specialty Contractor 3.

**Export or lookup — which do I use?**

Export when you want a list: leave 'License number or name' empty and set the licence type, status, county or city. Lookup when you have licence numbers or names: names match anywhere in the business name, the DBA and the licensee's name, and every status is searched.

**Does it cover journeymen and apprentices?**

No — contractor-level licences only: General Contractor Registration plus the electrical, plumbing and HVAC contractor licence types. Journeyman and apprentice licences belong to individual workers, not to firms you can hire or sell to.

**How am I charged?**

$0.004 per licence returned. The default export returns 500 licences ($2.00); active registered general contractors in Boise were 2,209 ($8.84) on 2026-10-14. Rows explaining an outage, an unrecognised filter or no match are free.

### Which actor to choose

Part of the contractor-data suite — pick the one that fits your goal:

- **Washington Contractor License Lookup & Verify (L\&I)** — You need Washington contractors — the state where 2,008 of Idaho's active registrations have their mailing address.
- **Oregon Contractor License Lookup & Verify (CCB)** — You need Oregon contractors licensed by the Construction Contractors Board.
- **Nevada Contractor License Lookup & Verify (NSCB)** — You need Nevada contractors licensed by the State Contractors Board.
- **Utah Contractor Directory & Leads Scraper (DOPL)** — You need Utah contractors — Utah's DOPL is a different agency from Idaho's.
- **West Virginia Contractor License Lookup & Leads Scraper (WVCLB)** — You need West Virginia contractors — every current WVCLB licence with phone.

### Guides & use cases

Written up on **[scrapebench.dev](https://scrapebench.dev)** — the bench that runs and verifies this actor against the live source every night:

- **How-to:** [How to run Idaho Contractor License Lookup & List Scraper (DOPL)](https://scrapebench.dev/guides/how-to-idaho-contractor-license-lookup/)
- **Use case:** [Download Every Active Idaho Contractor Registration Statewide](https://scrapebench.dev/use-cases/idaho-contractor-list-statewide-export/)
- **Use case:** [Export Ada County, Idaho Registered General Contractors](https://scrapebench.dev/use-cases/ada-county-general-contractors/)

More actors, coverage and nightly verification results: **[scrapebench.dev](https://scrapebench.dev)**

### Works with AI assistants (MCP)

Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the [MCP tab](https://apify.com/scrapebench/idaho-contractor-license-lookup/api/mcp) on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.

Then just ask:

> "List the active registered general contractors in Boise, Ada County, Idaho, with mailing address and issue date."

That input returned 2,209 licences on 2026-10-14. With no filters and no name it exports up to maxResults active registrations statewide (25,863 in all), so set a county or city before running it from an agent. Runs started this way bill exactly like any other run.

# Actor input Schema

## `licenseType` (type: `string`):

Which DOPL licences: general_contractor (General Contractor Registration, the default), electrical_contractor, limited_electrical_contractor, plumbing_contractor, plumbing_specialty_contractor, hvac_contractor, hvac_specialty_contractor, hvac_limited_heating_specialty_contractor — or a group: 'electrical', 'plumbing', 'hvac', 'trades' (all seven trade contractor types) or 'all'. DOPL's own type names work too. Contractor-level licences only: no journeymen or apprentices. Empty = General Contractor Registrations in an export, all eight types in a lookup.

## `licenseTypes` (type: `array`):

Several licence types or groups in ONE run, e.g. electrical_contractor and plumbing_contractor. Combined with 'Licence type' if you fill both. An unrecognised value is dropped with a log line; if nothing you gave is recognised, the run returns a free row saying so instead of downloading anything.

## `status` (type: `string`):

Active (default), or 'all' for every status. Lookups always search every status.

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

Several statuses in ONE export, e.g. Lapsed and Expired (a win-back list). When filled, it replaces 'Licence status' (so its Active default does not sneak in).

## `county` (type: `string`):

An Idaho county on the licence's mailing address ('Ada', 'Kootenai County'). A value that is not one of Idaho's 44 counties is dropped and logged.

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

Several Idaho counties in ONE export.

## `city` (type: `string`):

Mailing-address city, exact match ignoring case and punctuation ('Boise', 'Coeur d'Alene').

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

Several cities in ONE export.

## `idahoAddressesOnly` (type: `boolean`):

Out-of-state firms register in Idaho: 5,981 of the 25,863 active General Contractor Registrations (23%, 2026-10-14) have a mailing address outside Idaho, mostly Washington and Utah. Tick to drop them.

## `query` (type: `string`):

A DOPL licence number ('RCE-52165', 'ELE-C-12345', '065933' — case, spaces and dashes are ignored), or at least 3 letters of a business, DBA or licensee name, matched anywhere in it. Leave empty to run an export instead.

## `queries` (type: `array`):

Several lookups in ONE run, one per line. Combined with the field above if you fill both. The run log says how many licences each one matched.

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

EXPORT: cap on licences for the WHOLE run — your spend control (25,863 active General Contractor Registrations on 2026-10-14; set 100000 to take everything that matches). LOOKUP: cap per name or number (default 50).

## `proxyConfiguration` (type: `object`):

Optional. DOPL's site answered plain requests in testing; enable a proxy only if a run comes back with a 'blocked' notice.

## Actor input object example

```json
{
  "licenseType": "general_contractor",
  "licenseTypes": [],
  "status": "Active",
  "statuses": [],
  "county": "Ada",
  "counties": [],
  "cities": [],
  "idahoAddressesOnly": false,
  "queries": [],
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Each row is one DOPL licence: business, DBA, type, status, mailing address, county, issue and expiry dates, and phone/email where DOPL has them.

# 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 = {
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/idaho-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 = {
    "maxResults": 500,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapebench/idaho-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 '{
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scrapebench/idaho-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

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