# Louisiana Contractor License Lookup (LSLBC) (`muhammadafzal/louisiana-contractor-license-lookup`) Actor

Search the Louisiana State Licensing Board for Contractors public registry by license number, company, qualifying party, phone, or location. Return official status, expiration, published contact details, and source links.

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

## Pricing

from $4.80 / 1,000 louisiana contractor license records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Louisiana Contractor License Lookup (LSLBC)

Search the Louisiana State Licensing Board for Contractors (LSLBC) public registry by license number, company, qualifying party or contact name, phone, or business location. The Actor returns license status and expiration along with the contact details the Board publishes.

### Data returned

Each dataset item is one license or registration account opened from the official LSLBC search results.

| Field | What it contains |
| --- | --- |
| `licenseNumber`, `licenseType` | Board-issued license or registration number and account type |
| `licenseStatus`, `expirationDate` | Status and expiration as displayed on the detail page |
| `licenseHolderName`, `otherBusinessNames` | Name and AKA/DBA entries from the contact section |
| `address` | Public address split into street, city, state, and postal code where possible |
| `phoneNumber`, `emailAddress` | Public contact details when the Board displays them |
| `searchResultOwner`, `searchResultMarkedNotActive` | Owner text and inactive notice from the search row |
| `searchMode`, `searchQuery` | Lookup used to find the record |
| `sourceUrl`, `sourceSearchUrl`, `retrievedAt` | Official source links and UTC retrieval time |

Contact names can be businesses or people, depending on the Board record. Optional values are `null`; `otherBusinessNames` is an empty array when none are displayed. The address is parsed from the public contact block and may be incomplete if the source does not separate its parts.

### Search modes

Choose one `searchMode`:

| Mode | Search value | Notes |
| --- | --- | --- |
| `licenseNumber` | `searchQuery` | Enter digits or a prefixed number such as `CL.45183`; prefixes are removed before submitting to the Board's numeric field. |
| `companyName` | `searchQuery` | Search the company name as stored by LSLBC. The official portal can return multiple matches. |
| `qualifyingParty` | `searchQuery` | Enter `First Last`, `Last, First`, or one last name. `includeLikeSoundingNames` uses the portal's optional sound-alike setting. |
| `phoneNumber` | `searchQuery` | Search the phone value stored in the public account. Enter at least seven digits, with or without punctuation. |
| `location` | `city`, `postalCode`, `stateCode`, or `streetAddress` | Provide at least one field. For `streetAddress`, enter the full address exactly as listed by LSLBC; partial street text may return no matches. The source may list out-of-state mailing addresses for Louisiana licensees. |

`licenseType` can restrict any search to Commercial, Home Improvement, Mold Remediation, or Residential accounts. Leave it blank to search across the four types. Set `maxResults` from 1 to 20; it defaults to one detail record. On a verified Apify free-plan run, the Actor caps delivery at five records. If the portal returns 20 rows, it may have more matches beyond the response.

#### Examples

Verify one commercial license by its number:

```json
{
  "searchMode": "licenseNumber",
  "searchQuery": "CL.45183",
  "licenseType": "commercial",
  "maxResults": 1
}
```

Find a contractor by a partial company name:

```json
{
  "searchMode": "companyName",
  "searchQuery": "WIT CONTRACTING",
  "maxResults": 5
}
```

Find a license by city and ZIP code:

```json
{
  "searchMode": "location",
  "city": "Franklinton",
  "postalCode": "70438",
  "stateCode": "LA",
  "maxResults": 5
}
```

The same JSON object can be passed as the body to the Apify Actor Run API, or used as the input for an Apify Task. The default result dataset contains license records. The `OUTPUT` key-value record contains the run outcome, number of source rows, number of records delivered, limits applied, warnings, and source diagnostics.

#### Example result shape

The values below illustrate the schema; they are not a fallback record written by the Actor.

```json
{
  "licenseNumber": "CL.00001",
  "licenseType": "Commercial License Certificate",
  "licenseStatus": "Active",
  "expirationDate": "12/31/2027",
  "licenseHolderName": "Example Mechanical LLC",
  "otherBusinessNames": ["Example HVAC"],
  "searchResultOwner": "Example Mechanical LLC",
  "searchResultMarkedNotActive": false,
  "address": {
    "streetAddress": "100 Main Street",
    "streetAddress2": null,
    "city": "Baton Rouge",
    "state": "LA",
    "postalCode": "70801"
  },
  "phoneNumber": "(225) 555-0100",
  "emailAddress": "contact@example.com",
  "searchMode": "licenseNumber",
  "searchQuery": "00001",
  "sourceUrl": "https://arlspublic.lslbc.louisiana.gov/Public/_ShowAccountDetails/?key=...&Source=Search",
  "sourceSearchUrl": "https://arlspublic.lslbc.louisiana.gov/Public/Search",
  "retrievedAt": "2026-09-24T12:00:00.000Z"
}
```

