# Mississippi Contractor License Lookup & Leads Scraper (MSBOC) (`scrapebench/mississippi-contractor-license-lookup`) Actor

Export every Mississippi State Board of Contractors licence — statewide or by county, classification, city or ZIP — with phone, street address, classifications, expiry date and officers.

- **URL**: https://apify.com/scrapebench/mississippi-contractor-license-lookup.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 3 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

## Mississippi Contractor License Lookup & Leads Scraper (MSBOC)

### Pain points

- MSBOC publishes no download file: its public search pages through results 25 at a time by default, and the active roster alone is 13,186 licences (2026-10-07).
- Classifications, expiry and first-issue dates and officers are not in the search results at all — each sits on a separate detail page, one licence at a time.
- A search that matches exactly one licence jumps straight to that licence's page instead of a list, and the licence number alone is not unique (a residential and a commercial licence can share digits), so naive copying double-counts or drops rows.

### What we solve

- Run once with no filters and get the whole active roster, or narrow it with MSBOC's own status, licence type, classification, county, city, ZIP and name filters, all sent to MSBOC itself.
- Each licence's detail page is fetched for you to add classifications, qualifying names, officers, first-issue and expiry dates, fax, minority flag and county.
- Rows are keyed on licence type plus licence number, the page's own total is checked on every page, and a licence matched by two of your searches is returned and billed once.

### Summary

