# Wyoming Contractor License Lookup & Leads Scraper (DFPES) (`scrapebench/wyoming-contractor-license-lookup`) Actor

Every Wyoming electrical contractor licence from the Department of Fire Prevention and Electrical Safety: electrical, limited and low-voltage contractors with phone, street address, city, licence number and expiry. Export the list or look up a firm.

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

## Pricing

$0.004 / contractor licence

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

## Wyoming Contractor License Lookup & Leads Scraper (DFPES)

### Pain points

- The Department's public lookup refuses to search until you type into a filter field ("Please enter a value into one of the filter fields to search"), so there is no button that lists every contractor.
- Results come back as a paged on-screen table with no download or export (checked 2026-11-04).
- Wyoming has no statewide general contractor licence; the only state-issued contractor licences are the Department's electrical ones, so a Wyoming contractor list starts here.

### What we solve

- Reads the Department's whole contractor roster live in every run: 2,136 contractor licences on November 4, 2026, 1,158 of them unexpired.
- One clean table: business name, licence number as printed, licence type, phone, street address, city, expiration date and an Unexpired / Expired flag derived from that date.
- Looks up firm names (contained in the business name) or licence numbers (exact) live against the Department's own search.

### Summary

Wyoming Department of Fire Prevention and Electrical Safety contractor licences in one dataset: every contractor in the Department's public lookup, from Electrical Contractors to the limited (LM-) and low-voltage (LV-) contractor classes, in the board's own codes. Each row has the business name, licence number, licence type, phone, street address, city and expiration date, plus a primary contact name where the board lists one. On November 4, 2026 the roster held 2,136 contractor licences; 1,158 were unexpired, 848 of them Electrical Contractors, and of those 1,158 a street address filled 1,157 and a phone 1,149. The board publishes no state, ZIP or email. Every run reads the Department's current roster. Pay only per licence returned.

### Who it's for

- Electrical distributors and suppliers selling to contractors working in Wyoming
- Low-voltage, security and HVAC vendors reaching the limited and low-voltage contractor classes
- General contractors and property managers vetting an electrical subcontractor's licence and expiry
- Compliance teams checking a Wyoming licence number before work starts

### How to use

This actor does two jobs. Run it, then collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API).

**Get a list (export):** no names, just filters; returns the whole matching list.

```json
{
  "expiry_statuses": [
    "Unexpired"
  ],
  "maxResults": 500
}
```

**Check specific firms (lookup):** put company names or licence numbers in `mode`, `queries`; **Inputs** below says how each is matched.

```json
{
  "mode": "lookup",
  "queries": [
    "3 G Electric",
    "C-47283"
  ],
  "maxResults": 20
}
```

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

### What you get

One row per record:

| Field | Description |
|---|---|
| `name` | Business name as the Department lists it |
| `listing_id` | Licence number exactly as printed (C-47283, LV-..., L-...); empty on about 10% of rows (224 of 2,136 on 2026-11-04), where the board lists none |
| `category` | Licence type in the board's words: Electrical Contractor, or a limited (LM-) or low-voltage (LV-) contractor class |
| `phone` | Business phone as printed |
| `phone_e164` | The same phone in +1XXXXXXXXXX form |
| `street` | Street address (one line; the board publishes no state or ZIP) |
| `city` | City; many licensed firms are out of state (Idaho Falls, Denver, Salt Lake City) |
| `extras.expires` | Licence expiration date (ISO) |
| `extras.expiry_status` | Unexpired or Expired, derived from the expiration date on the day of the run (the board publishes no status field) |
| `extras.contact_name` | Primary contact person, on about a quarter of rows |
| `extras.licence_type` | The licence type as the board returned it |
| `source_url` | The Department's public lookup portal, tagged with the board's own contractor id (no per-contractor page is public) |

Sample:

