# Michigan Contractor License Lookup & Verify (LARA) (`muhammadafzal/michigan-contractor-license-lookup`) Actor

Verify Michigan contractor and builder licenses using the public Michigan LARA lookup. Search by license number, business, or licensee name.

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

## Pricing

from $8.00 / 1,000 michigan 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

## Michigan Contractor License Lookup & Verify (LARA)

Search Michigan Department of Licensing and Regulatory Affairs (LARA) public contractor records by license number, business name, or licensee name. The Actor returns the license type, source status, issue and expiration dates, and the official detail page for independent review.

This is an informational lookup. It does not issue a LARA-certified verification or replace checking the linked state record before hiring or making a licensing decision.

### License categories

The Actor supports the contractor and builder categories exposed by LARA's public Accela lookup, including residential builders and maintenance-and-alteration contractors, electrical, fire-alarm and sign contractors, elevator contractors, mechanical contractors, plumbing contractors, and manufactured-home installer/servicers. Select the same license type the contractor provided. Apprentice and unrelated professional categories are excluded.

### Search input

For an exact license number:

```json
{
  "searchMode": "LICENSE_NUMBER",
  "licenseNumber": "2101209706",
  "licenseType": "Residential Builder Individual",
  "maxResults": 1
}
```

For a business name:

```json
{
  "searchMode": "BUSINESS_NAME",
  "businessName": "Northstar Builders",
  "licenseType": "Residential Builder Company",
  "maxResults": 10
}
```

For a person:

```json
{
  "searchMode": "PERSON_NAME",
  "firstName": "Jordan",
  "lastName": "Example",
  "licenseType": "Mechanical Contractor",
  "maxResults": 10
}
```

The `2101209706` example is a public residential-builder license number shown in LARA's current detail lookup. Use a license number and type supplied by the contractor for real verification. Name searches read the current LARA result page, up to 10 records. When LARA reports more matches than the Actor returns, `OUTPUT.hasMoreSourceResults` is true; narrow the name or select the exact license number to inspect a particular record.

The dataset intentionally omits street addresses, phone numbers, email addresses, and other contact fields. The `OUTPUT` key-value record reports `DATA`, `EMPTY`, `BLOCKED`, `REJECTED`, or `FAILED`, result counts, any first-page truncation, and event counts. It does not repeat the submitted name or license number.

Verified Apify free-plan users receive at most **5 license records per run**. Paid and agentic runs can use the requested limit of up to 10 records. Missing plan data in local runs is treated as unknown, not as a free plan.

### Output fields

| Field | Meaning |
| --- | --- |
| `licenseeName` | Person or organization shown on the LARA detail page |
| `businessName` | Business name when present on the LARA detail page |
| `licenseNumber` | State license number |
| `licenseType` | LARA credential category |
| `licenseStatus` | Raw status shown by LARA |
| `isActive` | Conservative interpretation of recognized active/inactive status labels; `null` for blank or unrecognized values |
| `issueDate`, `expirationDate` | Source dates normalized to `YYYY-MM-DD` when parseable |
| `sourceUrl` | Direct public LARA license detail page |
| `sourceSearchUrl` | Public LARA licensee search page |
| `scrapedAt` | Retrieval time in UTC |

### Pay-per-event pricing

The Actor uses **pay-per-event** pricing. LARA records are written before the platform's automatic `apify-default-dataset-item` event is charged. The Actor does not manually charge the start or dataset-item events. Platform usage is included in event pricing; the separate PPE-plus-platform-usage pass-through is disabled.

| Event | FREE | BRONZE | SILVER | GOLD | Charge unit |
| --- | ---: | ---: | ---: | ---: | --- |
| Actor start | $0.00500 | $0.00500 | $0.00500 | $0.00500 | One automatic start event at 256 MB |
| LARA license record | $0.01000 | $0.00975 | $0.00950 | $0.00800 | One unique license record written |

The record discounts are 0%, 2.5%, 5%, and 20% from the FREE price. With the minimum one start event at the default 256 MB memory, the event total for 1 record is $0.01500 (FREE), $0.01475 (BRONZE), $0.01450 (SILVER), or $0.01300 (GOLD). For 10 records, the corresponding totals are $0.10500, $0.10250, $0.10000, and $0.08500. These are event totals; the live Store configuration is authoritative for current prices.

The minimum `maxTotalChargeUsd` is $0.015. This cap applies to event charges. The Actor also limits the number of source results and requests independently.

### Source and limits

- [LARA public licensee lookup](https://aca-prod.accela.com/LARA/GeneralProperty/PropertyLookUp.aspx?isLicensee=Y\&TabName=Home)
- [LARA Find / Verify a Licensed Professional or Business](https://www.michigan.gov/lara/i-need-to/find-or-verify-a-licensed-professional-or-business)
- [LARA Bureau of Construction Codes](https://www.michigan.gov/lara/bureau-list/bcc)
- [LARA certified license verification](https://www.michigan.gov/lara/bureau-list/bpl/cert-lic)

LARA states that its public licensing and registration information is updated once a day and may not be accurate, current, or complete. The Actor does not bypass login, CAPTCHA, or other access controls. LARA's certified verification is a separate state service and may require a fee; this Actor only reports the public lookup result. Confirm consequential decisions directly with LARA and follow the source terms and applicable law.

This Actor is independent of the State of Michigan and LARA.

# Actor input Schema

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

Choose one search method. Use LICENSE\_NUMBER for an exact LARA license number, BUSINESS\_NAME for a partial business name, or PERSON\_NAME with a last name and optional first name.

## `licenseNumber` (type: `string`):

Use this for an exact public Michigan license number, such as `2101209706`. Required when Search by is Exact license number. Select the matching License type below; do not enter a contractor business registration or permit number.

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

Use this for a business-name search in LARA's public licensee lookup, for example `Northstar Builders`. Required when Search by is Business name. This is a name search, not a city, address, permit, or service-area search.

## `firstName` (type: `string`):

Optional first-name filter for a person search, such as `Jordan`. Use together with Last name when Search by is Person name.

## `lastName` (type: `string`):

Use this for a person-name search, such as `Zago`. Required when Search by is Person name. The Actor returns license records from the selected LARA license type.

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

Select the exact license category used by the LARA public lookup. The category must match the credential being searched; for example, an individual Residential Builder license differs from a Residential Builder Company license.

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

Set the maximum number of unique license records to return, from 1 to 10. Default 10. Verified free-plan runs are capped at 5 delivered records even when a higher value is requested; paid and agentic runs use the requested limit. Name searches read only the current LARA result page and report when more matches exist.

## Actor input object example

```json
{
  "searchMode": "LICENSE_NUMBER",
  "licenseNumber": "2101209706",
  "licenseType": "Residential Builder Individual",
  "maxResults": 10
}
```

# Actor output Schema

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

Schema-validated Michigan LARA contractor license records.

## `dataset` (type: `string`):

Default dataset containing license records.

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

Outcome, query mode, delivered count, source matches, plan cap, event counts, and warnings.

# 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 = {
    "searchMode": "LICENSE_NUMBER",
    "licenseNumber": "2101209706",
    "licenseType": "Residential Builder Individual",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/michigan-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 = {
    "searchMode": "LICENSE_NUMBER",
    "licenseNumber": "2101209706",
    "licenseType": "Residential Builder Individual",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/michigan-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 '{
  "searchMode": "LICENSE_NUMBER",
  "licenseNumber": "2101209706",
  "licenseType": "Residential Builder Individual",
  "maxResults": 10
}' |
apify call muhammadafzal/michigan-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

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