# IDFPR License Lookup — Illinois Professional Licenses (`muhammadafzal/illinois-license-scraper`) Actor

Verify Illinois professional licenses in bulk from IDFPR data: search by name, license number, profession or city for status and expiry. USD 3 per 1,000.

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

## Pricing

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

## IDFPR License Lookup — Illinois Professional Licenses

IDFPR License Lookup searches Illinois professional license records by name, license number, profession or city and returns the licensee name, license number, license type, status, issue date, expiration date and city for each match. It is built for credentialing and HR teams, staffing agencies, compliance staff and researchers who check Illinois nurses, physicians, pharmacists, real estate brokers, CPAs, engineers and other licensees in bulk, and it costs USD 3.00 per 1,000 license records on the FREE tier (USD 2.40 per 1,000 on GOLD).

The data comes from the Illinois Department of Financial and Professional Regulation (IDFPR) "Professional Licensing" dataset on the State of Illinois open data portal: about 4.3 million current and historical license records, about 1.37 million of them active (counts from 2026-10-26, when the State had last updated the dataset that day). This Actor is independent of IDFPR.

### What license data does the Illinois license lookup return?

Each dataset row is one license. A person or business with several licenses appears once per license.

| Field | What it contains |
|---|---|
| `name` | Licensee as `LAST, FIRST MIDDLE` for people, or the business name |
| `licenseNumber` | Illinois license or registration number (some very old records have none) |
| `licenseType` | License description, for example `REGISTERED PROFESSIONAL NURSE` or `LICENSED PHYSICIAN AND SURGEON` |
| `status` | For example `ACTIVE`, `NOT RENEWED`, `INACTIVE`, `EXPIRED`, `SUSPENDED`, `DECEASED` |
| `issueDate` | Original issue date (`YYYY-MM-DD`) |
| `expirationDate` | Current expiration date (`YYYY-MM-DD`) |
| `city` | City on the license record |
| `sourceUrl` | IDFPR's public License Lookup page, for manual confirmation |
| `scrapedAt` | Retrieval time (UTC) |

Discipline details, street address, ZIP and county exist in the State dataset but are not returned by this Actor. The `OUTPUT` record reports the record count, status (`SUCCEEDED`, `EMPTY`, `REJECTED`, `FAILED`) and warnings.

### How do I look up an Illinois nursing license?

Search by name and narrow by profession. Profession text matches anywhere in the license description or board name, so use the State's wording: `REGISTERED PROFESSIONAL NURSE` for RNs, `LICENSED PRACTICAL NURSE` for LPNs, `ADVANCED PRACTICE` for APRNs, or `NURSE` for all nursing licenses.

```json
{
  "lastName": "Garcia",
  "firstName": "Maria",
  "profession": "REGISTERED PROFESSIONAL NURSE",
  "city": "Chicago",
  "maxResults": 25
}
```

The same pattern works for doctors (`PHYSICIAN AND SURGEON` or `MEDICAL BOARD`), pharmacists (`REGISTERED PHARMACIST`), real estate (`REAL ESTATE`), CPAs (`CERTIFIED PUBLIC ACCOUNTANT`) and engineers (`PROFESSIONAL ENGINEER`). Note that `Registered Nurse` does not match `REGISTERED PROFESSIONAL NURSE`, because the words must appear in that order.

### How do I verify an IDFPR license by license number?

Enter the number on its own. It matches exactly or as part of the number:

```json
{
  "licenseNumber": "004001061",
  "maxResults": 5
}
```

Search rules, all case-insensitive and combined with AND:

- **lastName**: last names equal to or starting with the text, and business names containing it. It has no default; the Console prefill is `Garcia`.
- **firstName**: first names equal to or starting with the text.
- **licenseNumber**, **profession**, **city**: the text appears anywhere in the field.

Results are sorted by last name, first name and license number, and business records (which have no last name) come first. A bare `lastName: "Smith"` search therefore returns pharmacy and drug-distributor businesses such as "SMITHS MEDICAL ASD INC" before any person named Smith. Add a first name or profession to reach individuals, as the Console prefill does: `Garcia` + `REGISTERED PROFESSIONAL NURSE` + `Chicago` returns Chicago nurses, most of them with active licenses.

