# Vermont Professional License Lookup & Leads Scraper (OPR) (`scrapebench/vermont-professional-license-lookup`) Actor

Every Vermont professional licence from the Office of Professional Regulation: 52 professions, from residential contractors and engineers to nurses and pharmacists. Name, licence number, status, mailing address, issue and expiry dates. Export or look up.

- **URL**: https://apify.com/scrapebench/vermont-professional-license-lookup.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Lead generation
- **Security:** Limited permissions
- **Stats:** 1 total users, 0 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

## Vermont Professional License Lookup & Leads Scraper (OPR)

### Pain points

- OPR's Profession Roster Download hands out one spreadsheet per licence type: 449 types across 52 professions (checked 2026-11-03). Each one means picking the profession, the type and the status boxes again, so a full list is hundreds of downloads.
- The Licensee Lookup shows 10 results a page and no address; the address is only in the roster spreadsheets.
- The spreadsheets mix every status unless you untick them: of 340,072 rows on 2026-11-03, 246,719 were Expired licences.

### What we solve

- Every non-empty roster in one dataset: 347 licence types across 52 professions, 340,072 licences on November 3, 2026 (90,253 Active or Active-InRenewal), filterable by profession, licence type, status and city.
- One clean table: holder name, licence number exactly as printed, profession, licence type, status, mailing street, city, state, ZIP, first issuance, effective and expiry dates, and where OPR records them the branch, employer and supervisor.
- Looks up names or licence numbers across the professions you pick (a number can appear under several licence types; each comes back as its own row).

### Summary

Vermont Office of Professional Regulation licences in one dataset: every roster OPR publishes in its Profession Roster Download, 347 licence types from 52 professions (Nursing, Pharmacy, Engineering, Real Estate, Residential Contractors, Allied Mental Health, Dental, Notaries Public and more). Each row has the holder's name, licence number, profession and licence type, status, mailing street address, city, state and ZIP, first issuance, effective and expiry dates, and where OPR records them the business branch, employer and supervisor. Street addresses fill about 94% of rows; OPR publishes no phone or email. On November 3, 2026 the rosters held 340,072 licences, 90,253 of them Active or Active-InRenewal; Residential Contractors held 1,653 active licences. Filter by status to get only live licences. Pay only per licence returned.

### Who it's for