```json
{
  "listing_id": "C-47283",
  "name": "3 G Electric LLC",
  "phone": "208-313-7413",
  "phone_e164": "+12083137413",
  "street": "4554 Clydes Turn",
  "city": "Tetonia",
  "country": "US",
  "category": "Electrical Contractor",
  "categories": [
    "Electrical Contractor"
  ],
  "source": "live",
  "source_url": "https://wyelectrician.imagetrendlicense.com/lms/public/portal#contractor-6feb3434-0f5a-e911-80d4-001dd8b723fb",
  "extras": {
    "licence_type": "Electrical Contractor",
    "expires": "2027-07-01",
    "expiry_status": "Unexpired"
  }
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `mode` | no | string | `"auto"` | export: no names, just filters; returns the whole matching list. lookup / verify: put company names (matched if contained in the company name) or licence numbers (exact) in 'queries'. auto picks the mode for you. |
| `query` | no | string | — | A business name (or listing number) to look up live. Kept alongside 'queries' for saved tasks. |
| `queries` | no | array | `[]` | A business name (or listing number) to look up live. Several values in one run; combined with 'query'. |
| `city` | no | string | — | Only listings in this city. Kept alongside 'cities' for saved tasks. |
| `cities` | no | array | `[]` | Only listings in this city. Several values in one run; combined with 'city'. |
| `expiry_status` | no | string | — | Only listings in this expiry_status. Kept alongside 'expiry_statuses' for saved tasks. |
| `expiry_statuses` | no | array | `[]` | Only listings in this expiry_status. Several values in one run; combined with 'expiry_status'. |
| `categories` | no | array | `[]` | Only rows from this licence type (one or more). Available: Chemical Suppression, Chemical Suppression, Extinguisher, Sprinkler, Electrical Contractor, LM-E Contractor, LM-H Contractor, LM-L Contractor, LM-S Contractor, LM-W Contractor, LV-A Contractor, LV-C Contractor, LV-G Contractor, LV-LS Contractor, LV-S Contractor, LV-T Contractor, LV-X Contractor, Unspecified. |
| `maxResults` | no | integer | `500` | Per query in lookup mode; per run in export mode. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Used for every request to the source; off by default. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **1000 contractor licences** at *$0.004/result* ≈ **$4.00**.

Notices (unknown licence type, no match, source unavailable) are free.

### Use cases

- Sales lists: every Wyoming electrical contractor with an unexpired licence, with phone and street address.
- Trade outreach: low-voltage (LV-G, LV-A, LV-C) contractors for an alarm or communications product.
- Subcontractor checks: confirm a licence number exists and read its expiration date.
- Market sizing: count licensed electrical contractors by city, in and out of state.

### Why this actor

- The whole roster in one run; the Department's lookup needs a filter value and has no export.
- Phone on almost every unexpired licence (1,149 of 1,158 on 2026-11-04).
- Read live from the Department's lookup on every run, not a stored copy.
- Pay per licence; notices are free.

### Limitations & updates

Covers the contractor records in the Wyoming Department of Fire Prevention and Electrical Safety's public lookup: electrical, limited and low-voltage contractor licences (2,136, 1,158 unexpired, on 2026-11-04). Individual electricians' licences and the 21 inspecting authorities the lookup also lists are not included. No email, state or ZIP; about 10% of rows carry no licence number. The board's own page says a system migration is in progress, so the lookup may change.

### FAQ

**Where does the data come from?**

The public contractor lookup of the Wyoming Department of Fire Prevention and Electrical Safety (wyelectrician.imagetrendlicense.com). Every run reads its current roster.

**Does it cover general contractors, plumbers or HVAC?**

Wyoming has no statewide general contractor, plumbing or HVAC licence; cities and counties license those trades locally. The state licenses electrical work, so this covers Electrical Contractors and the limited (LM-) and low-voltage (LV-) contractor classes, including the limited HVAC (LM-H) and water well (LM-W) electrical classes.

**Are expired licences included?**

Yes, the board's lookup lists them. Set Expiry Status to Unexpired for current licences only. The board publishes an expiration date but no status; the flag is derived from that date on the day you run it.

**Is there an email, state or ZIP?**

No. The board publishes a phone, one street-address line and a city. Many licensed firms are based out of state, so the city may be in Idaho, Colorado, Utah or further away.

**How do I look up a firm or a licence number?**

Put business names or licence numbers in queries and set mode to lookup. A name matches if it is contained in the business name; a number matches exactly (C-47283 and C47283 both work).

**How current is it?**

Every run reads the Department's current roster.

**How am I charged?**

One event per licence returned. Notices are free.

### 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 Wyoming Contractor License Lookup & Leads Scraper (DFPES)](https://scrapebench.dev/guides/how-to-wyoming-contractor-license-lookup/)
- **Use case:** [Wyoming Electrical Contractors (DFPES)](https://scrapebench.dev/use-cases/wyoming-electrical-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/wyoming-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 Wyoming electrical contractors with an unexpired licence from the Department of Fire Prevention and Electrical Safety, with their phone numbers."

That is Licence type Electrical Contractor with Expiry Status Unexpired (848 licences on 2026-11-04). Keep maxResults small on a first call. Runs started this way bill exactly like any other run.

### Data & lawful use

This actor collects publicly available information that the Wyoming Department of Fire Prevention and Electrical Safety (DFPES) publishes for public
lookup — licence records, business listings and the contact details professionals list there.
Some of it identifies individuals (sole proprietors, licence holders, agents), so treat any
names, phone numbers and emails in your results as personal data.

When you run this actor, you decide what is collected and what it is used for, so you are the
controller of that data and we act only as your processor (Apify Standard Actor Contract).
You need a lawful basis for your use, must honour opt-out and deletion requests, and must
follow the marketing rules that apply to you (CAN-SPAM, TCPA, GDPR, CCPA and similar).
Don't use the output for unsolicited bulk messaging, for screening covered by the FCRA, or
for anything the source's own terms forbid.

Your results are stored in your own Apify account. We don't keep a copy of your results and
don't sell or share them.

### Disclaimer

This is an independent tool. It is not affiliated with, endorsed by or sponsored by
the Wyoming Department of Fire Prevention and Electrical Safety (DFPES). Names and marks are used only to describe the data source. Records are
provided as published by the source and may be out of date or incomplete. For anything
consequential (hiring, a permit, a legal decision), confirm the record with the issuing
agency. You are responsible for making sure your use complies with applicable law and the
source's terms.

### Need help?

Open an issue on this actor's **Issues** tab and we'll respond there. Bug reports, missing
fields and feature requests are all welcome. Guides and examples: [scrapebench.dev](https://scrapebench.dev).

If you are a person named in this data and want your record removed from our copy, email
apify-help@scrapebench.dev; the source agency remains the official record.

Your run may be used to improve our services. If something looks off, or you want this actor to fit your use better, please share your run data with us: [Apify Console → Settings → Security → Share run data with developers](https://console.apify.com/settings/security). It lets us see exactly what went wrong and keep improving the actor.

# Actor input Schema

## `mode` (type: `string`):

export: no names, just filters; returns the whole matching list. lookup / verify: put company names (matched if contained in the company name) or licence numbers (exact) in 'queries'. auto picks the mode for you.

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

A business name (or listing number) to look up live. Kept alongside 'queries' for saved tasks.

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

A business name (or listing number) to look up live. Several values in one run; combined with 'query'.

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

Only listings in this city. Kept alongside 'cities' for saved tasks.

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

Only listings in this city. Several values in one run; combined with 'city'.

## `expiry_status` (type: `string`):

Only listings in this expiry_status. Kept alongside 'expiry_statuses' for saved tasks.

## `expiry_statuses` (type: `array`):

Only listings in this expiry_status. Several values in one run; combined with 'expiry_status'.

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

Only rows from this licence type (one or more). Available: Chemical Suppression, Chemical Suppression, Extinguisher, Sprinkler, Electrical Contractor, LM-E Contractor, LM-H Contractor, LM-L Contractor, LM-S Contractor, LM-W Contractor, LV-A Contractor, LV-C Contractor, LV-G Contractor, LV-LS Contractor, LV-S Contractor, LV-T Contractor, LV-X Contractor, Unspecified.

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

Per query in lookup mode; per run in export mode.

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

Used for every request to the source; off by default.

## Actor input object example

```json
{
  "mode": "auto",
  "queries": [],
  "cities": [],
  "expiry_statuses": [],
  "categories": [],
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per business listing; notices are free.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/wyoming-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 = {}

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

```

## MCP server setup

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