# Maine Professional License Lookup & Leads Scraper (PFR) (`scrapebench/maine-professional-license-lookup`) Actor

Maine professional licences from ALMS Online: electricians, plumbers, fuel technicians, nurses, cosmetologists, counselors, insurance producers and more. Name, licence number, type, status, phone, address, expiry. Export or look up.

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

## Pricing

$0.004 / professional 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

## Maine Professional License Lookup & Leads Scraper (PFR)

### Pain points

- ALMS Online searches one regulator at a time, and a search left on 'ALL' professions can under-report: the Electricians regulator searched without a profession returned 7,953 active licences on 2026-11-03; searched profession by profession the next day, it held 13,947.
- Each search has to be rebuilt by hand (regulator, then profession, then the active-only box) before its CSV export can be downloaded.
- ALMS Online often answers with an error page for hours at a time (2026-11-03 and 2026-11-04), so a list pulled on demand can fail just when you need it.

### What we solve

- Every licence type ALMS Online lists, one search per profession, in one dataset you can filter by board, licence type, state and city.
- One clean table: holder name, licence number as printed, board, licence type, status, phone, street or mailing address, city, state, ZIP, county and expiry date, plus every other column ALMS publishes for the board: a firm's other trading names and responsible individual, physicians' practice address, NPI and medical school, insurance producers' NPN and email.
- Looks up names or licence numbers live on ALMS Online across every board and every status (people and businesses are separate indexes; both are searched), and answers from the stored copy when ALMS is down.

### Summary

Maine professional and occupational licences from ALMS Online, the State of Maine's shared licensing search: the boards of the Office of Professional and Occupational Regulation (Electricians, Plumbers, Oil & Solid Fuel, Barbering & Cosmetology, Counseling, Massage, Accountancy, Architects and more), the Bureau of Insurance, Nursing, Medicine, the Fire Marshal's Office and the other regulators on the system. Each row has the holder's name, licence number, board, licence type, status, phone where published, a street address for firms and a mailing city, state and ZIP for people, county and expiry date. On November 4, 2026 ALMS listed 336,528 active licences in 295 licence types on 71 boards; 65% carry a phone, street or email and 48% a phone. Richest are the trades and insurance: 13,949 electricians (94% with a phone), 11,799 fuel licences (97%), 4,953 plumbers (95%), and 49,629 insurance licences with a phone on nearly all and an email on 95%. Exports cover active licences; lookups cover every status. Pay only per licence returned.

### Who it's for

- Electrical, plumbing and HVAC suppliers, distributors and lenders reaching Maine's licensed tradespeople
- B2B marketers calling licensed Maine professionals: cosmetologists, massage therapists, counselors, accountants, architects
- Healthcare and insurance recruiters sourcing nurses, therapists and insurance producers licensed in Maine
- Compliance and credentialing teams checking a licence number, its status and its expiry

