# New Jersey Professional License Search (NJ DCA) (`lulzasaur/nj-license-scraper`) Actor

Verify New Jersey professional licenses from the official NJ Division of Consumer Affairs database — 55 professions incl. nursing, HVACR, electrical, plumbing, home improvement contractors, pharmacy. Search people or businesses by name, license number, or city. Returns status & expiration.

- **URL**: https://apify.com/lulzasaur/nj-license-scraper.md
- **Developed by:** [lulz bot](https://apify.com/lulzasaur) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## New Jersey Professional License Search (NJ DCA)

Verify professional licenses against the **official New Jersey Division of Consumer Affairs (DCA)** license verification database — the same source used by employers, compliance teams, and consumers at newjersey.mylicense.com.

Covers **55 licensed professions**, including:

- **Nursing** (RN, LPN, APN) and **Physician Assistants**
- **Home Improvement Contractors** (business search)
- **Electrical Contractors**, **Master Plumbers**, **HVACR**
- **Pharmacy**, **Dentistry**, **Optometry**, **Physical Therapy**
- **Cosmetology and Hairstyling**, **Massage and Bodywork Therapy**
- **Accountancy**, **Architecture**, **Engineers & Land Surveyors**
- **Psychology**, **Social Work**, **Marriage and Family Therapy**
- **Real Estate Appraisers**, **Veterinary Medicine** … and more

### What you get

Each record includes:

| Field | Description |
|---|---|
| `fullName` | Licensee or business name |
| `licenseNumber` | NJ license number (e.g. `26NR00406800`) |
| `profession` | DCA board / profession |
| `licenseType` | Specific license type |
| `licenseStatus` | Active, Expired, Suspended, etc. |
| `issueDate` / `expirationDate` | From the detail page (when enabled) |
| `statusChangeReason` | Why the status last changed (when present) |
| `city` / `state` | Licensee address city and state |
| `detailUrl` | Direct link to the official DCA record |

### Search options

- **Person search** — first/last name of individual licensees
- **Business search** — business name (use for Home Improvement Contractors, Electrical Contractors, cemeteries, and other facility licenses)
- Filter by **profession**, **license type**, **city**, or look up an exact **license number**
- `%` wildcards supported in name fields: `smi%`, `%construction%`
- `includeDetails` fetches each record's detail page for issue/expiration dates
- `maxResults` caps output (0 = unlimited, server pages 40 at a time)

### Example input

```json
{
    "searchMode": "business",
    "profession": "Home Improvement Contractors",
    "businessName": "%construction%",
    "city": "Newark",
    "maxResults": 100
}
```

### Use cases

- **Compliance & onboarding** — verify contractor and healthcare licenses before hiring or paying
- **Lead generation** — build lists of licensed contractors, electricians, plumbers, or salons by city
- **Insurance & lending** — confirm active licensure during underwriting
- **Background checks** — expiration dates and status change reasons straight from the state source

### Notes

- Data comes directly from the official NJ DCA verification portal in real time — no stale mirrors.
- Person and business searches are separate DCA databases; a contractor business won't appear in person search.
- Searches without `%` wildcards match names exactly.

# Actor input Schema

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

Person search looks up individual licensees (first/last name). Business search looks up licensed businesses (business name) — use this for Home Improvement Contractors, Electrical Contractors, cemeteries, etc.

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

NJ DCA board/profession to search within. Leave as All to search every profession.

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

Narrow to a specific license type within the profession (e.g. "Reg. Prof. Nurse-Single State"). Must match a NJ DCA license-type label; partial, case-insensitive matches are resolved automatically.

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

Licensee last name. Supports % as a wildcard (e.g. "smi%").

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

Licensee first name. Supports % as a wildcard.

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

Business/facility name. Supports % as a wildcard (e.g. "%construction%"). Plain text without wildcards is matched exactly, so wildcards are recommended.

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

Exact NJ license number (e.g. 26NR00406800).

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

NJ city filter (e.g. Newark).

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

Fetch each licensee's detail page for issue date, expiration date, status change reason, and SPL home state. One extra request per record — disable for faster, larger scrapes.

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

Maximum number of license records to return. Set to 0 for unlimited (server paginates 40 per page).

## Actor input object example

```json
{
  "searchMode": "person",
  "profession": "Nursing",
  "licenseType": "",
  "lastName": "Smith",
  "firstName": "",
  "businessName": "",
  "licenseNumber": "",
  "city": "",
  "includeDetails": true,
  "maxResults": 100
}
```

# Actor output Schema

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

No description

# 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": "person",
    "profession": "Nursing",
    "lastName": "Smith"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lulzasaur/nj-license-scraper").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": "person",
    "profession": "Nursing",
    "lastName": "Smith",
}

# Run the Actor and wait for it to finish
run = client.actor("lulzasaur/nj-license-scraper").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": "person",
  "profession": "Nursing",
  "lastName": "Smith"
}' |
apify call lulzasaur/nj-license-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lulzasaur/nj-license-scraper"
        }
    }
}

```

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/K3rpUez2e0rFZ90Wh/builds/rddb36KhyeWACAHvu/openapi.json