Pull the Mississippi State Board of Contractors roster as a spreadsheet-ready dataset. Leave every filter empty for every active licence in the state, commercial and residential, or narrow it by status (active, expired, inactive, revoked, suspended, unlicensed), licence type, classification (Electrical Work, Residential Builder, Roofing and the rest of MSBOC's 133 classes), county, city, ZIP or business name. Each row carries the business name, licence number and type, street address, city, state, ZIP and phone, and — with details on — the licence's classifications, qualifying names, officers, first-issue and expiry dates, fax, minority flag and Mississippi county, plus a link to the licence's own MSBOC page. Pay only per licence returned.

### Who it's for

- Sales teams selling materials, equipment, insurance or software to contractors across Mississippi
- Bonding and insurance agents who need every licensed contractor with an expiry date
- General contractors and owners checking a sub's MSBOC classifications before awarding work
- Compliance and data teams keeping a CRM in sync with the state licence roster

### 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": "Hinds",
  "classification": "E"
}
```

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

### What you get

One row per record:

| Field | Description |
|---|---|
| `business_name` | Company name as licensed by MSBOC |
| `license_number` | MSBOC licence number (commercial numbers carry a suffix such as -MC or -SC) |
| `license_type` | Commercial or Residential |
| `status` | The status searched, e.g. 'Licensed - Active' |
| `classifications` | Classes the licence holds, e.g. ELECTRICAL WORK, RESIDENTIAL BUILDER (details on) |
| `qualifying_names` | Qualifying person(s) for those classes (details on) |
| `officers` | Officers as 'NAME (TITLE)' (details on) |
| `issue_date` | First issue date, MM/DD/YYYY (details on) |
| `expiration_date` | Expiry date, MM/DD/YYYY (details on) |
| `phone` | Phone number on file, as MSBOC prints it |
| `address` | Street address or PO box on file |
| `city` | City of the address |
| `address_state` | State of the address — MS, or another state for out-of-state firms |
| `zip_code` | ZIP code of the address |
| `county` | Mississippi county of the address (details on), or the county searched; null for out-of-state firms on a statewide run |
| `fax` | Fax number, when MSBOC lists one (details on) |
| `minority` | MSBOC's minority flag, Yes or No (details on) |
| `details_status` | ok, failed or skipped_time_budget for the detail fields; null when details are off |
| `source_url` | The licence's own page on search.msboc.us |

Sample:

```json
{
  "business_name": "LEFLORE CONSTRUCTION LLC",
  "license_number": "19113-MC",
  "license_type": "Commercial",
  "status": "Licensed - Active",
  "classifications": [
    "BUILDING CONSTRUCTION",
    "ELECTRICAL WORK",
    "HIGHWAY, STREET AND BRIDGE CONSTRUCTION",
    "MECHANICAL WORK"
  ],
  "qualifying_names": [
    "MARCO LEFLORE"
  ],
  "officers": [
    "KERRY LEFLORE (PRESIDENT)",
    "MARCO LEFLORE (VICE-PRESIDENT)"
  ],
  "issue_date": "09/07/2011",
  "expiration_date": "09/29/2027",
  "phone": "601-214-0125",
  "address": "4670 MCWILLIE DRIVE",
  "city": "JACKSON",
  "address_state": "MS",
  "zip_code": "39206",
  "county": "Hinds",
  "state": "MS",
  "minority": "Yes",
  "details_status": "ok",
  "source_url": "https://search.msboc.us/Detail.cfm?ContractorID=22467&ContractorType=Commercial&varDataSource=BOC"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `status` | no | string | `"active"` | Which licences to export. 'Active' is every currently licensed contractor (13,186 on 2026-10-07). 'Expired' is the lapsed list (24,033), useful for win-back or compliance checks. |
| `licenseType` | no | string | `"any"` | Commercial (Board of Contractors commercial licences) or Residential (residential builders, remodelers and trades). 'Any' returns both. |
| `classification` | no | string | — | An MSBOC classification by code or name, e.g. 'E' (Electrical Work), 'S123' (Residential Roofing), 'Building Construction', 'Residential Builder'. An exact class name picks that class; otherwise every class with a word starting with what you typed is searched ('roof' finds both Residential ROOFING and Commercial ROOFING,SHEETMETAL AND SIDING). Leave empty for every classification. A value that matches no class is dropped (logged), never searched as 'all'. |
| `classifications` | no | array | `[]` | Several classifications in ONE run. Combined with 'Classification' if you fill both. A licence returned by two searches is returned (and billed) once. |
| `county` | no | string | — | Mississippi county, e.g. 'Hinds', 'DeSoto County', 'harrison'. MSBOC assigns the county from the ZIP of the licensee's address, so out-of-state firms are not under any county. Leave empty for the whole state. |
| `counties` | no | array | `[]` | Several counties in ONE run, e.g. Hinds, Madison and Rankin. Combined with 'County' if you fill both. |
| `city` | no | string | — | City of the licensee's address. MSBOC matches the start of the city name ('JACK' matches JACKSON). |
| `cities` | no | array | `[]` | Several cities in ONE run. |
| `zipCode` | no | string | — | A 5-digit ZIP code of the licensee's address. |
| `zipCodes` | no | array | `[]` | Several 5-digit ZIP codes in ONE run. Anything that is not 5 digits is dropped (logged). |
| `businessName` | no | string | — | Part of the company name, e.g. 'ELECTRIC' or 'Smith'. MSBOC matches it anywhere in the name. |
| `businessNames` | no | array | `[]` | Several company-name searches in ONE run. |
| `includeDetails` | no | boolean | `true` | Fetch each licence's MSBOC detail page to add its classifications, qualifying names, officers, first-issue and expiry dates, fax, minority flag and (for Mississippi addresses) county. Turn off for a faster export of name, licence number, address and phone only. Same price either way. |
| `maxResults` | no | integer | `500` | Cap on licences returned PER search (each county x classification x city x ZIP x name combination), so adding a county never truncates the ones after it. The whole active roster is about 13,200; set 100000 to take everything a search matches. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. MSBOC answers direct requests; enable a proxy only if runs come back with a 'blocked' notice. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **13186 every active Mississippi contractor licence** at *$0.004/result* ≈ **$52.74**.

The default run (no filters, 500 licences) costs $2.00. Apify platform usage is billed separately.

### Use cases

- Statewide prospect list — export all active licences once, with phone and street address, and load them into your CRM.
- Trade territory — pull every Electrical Work or Residential Builder licence in Hinds, Madison and Rankin counties in one run.
- Renewal and win-back outreach — sort by expiry date, or run the expired list (24,033 licences on 2026-10-07) for lapsed contractors.
- Verification — confirm a contractor's classes, qualifying names, officers and expiry straight from the licence's MSBOC page.

### Why this actor

- Phone on 13,148 of the 13,186 active licences and a street address, city and ZIP on all of them (measured 2026-10-07).
- The whole active roster in one run with maxResults 100000: 13,186 licences in about 7 minutes, with classifications and expiry date on all 13,186 and officers on 10,870 (measured 2026-10-07).
- Every filter is MSBOC's own, sent to MSBOC — nothing is filtered after the fact, and an unrecognised value is dropped and logged instead of quietly widening your search.
- Each row links to the licence's own MSBOC page, so any record can be checked at the source.
- Pay per licence returned; a licence found by two of your searches is billed once.

### Limitations & updates

Covers licences on the Mississippi State Board of Contractors' public search; one status per run. No email is published. Detail fields (classifications, dates, officers, fax, minority, county) come from a separate page per licence and are best-effort: a row whose page could not be read is still returned and says so in details_status. County is MSBOC's ZIP-based county, empty for out-of-state addresses. Phone numbers are passed through in MSBOC's own formats. If MSBOC does not answer, the run returns a free row saying so instead of an empty dataset.

### FAQ

**Where does the data come from?**

From the Mississippi State Board of Contractors' public search at search.msboc.us — the results list and each licence's detail page.

**How many licences are there?**

Counted on MSBOC's search 2026-10-07: 13,186 active (8,043 commercial, 5,143 residential), 24,033 expired, 541 inactive, 1,096 unlicensed, 65 revoked and 24 suspended. 7,397 of the active licensees have a Mississippi address.

**Does it return email addresses?**

No. MSBOC does not publish email on its search or detail pages, so no row carries one. You get phone, street address, and with details on, fax, officers and qualifying names.

**What does 'Include classifications, dates and officers' do?**

It fetches each licence's MSBOC detail page, which is the only place classifications, first-issue and expiry dates, officers, fax, the minority flag and the county appear. It is on by default and the price is the same either way; turn it off for a faster export of name, licence, address and phone. If a detail page cannot be read, the row is still returned with details_status 'failed'.

**Why is county empty on some rows?**

MSBOC assigns a county from the ZIP of a Mississippi address, so out-of-state firms have none. When you search by county, every row carries the county you searched.

**How do I name a classification?**

By MSBOC code ('E', 'S123', 'B') or by name ('Electrical Work', 'Residential Builder'). An exact name picks that class; otherwise every class with a word starting with what you typed is searched ('roof' finds both roofing classes). The code 'B' is Building Construction on commercial licences and Residential Builder on residential ones, so it searches both unless you set the licence type.

**How am I charged?**

One event per licence returned ($0.004). A row explaining a source problem or an unusable input is free. maxResults caps each search, so the default run of 500 licences costs $2.00 and the whole active roster costs about $52.74.

### Which actor to choose

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

- **Virginia Contractor License Lookup (DPOR Bulk)** — You need the same bulk statewide licence export for Virginia, with email.
- **Arkansas Contractor License Lookup & Verify (ACLB)** — You need Arkansas contractor licences.
- **Tennessee Contractor License Lookup & Verify (TN DOCI)** — You need Tennessee contractor licences.
- **Iowa Contractor Registration Lookup & Leads Scraper (DIAL)** — You need Iowa contractors — every active DIAL registration statewide, with phone and email, filtered by trade, county, city or ZIP.
- **Ohio Contractor License Lookup & Leads Scraper (OCILB)** — You need Ohio electrical, HVAC, plumbing, hydronics or refrigeration contractors — the full OCILB roster, by trade and county.
- **Nebraska Contractor Registration Lookup & Leads Scraper (NDOL)** — You need Nebraska contractors — every current NDOL registration, by service and county, with phone on request.
- **Delaware Contractor License Lookup & List Scraper (DOR + DPR)** — You need Delaware contractors — DOR business licences plus DPR electrical, plumbing and HVACR licences, by city or ZIP.
- **DC Contractor License Lookup & List Scraper (DLCP)** — You need contractors licensed in Washington, DC — every active DLCP general contractor, home improvement and asbestos licence, by address state, ZIP or ward.
- **Arizona Contractor License Lookup & Leads Scraper (ROC)** — You need Arizona contractors — one ROC licence by number or name, or every active licence statewide with phone, by class and city.
- **West Virginia Contractor License Lookup & Leads Scraper (WVCLB)** — You need West Virginia contractors — every current WVCLB licence with phone and mailing address, by county or classification.
- **Colorado Electrical & Plumbing License Lookup & List Scraper** — You need Colorado electrical or plumbing licences — contractors, masters and journeymen statewide, with status and public disciplinary actions.
- **Maryland Contractor License Lookup & List Scraper (MHIC)** — You need Maryland home improvement contractors — every active MHIC licence with street address and expiry, by city or ZIP.
- **New Jersey Contractor License Lookup & Export (DCA)** — You need New Jersey contractors — active DCA home improvement, electrical, master plumber and HVACR licences statewide or by city, with street address and owner for home improvement firms.

### 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 Mississippi Contractor License Lookup & Leads Scraper (MSBOC)](https://scrapebench.dev/guides/how-to-mississippi-contractor-license-lookup/)
- **Use case:** [List Electrical Contractors in Hinds County, Mississippi](https://scrapebench.dev/use-cases/hinds-county-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/mississippi-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 actively licensed commercial electrical contractors in Hinds County, Mississippi, with their phone numbers and licence expiry dates."

Hinds County with classification 'E' returned 29 active licences on 2026-10-07; each row links to the licence's own MSBOC page. Runs started this way bill exactly like any other run.

# Changelog

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

# Actor input Schema

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

Which licences to export. 'Active' is every currently licensed contractor (13,186 on 2026-10-07). 'Expired' is the lapsed list (24,033), useful for win-back or compliance checks.

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

Commercial (Board of Contractors commercial licences) or Residential (residential builders, remodelers and trades). 'Any' returns both.

## `classification` (type: `string`):

An MSBOC classification by code or name, e.g. 'E' (Electrical Work), 'S123' (Residential Roofing), 'Building Construction', 'Residential Builder'. An exact class name picks that class; otherwise every class with a word starting with what you typed is searched ('roof' finds both Residential ROOFING and Commercial ROOFING,SHEETMETAL AND SIDING). Leave empty for every classification. A value that matches no class is dropped (logged), never searched as 'all'.

## `classifications` (type: `array`):

Several classifications in ONE run. Combined with 'Classification' if you fill both. A licence returned by two searches is returned (and billed) once.

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

Mississippi county, e.g. 'Hinds', 'DeSoto County', 'harrison'. MSBOC assigns the county from the ZIP of the licensee's address, so out-of-state firms are not under any county. Leave empty for the whole state.

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

Several counties in ONE run, e.g. Hinds, Madison and Rankin. Combined with 'County' if you fill both.

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

City of the licensee's address. MSBOC matches the start of the city name ('JACK' matches JACKSON).

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

Several cities in ONE run.

## `zipCode` (type: `string`):

A 5-digit ZIP code of the licensee's address.

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

Several 5-digit ZIP codes in ONE run. Anything that is not 5 digits is dropped (logged).

## `businessName` (type: `string`):

Part of the company name, e.g. 'ELECTRIC' or 'Smith'. MSBOC matches it anywhere in the name.

## `businessNames` (type: `array`):

Several company-name searches in ONE run.

## `includeDetails` (type: `boolean`):

Fetch each licence's MSBOC detail page to add its classifications, qualifying names, officers, first-issue and expiry dates, fax, minority flag and (for Mississippi addresses) county. Turn off for a faster export of name, licence number, address and phone only. Same price either way.

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

Cap on licences returned PER search (each county x classification x city x ZIP x name combination), so adding a county never truncates the ones after it. The whole active roster is about 13,200; set 100000 to take everything a search matches.

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

Optional. MSBOC answers direct requests; enable a proxy only if runs come back with a 'blocked' notice.

## Actor input object example

```json
{
  "status": "active",
  "licenseType": "any",
  "classifications": [],
  "counties": [],
  "cities": [],
  "zipCodes": [],
  "businessNames": [],
  "includeDetails": true,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Each row is one MSBOC licence: business name, licence number, type, status, address, phone, and (with details on) classifications, dates and officers.

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

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

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

```

## MCP server setup

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