### 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
{
  "boards": [
    "Electricians"
  ],
  "categories": [
    "Master Electrician"
  ],
  "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": [
    "MS60017039",
    "FSC1287"
  ],
  "maxResults": 20
}
```

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

### What you get

One row per record:

| Field | Description |
|---|---|
| `name` | Licence holder: a person's full name, or the business name for a firm |
| `listing_id` | Licence number exactly as ALMS prints it (e.g. MS60017039) |
| `category` | Licence type, e.g. Master Electrician, Registered Nurse, Cosmetologist |
| `phone` | Phone as ALMS prints it, where published; phone_e164 holds it normalised |
| `email` | Email, where the regulator publishes one (mostly Insurance) |
| `street` | A firm's business street address; for people, a mailing street where the board publishes one |
| `city` | City (a firm's business city, a person's mailing city) |
| `region` | State (two letters) |
| `postal_code` | ZIP code |
| `extras.board` | The regulator, e.g. Electricians, Fuel, Nursing, Insurance |
| `extras.status` | Licence status: Active in exports; lookups also return Expired, Failed To Renew, Inactive and others |
| `extras.expires` | Expiration date, as ALMS prints it (MM/DD/YYYY) |
| `extras.county` | County of the address used |
| `extras.other_names` | Other names one licence trades under (a firm listed once per name) |
| `extras.address_type` | Which address fills street/city/state: business (firms), practice (physicians) or mailing |
| `extras.mailing_address` | The mailing address too, where a business or practice address was used above |
| `extras.npi` | National Provider Identifier, for physicians (Medicine board) |
| `extras.npn` | National Producer Number, for insurance producers |
| `extras.profession` | ALMS's own profession name, where it is narrower than the licence type |
| `source_url` | ALMS Online's search page, tagged with the licence number and type (no public per-licence page exists) |

Sample:

```json
{
  "listing_id": "FSC1287",
  "name": "ALLIED FIRE PROTECTION, INC",
  "phone": "+1 (401) 828-2600",
  "phone_e164": "+14018282600",
  "street": "108 POND ST",
  "city": "WEST WARWICK",
  "region": "RI",
  "postal_code": "02893-5840",
  "country": "US",
  "category": "Fire Sprinkler Contractor",
  "categories": [
    "Fire Sprinkler Contractor"
  ],
  "source": "live",
  "source_url": "https://www.pfr.maine.gov/ALMSOnline/ALMSQuery/SearchIndividual.aspx#FSC1287-fire-sprinkler-contractor",
  "extras": {
    "board": "FMO Fire Sprinklers",
    "status": "Active",
    "expires": "06/30/2027",
    "county": "KENT",
    "authorities": "CPVC",
    "agency": "FIRE MARSHAL'S OFFICE"
  }
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `mode` | no | string | `"auto"` | export: no names, just filters; returns the whole matching list. lookup / verify: put licensee names (matched if contained in the licensee name) or licence numbers (exact) in 'queries'. auto picks the mode for you. |
| `query` | no | string | — | A licensee's name (or listing number) to look up live. Kept alongside 'queries' for saved tasks. |
| `queries` | no | array | `[]` | A licensee's name (or listing number) to look up live. Several values in one run; combined with 'query'. |
| `board` | no | string | — | Only listings in this board. Kept alongside 'boards' for saved tasks. |
| `boards` | no | array | `[]` | Only listings in this board. Several values in one run; combined with 'board'. |
| `state` | no | string | — | Only listings in this state. Kept alongside 'states' for saved tasks. |
| `states` | no | array | `[]` | Only listings in this state. Several values in one run; combined with 'state'. |
| `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'. |
| `categories` | no | array | `[]` | Only rows from this licence type (one or more). Available: APRN-CNM, APRN-CNP, APRN-CNS, APRN-CRNA, Accountancy Branch, Accountancy Firm, Acupuncturist, Adjuster Non-Resident, Adjuster Resident, Administration of Drugs and Vaccines, Administrator in Training, Adult Day Services Facilities, Adult Use Individual Identification Card Holder, Advisory Organizations, Aesthetician, Alcohol and Drug Counseling Aide, All, Appraiser, Appraiser Trainee, Apprentice, Architect, Assisted Living Facilities, Athletic Trainer, Atm Location, Auctioneer, … (305 in all; an unknown name returns the full list, free). |
| `maxResults` | no | integer | `500` | Per query in lookup mode; per run in export mode. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Used only for live lookups; exports read the stored snapshot. |

### Pricing (Pay Per Event)

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

Notices (unknown licence type, no match, source unavailable) are free. Apify platform usage is billed separately per your plan.

### Use cases

- Trade outreach: every active Maine master electrician with a phone, or every oil and propane technician.
- Salon and spa sales: active cosmetologists, nail technologists and aestheticians, with phone numbers.
- Recruiting: active counselors, social workers or physical therapists by city.
- Credential checks: confirm a licence number's status and expiry, any status, live.

### Why this actor

- Every board on ALMS Online in one run, searched one profession at a time so nothing is lost to a short 'ALL' search.
- Filters ALMS lacks: board, licence type, state and city, each taking a list.
- Keeps working when ALMS Online is down: exports come from a stored copy, lookups fall back to it.
- Pay per licence; notices are free.

### Limitations & updates

Covers the licences on ALMS Online, the State of Maine's shared licensing search. Exports return active licences only, from a stored copy (its date is in the run log); lookups are live and return every status. People are published with a mailing city, state and ZIP, firms with a business street; phone fills 48% of active licences (94% for electricians, 97% for the fuel trades), email 14% (mostly insurance). Some regulators publish elsewhere and are thin here (engineers, most dentists). Insurance non-resident producers are not in exports yet (ALMS refuses that search as too large); look them up by name or licence number instead. One run returns at most 100,000 rows; split larger exports by board.

### FAQ

**Where does the data come from?**

ALMS Online (www.pfr.maine.gov/ALMSOnline), the State of Maine's public licensing search. Exports come from a stored copy made by searching every licence type with 'active licenses only' ticked and downloading ALMS's own CSV export; the run log gives the copy's date. Lookups search ALMS live.

**Is there a phone or email?**

Phone where the board publishes one: on 2026-11-04, 48% of active licences overall, but 94% of electricians, 95% of plumbers, 97% of fuel licences and 100% of barbering and cosmetology licences. Email on 14% overall, almost all of them insurance licences (95% of those). Nursing, the CNA registry and the CRMA/PSS credentials publish no phone.

**Which boards are covered?**

Every regulator on ALMS Online: the Office of Professional and Occupational Regulation's boards (Electricians, Plumbers, Fuel, Barbering & Cosmetology, Counseling, Massage, Accountancy, Real Estate and more), the Bureau of Insurance, Nursing, Medicine, Dental Practice, the Fire Marshal's sprinkler and fireworks licences, cannabis, CDC facility licensing and others. Put boards in Board and exact types in Licence type; leave both empty for everything.

**Does it include contractors?**

Maine has no general contractor licence. It licenses the trades: master, journeyman and limited electricians, master and journeyman plumbers, oil, solid-fuel and propane technicians, plus fire-sprinkler contractors and heating-oil dealers: 22,136 active licences on 2026-11-04 leaving out helpers, apprentices and trainees, 97% with a phone. Set Board to Electricians, Plumbers or Fuel.

**Are expired licences included?**

Exports return active licences only. A lookup searches every status (Active, Expired, Failed To Renew, Inactive and others) live.

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

Put names or licence numbers in queries and set mode to lookup. A person's name is searched as last name plus first name ('Carl Abbott' or 'Abbott, Carl'); a firm's name is matched if contained. Names are searched on both ALMS indexes, people and businesses. A business-name search across every board takes ALMS about 100 seconds; setting one Board makes it fast.

**How current is it?**

Exports come from a stored copy of ALMS Online, refreshed when it is over 30 days old and the actor is in use; the run log states its date, and a copy older than 45 days adds a free notice saying so. Lookups are live, and fall back to the stored copy (with a free notice) when ALMS is down.

**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 Maine Professional License Lookup & Leads Scraper (PFR)](https://scrapebench.dev/guides/how-to-maine-professional-license-lookup/)
- **Use case:** [Maine Master Electricians (ALMS)](https://scrapebench.dev/use-cases/maine-master-electricians/)

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/maine-professional-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 active Maine master electricians licensed on ALMS Online, with their phone numbers."

That is Board Electricians and Licence type Master Electrician (4,747 active 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 State of Maine's ALMS Online licensing search, run for the Department of Professional and Financial Regulation (PFR) and the other Maine regulators on the system 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 State of Maine's ALMS Online licensing search, run for the Department of Professional and Financial Regulation (PFR) and the other Maine regulators on the system. 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 licensee names (matched if contained in the licensee name) or licence numbers (exact) in 'queries'. auto picks the mode for you.

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

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

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

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

## `board` (type: `string`):

Only listings in this board. Kept alongside 'boards' for saved tasks.

## `boards` (type: `array`):

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

## `state` (type: `string`):

Only listings in this state. Kept alongside 'states' for saved tasks.

## `states` (type: `array`):

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

## `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'.

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

Only rows from this licence type (one or more). Available: APRN-CNM, APRN-CNP, APRN-CNS, APRN-CRNA, Accountancy Branch, Accountancy Firm, Acupuncturist, Adjuster Non-Resident, Adjuster Resident, Administration of Drugs and Vaccines, Administrator in Training, Adult Day Services Facilities, Adult Use Individual Identification Card Holder, Advisory Organizations, Aesthetician, Alcohol and Drug Counseling Aide, All, Appraiser, Appraiser Trainee, Apprentice, Architect, Assisted Living Facilities, Athletic Trainer, Atm Location, Auctioneer, … (305 in all; an unknown name returns the full list, free).

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

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

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

Used only for live lookups; exports read the stored snapshot.

## Actor input object example

```json
{
  "mode": "auto",
  "queries": [],
  "boards": [],
  "states": [],
  "cities": [],
  "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/maine-professional-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/maine-professional-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/maine-professional-license-lookup --silent --output-dataset

```

## MCP server setup

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