### Pay per event

The synthetic `apify-actor-start` event is charged automatically per run. The synthetic `apify-default-dataset-item` event is charged automatically for each record written to the default dataset; the Actor does not manually charge these events. Platform usage pass-through is disabled, so platform usage is deducted from creator proceeds. Actual usage and margin must be assessed from settled cloud runs.

| Tier | Start event per run | License record | One-record total |
| --- | ---: | ---: | ---: |
| FREE | $0.005 | $0.006 | $0.011 |
| BRONZE | $0.005 | $0.00585 | $0.01085 |
| SILVER | $0.005 | $0.0057 | $0.0107 |
| GOLD | $0.005 | $0.0048 | $0.0098 |
| PLATINUM | $0.005 | $0.0048 | $0.0098 |
| DIAMOND | $0.005 | $0.0048 | $0.0098 |

For example, one delivered result totals $0.011 at the FREE tier and five results total $0.035. A valid no-match search has no result event and incurs only the automatic start event. Run limits use the highest configured tier price and respect `ACTOR_MAX_TOTAL_CHARGE_USD`. These are the configured event prices; platform cost and margin remain provisional until usage settles after cloud canaries.

### Source behavior and limitations

This Actor reads the LSLBC public search form, submits the same search fields a visitor uses, then opens each selected public account detail page. It uses ordinary public pages without an account, cookie import, or third-party data provider. It does not search the Louisiana Secretary of State business registry, local occupational licenses, permits, or national contractor databases. It does not infer construction classifications because the public detail page used here does not expose a classification list.

The LSLBC describes its online information as a courtesy and says it may not reflect recent updates; completeness and accuracy are not guaranteed. Use the official detail link and contact the Board or license holder when a decision depends on current licensure. Search results can omit matches when the source response is capped. A denied or rate-limited source request is reported as blocked, and a changed page is reported as a failure; the Actor does not invent records to fill gaps.

The directory may publish business contact information and names associated with accounts. Use returned details only for lawful licensing verification or related business purposes, and follow applicable privacy, marketing, and data-use rules. The Actor is an independent data-access tool and is not affiliated with or endorsed by LSLBC.

Official source: [LSLBC Contractor Search](https://lslbc.louisiana.gov/contractor-search/) and [Verify License Search](https://arlspublic.lslbc.louisiana.gov/Public/Search).

# Actor input Schema

## `searchMode` (type: `string`):

Choose the LSLBC public lookup field. Use licenseNumber for a direct license check, companyName for a contractor business, qualifyingParty for a person, phoneNumber for a published phone, or location for an address search.

## `searchQuery` (type: `string`):

Use this for licenseNumber, companyName, qualifyingParty, or phoneNumber mode. A license can be entered as digits (45183) or with a board prefix (CL.45183). For a person, enter First Last or Last, First; a single word searches the last name. This value is ignored in location mode.

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

Optionally restrict results to one LSLBC license or registration type. Leave blank to search all types.

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

Use with searchMode=location to find license records by the city stored in the LSLBC public directory. Combine with ZIP code or state for a narrower search.

## `postalCode` (type: `string`):

Use with searchMode=location to search the ZIP code stored in the public license record. Enter a five-digit ZIP code.

## `stateCode` (type: `string`):

Optional two-letter address state filter for searchMode=location. The official register may include out-of-state addresses for Louisiana license holders.

## `streetAddress` (type: `string`):

Optional exact street-address filter for searchMode=location. Enter the full street address exactly as it appears in the contractor's LSLBC record; partial street text may return no matches.

## `includeLikeSoundingNames` (type: `boolean`):

Enable the LSLBC portal's sound-alike name option for searchMode=qualifyingParty. Leave disabled for literal name searches.

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

Maximum matching license details to open. Defaults to 1 for a precise check. The Actor limit is 20; verified free-plan runs are capped at 5 records.

## Actor input object example

```json
{
  "searchMode": "licenseNumber",
  "searchQuery": "CL.45183",
  "licenseType": "",
  "city": "Franklinton",
  "postalCode": "70438",
  "stateCode": "LA",
  "streetAddress": "49280 Highway 1072",
  "includeLikeSoundingNames": false,
  "maxResults": 1
}
```

# Actor output Schema

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

JSON diagnostics stored in OUTPUT, including record counts, warnings, and the official source outcome.

# 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("muhammadafzal/louisiana-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("muhammadafzal/louisiana-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 muhammadafzal/louisiana-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

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