- Suppliers, lenders and insurers reaching Vermont residential contractors
- B2B marketers mailing licensed Vermont professionals: engineers, architects, CPAs, dentists, pharmacists, real estate brokers
- Healthcare recruiters and staffing agencies sourcing nurses, therapists and counselors licensed in Vermont
- 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
{
  "categories": [
    "Residential Contractor - Business",
    "Residential Contractor - Individual"
  ],
  "statuses": [
    "Active",
    "Active-InRenewal"
  ],
  "maxResults": 500
}
```

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

```json
{
  "mode": "lookup",
  "queries": [
    "Twin Pines",
    "174.0000001"
  ],
  "professions": [
    "Residential Contractors"
  ],
  "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 business licence |
| `listing_id` | Licence number exactly as OPR prints it (e.g. 174.0000001) |
| `category` | Licence type in OPR's words, e.g. Residential Contractor - Business, Registered Nurse, Professional Engineer |
| `street` | Mailing street address (both address lines) |
| `city` | Mailing city |
| `region` | Mailing state (two letters) |
| `postal_code` | Mailing ZIP code |
| `extras.profession` | The OPR profession, e.g. Residential Contractors, Nursing, Engineering |
| `extras.status` | Licence status: Active, Active-InRenewal, Expired, Inactive per Request, Suspended, Revoked, ... |
| `extras.issued` | First issuance date, as OPR prints it (MM/DD/YYYY) |
| `extras.expires` | Licence expiration date, as OPR prints it (MM/DD/YYYY) |
| `extras.branch_name` | Branch name of a business licence, where recorded |
| `extras.employer` | Employer, where OPR records it |
| `source_url` | OPR's Find a Professional page, tagged with the licence type code and licence number (no per-licence page exists) |

Sample:

```json
{
  "listing_id": "174.0000001",
  "name": "Twin Pines Building & Remodeling LLC",
  "street": "31 West St",
  "city": "Essex Junction",
  "region": "VT",
  "postal_code": "05452-3550",
  "country": "US",
  "category": "Residential Contractor - Business",
  "categories": [
    "Residential Contractor - Business"
  ],
  "source": "snapshot",
  "source_url": "https://sos.vermont.gov/opr/find-a-professional/#NGLP174-174.0000001",
  "extras": {
    "profession": "Residential Contractors",
    "status": "Active"
  }
}
```

### 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 in the stored copy of the directory. Kept alongside 'queries' for saved tasks. |
| `queries` | no | array | `[]` | A licensee's name (or listing number) to look up in the stored copy of the directory. Several values in one run; combined with 'query'. |
| `profession` | no | string | — | Only listings in this profession. Kept alongside 'professions' for saved tasks. |
| `professions` | no | array | `[]` | Only listings in this profession. Several values in one run; combined with 'profession'. |
| `status` | no | string | — | Only listings in this status. Kept alongside 'statuses' for saved tasks. |
| `statuses` | no | array | `[]` | Only listings in this status. Several values in one run; combined with 'status'. |
| `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: 503B Outsourcer, Accounting Firm, Accounting Firm - Temporary License, Acupuncture Detoxification Technician, Acupuncturist, Acupuncturist - Facility Staff - Inactive Registration, Acupuncturist - Interim Telehealth Registration, Acupuncturist - Provisional, Advanced Practice Registered Nurse, Advanced Practice Registered Nurse - Emergency Temporary License, Advanced Practice Registered Nurse - Facility Staff - Inactive Registration, Advanced Practice Registered Nurse - Interim Telehealth Registration, Advanced Practice Registered Nurse - Provisional, Advanced Practice Registered Nurse - Refresher Permit, Advanced Practice Registered Nurse - Temporary Permit, Amateur Promoter, Annual Event Permit, Applied Behavior Analyst, Applied Behavior Analyst - Interim Telehealth Registration, Applied Behavior Analyst - Provisional, Apprentice Addiction Professional, Architect, Assistant Behavior Analyst, Assistant Behavior Analyst - Interim Telehealth Registration, Athletic Trainer, … (347 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 Vermont residential contractor, business and individual, with a mailing address.
- Recruiting: active Vermont-licensed nurses or mental health counselors, filtered by city.
- Market sizing: count licensed engineers, pharmacies or massage therapists by city.
- Credential checks: confirm a licence number's status and read its expiry date.

### Why this actor

- 52 professions in one run instead of hundreds of roster downloads.
- Filters the download form lacks: profession, licence type, status and city, each taking a list.
- Every status is kept, so a verification sees expired and suspended licences too.
- Pay per licence; notices are free.

### Limitations & updates

Covers the licensees in the Vermont Office of Professional Regulation's Profession Roster Download: 347 licence types from 52 professions, every status. No physicians (a separate board), no phone or email; street address on about 94% of rows. Data comes from a stored copy of the rosters (its date is in the run log), not a live read. One run returns at most 100,000 rows; split larger exports by profession.

### FAQ

**Where does the data come from?**

The Profession Roster Download of the Vermont Office of Professional Regulation (sos.vermont.gov, Find a Professional), one spreadsheet per licence type with every status. We download every roster and serve it from a stored copy; the run log gives its date.

**Is there a phone or email?**

No. OPR's rosters carry a mailing address, not a phone or email. Street addresses fill about 94% of rows (checked 2026-11-03).

**Which professions are covered?**

All 52 OPR professions with a non-empty roster, 347 licence types: Nursing, Pharmacy, Engineering, Real Estate, Residential Contractors, Allied Mental Health, Social Work, Dental, Architects, Accountancy, Notaries Public, Barbers & Cosmetologists and more. Put professions in Profession, or exact licence types in Licence type; leave both empty for everything. Physicians (MD) are licensed by the Board of Medical Practice and are not in OPR's rosters.

**Does it include contractors?**

Yes: OPR's Residential Contractors profession, as two licence types, Residential Contractor - Business and Residential Contractor - Individual (1,653 active licences on 2026-11-03). Set Licence type to those two and Status to Active, Active-InRenewal.

**Are expired or inactive licences included?**

Yes, every status OPR publishes: Active, Active-InRenewal, Expired, Inactive per Request, Suspended, Revoked and others. Most rows are Expired, so set Status to Active and Active-InRenewal for a live list.

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

Put names or licence numbers in queries and set mode to lookup. A name matches if it is contained in the holder's name; a number matches exactly. Narrow it with Profession or Licence type.

**How current is it?**

Rows come from a stored copy of OPR's rosters, refreshed when it is over 30 days old and the actor is in use. The run log states the date of the copy you received, and a copy older than 45 days adds a free notice saying so.

**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 Vermont Professional License Lookup & Leads Scraper (OPR)](https://scrapebench.dev/guides/how-to-vermont-professional-license-lookup/)
- **Use case:** [Vermont Residential Contractors (OPR)](https://scrapebench.dev/use-cases/vermont-residential-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/vermont-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 Vermont residential contractors licensed by the Office of Professional Regulation, with their mailing addresses."

That is the two Residential Contractor licence types with Status Active and Active-InRenewal (1,653 licences on 2026-11-03). 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 Vermont Office of Professional Regulation (OPR) 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 Vermont Office of Professional Regulation (OPR). 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 in the stored copy of the directory. Kept alongside 'queries' for saved tasks.

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

A licensee's name (or listing number) to look up in the stored copy of the directory. Several values in one run; combined with 'query'.

## `profession` (type: `string`):

Only listings in this profession. Kept alongside 'professions' for saved tasks.

## `professions` (type: `array`):

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

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

Only listings in this status. Kept alongside 'statuses' for saved tasks.

## `statuses` (type: `array`):

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

## `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: 503B Outsourcer, Accounting Firm, Accounting Firm - Temporary License, Acupuncture Detoxification Technician, Acupuncturist, Acupuncturist - Facility Staff - Inactive Registration, Acupuncturist - Interim Telehealth Registration, Acupuncturist - Provisional, Advanced Practice Registered Nurse, Advanced Practice Registered Nurse - Emergency Temporary License, Advanced Practice Registered Nurse - Facility Staff - Inactive Registration, Advanced Practice Registered Nurse - Interim Telehealth Registration, Advanced Practice Registered Nurse - Provisional, Advanced Practice Registered Nurse - Refresher Permit, Advanced Practice Registered Nurse - Temporary Permit, Amateur Promoter, Annual Event Permit, Applied Behavior Analyst, Applied Behavior Analyst - Interim Telehealth Registration, Applied Behavior Analyst - Provisional, Apprentice Addiction Professional, Architect, Assistant Behavior Analyst, Assistant Behavior Analyst - Interim Telehealth Registration, Athletic Trainer, … (347 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": [],
  "professions": [],
  "statuses": [],
  "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/vermont-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/vermont-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/vermont-professional-license-lookup --silent --output-dataset

```

## MCP server setup

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