### When should I use this Actor, and when not?

**Use it when** you need Illinois license status as rows: re-verifying a staff roster, screening candidates, checking expiration dates before renewals, or building lists of licensees by profession and city.

**Use another Actor when:**

- You need Illinois roofing contractors with contact details: [Illinois Roofing Contractors — IDFPR License Lookup & List](https://apify.com/muhammadafzal/illinois-roofing-contractor-directory-leads-scraper).
- You need California or Virginia professional licenses: [California DCA Professional License Scraper](https://apify.com/muhammadafzal/california-dca-professional-license-scraper) or [Virginia DPOR License Scraper](https://apify.com/muhammadafzal/virginia-dpor-professional-license-scraper).
- You need CPAs across states: [NASBA CPA Directory Scraper](https://apify.com/muhammadafzal/nasba-cpa-directory-scraper).
- You need an LLC or corporation record (Secretary of State), a driver's license or a license plate. Those are not IDFPR professional licenses.

For a formal primary-source verification, confirm the result on IDFPR's own License Lookup.

### Use it from an AI assistant

IDFPR License Lookup works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add it with `https://mcp.apify.com/?tools=muhammadafzal/illinois-license-scraper`, then ask, for example: "Check whether these five Illinois registered nurses have active licenses and list their expiration dates."

### Run it with the API

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/illinois-license-scraper').call({
    lastName: 'Nguyen',
    profession: 'PHYSICIAN AND SURGEON',
    maxResults: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.status === 'ACTIVE').length, 'active licenses');
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("muhammadafzal/illinois-license-scraper").call(
    run_input={"licenseNumber": "004001061", "maxResults": 5}
)
for lic in client.dataset(run.default_dataset_id).iterate_items():
    print(lic["name"], lic["licenseNumber"], lic["status"], lic["expirationDate"])
```

### What does the output look like?

Two business records from the State dataset on 2026-10-26 (the second is one of the bare `Smith` results):

```json
[
  {
    "name": "S J SMITH CO INC",
    "licenseNumber": "004001061",
    "licenseType": "LICENSED WHOLESALE DRUG DISTRIBUTOR",
    "status": "ACTIVE",
    "issueDate": "1999-03-15",
    "expirationDate": "2026-12-31",
    "city": "DECATUR",
    "sourceUrl": "https://online-dfpr.micropact.com/lookup/licenselookup.aspx",
    "scrapedAt": "2026-10-26T12:00:00.000Z"
  },
  {
    "name": "SMITHS MEDICAL ASD INC",
    "licenseNumber": "004000516",
    "licenseType": "LICENSED WHOLESALE DRUG DISTRIBUTOR",
    "status": "NOT RENEWED",
    "issueDate": "1995-01-30",
    "expirationDate": "2024-12-31",
    "city": "KEENE",
    "sourceUrl": "https://online-dfpr.micropact.com/lookup/licenselookup.aspx",
    "scrapedAt": "2026-10-26T12:00:00.000Z"
  }
]
```

### Pricing: how much does an Illinois license lookup cost?

IDFPR License Lookup uses pay-per-event pricing. Platform usage is included in the event prices.

| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM / DIAMOND |
|---|---:|---:|---:|---:|---:|
| License record (one dataset row) | USD 0.003001 | USD 0.002925 | USD 0.00285 | USD 0.0024 | USD 0.0024 |
| Actor start (per started GB of allocated memory) | USD 0.026058 | USD 0.025406 | USD 0.024755 | USD 0.020846 | USD 0.020846 |

Worked totals on the FREE tier at the default 512 MB memory (one start event):

- Console prefill run, 10 records: 10 × USD 0.003001 + USD 0.026058 = **USD 0.0561**
- Maximum run, 100 records: 100 × USD 0.003001 + USD 0.026058 = **USD 0.3262**

The start fee is the larger part of a small run, so batch several names into fewer runs where you can. A search with no matches charges only the start fee.

### What are the limits?

- **100 records per run** (`maxResults`, default 10). Split larger lists across runs.
- **No status filter.** Active and historical licenses come back together; filter on `status` afterwards.
- **Field set.** Nine fields per record; discipline history and full address are not included.
- **Speed.** Typical runs take 3 to 16 seconds. Requests go straight to the State's public data service, with up to 3 retries (default 2).
- **Network fallback.** If the direct request fails, the Actor retries through its own fallback access route; there are no network settings to choose.
- **Input errors** (for example no search field at all) stop the run before any data is fetched, with a `REJECTED` status.

### FAQ

#### Is this the official IDFPR data?

It is IDFPR's own "Professional Licensing" dataset as published on the State of Illinois open data portal. IDFPR's License Lookup website remains the official verification tool.

#### How current are the records?

The State refreshes the dataset regularly; it showed an update on 2026-10-26. IDFPR notes that new licenses can take up to 24 hours to appear in its systems.

#### Which professions are covered?

All IDFPR-regulated professions in the dataset, more than 300 license descriptions: nursing, medicine, pharmacy, dentistry, real estate, cosmetology, accounting, engineering, social work, private security, roofing and many more.

#### Can I search by license number only?

Yes. Enter `licenseNumber` and leave the name fields empty.

#### Does it show disciplinary actions?

No. It returns license status and dates. Check IDFPR's License Lookup or its enforcement reports for discipline.

#### Can I look up an Illinois LLC or business registration?

No. Business entities are registered with the Illinois Secretary of State, not IDFPR. This Actor returns professional and occupational licenses only.

### Related Actors

Licensing and public data from the same developer:

- [Illinois Roofing Contractors — IDFPR License Lookup & List](https://apify.com/muhammadafzal/illinois-roofing-contractor-directory-leads-scraper)
- [FDA Drug Approvals Scraper](https://apify.com/muhammadafzal/fda-drug-approvals-scraper) for Drugs@FDA approval history
- [ProPublica Nonprofit Explorer Scraper](https://apify.com/muhammadafzal/guidestar-propublica-nonprofit-scraper) for nonprofit 990 data
- [FRED Data Scraper](https://apify.com/muhammadafzal/fred-economic-data-scraper) and [IMF World Economic Outlook Scraper](https://apify.com/muhammadafzal/imf-world-economic-outlook-scraper) for economic data

### Legal and compliance

This Actor reads public license data published by the State of Illinois. It is not affiliated with IDFPR and does not log in or bypass access controls. License records name individuals, so follow privacy, employment-screening and consumer-reporting rules (such as the FCRA where it applies), and confirm consequential decisions on IDFPR's official License Lookup.

Last verified: 2026-10-27

# Actor input Schema

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

Use this to search by surname, for example Garcia. Matches last names equal to or starting with the text, and business names containing it; business records sort first. Leave empty when searching by license number only.

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

Optional first name to narrow an individual search, for example Aaron.

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

Use this to verify a specific Illinois license or registration number, for example 004001061. Matches exactly or as part of the number.

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

Use this to narrow by license type. Text must appear in the State's wording, in order, for example REGISTERED PROFESSIONAL NURSE, PHYSICIAN AND SURGEON, REAL ESTATE or NURSE. 'Registered Nurse' does not match RN records.

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

Optional Illinois city filter, for example Chicago.

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

Maximum records to save, from 1 to 100.

## `maxRequestRetries` (type: `integer`):

Retries for temporary source failures, from 0 to 3.

## Actor input object example

```json
{
  "lastName": "Garcia",
  "firstName": "",
  "licenseNumber": "",
  "profession": "REGISTERED PROFESSIONAL NURSE",
  "city": "Chicago",
  "maxResults": 10,
  "maxRequestRetries": 2
}
```

# Actor output Schema

## `summary` (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 = {
    "lastName": "Garcia",
    "firstName": "",
    "licenseNumber": "",
    "profession": "REGISTERED PROFESSIONAL NURSE",
    "city": "Chicago"
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/illinois-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 = {
    "lastName": "Garcia",
    "firstName": "",
    "licenseNumber": "",
    "profession": "REGISTERED PROFESSIONAL NURSE",
    "city": "Chicago",
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/illinois-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 '{
  "lastName": "Garcia",
  "firstName": "",
  "licenseNumber": "",
  "profession": "REGISTERED PROFESSIONAL NURSE",
  "city": "Chicago"
}' |
apify call muhammadafzal/illinois-license-scraper --silent --output-dataset

```

## MCP server setup

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