# OIG Exclusion List (LEIE) Scraper (`parseforge/hhs-oig-leie-exclusions-scraper`) Actor

Search and download the HHS OIG List of Excluded Individuals/Entities: 83,000+ excluded providers with NPI, DOB, address, exclusion authority and date, monthly new exclusions and reinstatements, roster screening, NPI registry and geocoding enrichment.

- **URL**: https://apify.com/parseforge/hhs-oig-leie-exclusions-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.56 / 1,000 exclusion 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?

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### OIG Exclusion List (LEIE) Scraper

**Search, filter and download the HHS OIG exclusion list — the List of Excluded Individuals/Entities (LEIE) — and screen your own roster against it.** Every excluded provider with name, category, specialty, NPI, UPIN, date of birth, address, the exclusion authority with its meaning and minimum period, and the exclusion date. Monthly new exclusions and reinstatements as their own feeds. Optional NPI registry profile and geocoded address. No login, no API key, no browser. Export to CSV, JSON, Excel, or XML.

The OIG publishes the LEIE as a 15 MB CSV plus monthly supplement files, and an online search that only takes one name at a time and shows fewer fields than the file. This Actor reads the same public files, normalises them into clean rows, applies your filters, and can check a list of employees, vendors or NPIs against the whole database in one run.

| Who uses it | What they use the LEIE for |
|---|---|
| Healthcare compliance and HR teams | Monthly screening of staff, contractors and vendors, as CMS and state Medicaid programs require |
| Credentialing and provider-enrollment teams | Checking an NPI or a physician before onboarding, with the NPPES profile beside the exclusion |
| Pharmacies, DME suppliers and billing companies | Watching the monthly new exclusions in their state and specialty |
| Healthcare law firms and investigators | Exclusion history by authority, date and location; reinstatements as they happen |
| Compliance-software and data vendors | A normalised monthly feed of exclusions and reinstatements with stable record keys |

### What it does

The LEIE holds about **83,800 currently excluded individuals and entities** (80,400 people and 3,400 businesses). OIG refreshes the file around the 10th of each month with the actions of the previous month, and publishes each month's **new exclusions** (about 250) and **reinstatements** (40–80) as separate supplement files, kept online for roughly the last 19 months.

The Actor returns one row per record:

- 🧾 **The exclusion record:** last, first and middle name or business name, OIG's general category and specialty, NPI and UPIN, date of birth, street address, city, state and ZIP, the exclusion type code, and the exclusion date.
- ⚖️ **The authority, decoded:** each `1128b4`-style code becomes `1128(b)(4)`, its class (mandatory or permissive exclusion), the plain-English reason ("License revocation, suspension, or surrender") and the statutory minimum period.
- 🗓️ **Monthly feeds:** choose the new-exclusions supplement, the reinstatements supplement (with the reinstatement date), or both, for the last *N* months.
- 🔍 **Screening mode:** paste a list of names ("LAST, FIRST" with an optional date of birth), business names or NPIs; the Actor returns one row per subject with `matched`, the match quality, and the matching records embedded.
- 🏥 **NPI registry profile** (optional): for records with an NPI, the CMS NPPES profile — active/deactivated status, enumeration date, credential, sex, primary taxonomy and licence, practice and mailing address with phone and fax, and the authorized official for organisations.
- 📍 **Geocoded address** (optional): latitude, longitude, the standardised address and the state, county, tract and block FIPS codes from the U.S. Census Bureau geocoder.

Filters run on the downloaded list, so combining name, state, city, ZIP, category, specialty, authority, class, date range, NPI and entity type costs nothing extra. Rows are sorted newest first by default.

Every row contains: `recordKey`, `recordType`, `source`, `supplementMonth`, `entityType`, `fullName`, `lastName`, `firstName`, `middleName`, `businessName`, `generalCategory`, `specialty`, `upin`, `npi`, `dateOfBirth`, `address`, `city`, `state`, `zip`, `exclusionType`, `exclusionAuthority`, `exclusionClass`, `exclusionDescription`, `minimumPeriod`, `exclusionDate`, `daysSinceExclusion`, `reinstatementDate`, `waiverDate`, `waiverState`, `dataAsOf`, `sourceUrl`, `scrapedAt` — plus `npiRegistry`, `npiStatus`, `npiPrimaryTaxonomy`, `npiPracticePhone` with the NPI profile, and `geocode`, `latitude`, `longitude` with geocoding. Screening rows contain `subject`, `subjectType`, `parsedSubject`, `matchMode`, `matched`, `matchCount`, `matchQuality` and `matches`.

### What you can do with OIG exclusion data

**Screen your workforce every month.**

A hospital compliance officer schedules a monthly run with `screenSubjects` set to the employee roster (`"DOE, JANE, 1980-05-14"`) and vendor list, and routes every row with `matched: true` to review. Dates of birth resolve common names; NPIs resolve providers exactly.

**Watch new exclusions in your state.**

A pharmacy chain runs `source: "new-exclusions"` with `states: ["TX"]` on the 15th of each month and gets the providers excluded in Texas last month, decoded authority included.

**Verify a provider before enrollment.**

A credentialing team passes the NPI with `includeNpiRegistry: true` and sees the exclusion beside the current NPPES profile — is the NPI still active, which licence and taxonomy, which practice address.

**Track reinstatements.**

A law firm pulls `source: "reinstatements"` for the last 12 months to find clients and counterparties whose exclusions ended, with the exact reinstatement date.

**Build a map of excluded providers.**

An investigative team filters `exclusionClass: "mandatory"` with `includeGeocode: true` and plots the coordinates by county FIPS.

### Why choose this scraper

|  | What you get |
|---|---|
| **The whole list, normalised** | 83,800 records with clean nulls (no `0000000000` NPIs or `00000000` dates), ISO dates and a stable `recordKey` for deduplication across months |
| **The authority explained** | Class, reason and minimum period for every exclusion code, straight from OIG's authorities table |
| **Monthly feeds** | New exclusions and reinstatements per month, each row tagged with its supplement month |
| **Screening with match quality** | `npi`, `exact` (name and date of birth), `name`, `first-initial`, `business-exact`, `business-partial`, `last-name-only` |
| **Two enrichments** | CMS NPPES profile and Census geocoding, charged only where they return data |
| **Server-side nothing, client-side everything** | Fifteen filters combine freely; a run costs one 15 MB download plus the rows you keep |
| **No browser, no proxy** | Plain HTTP against public files; runs in seconds |

### How it compares

| Feature | ParseForge | Typical LEIE screening actors |
|---|---|---|
| Full list with 15 combinable filters | Yes | Usually name or NPI lookup only |
| Monthly new exclusions and reinstatements as feeds | Yes | Not listed |
| Exclusion authority decoded (class, reason, minimum period) | Yes | Code only |
| Roster screening with dates of birth and match quality | Yes | Some |
| NPPES profile per NPI | Yes | Some |
| Geocoded address with FIPS codes | Yes | Not listed |
| Price per record | $0.004 | $0.002 – $0.10 |

### Configure the run

Pick a source, add filters or a list of subjects to screen, and set the maximum number of records. The two enrichments are opt-in because each costs a request per record.

A first run with the defaults (the 100 most recent exclusions):

```json
{
  "source": "full-list",
  "maxItems": 100,
  "sortBy": "newest"
}
```

Last month's new exclusions in two states:

```json
{
  "source": "new-exclusions",
  "supplementMonths": 1,
  "states": ["TX", "OK"],
  "maxItems": 1000
}
```

Screen a roster:

```json
{
  "screenSubjects": ["SMITH, JOHN, 1970-06-08", "GONZALEZ, MARIA", "1346474764", "Benimar Medical Center Inc"],
  "screenMatchMode": "standard",
  "maxItems": 500
}
```

Excluded physicians with an NPI, with the NPPES profile and coordinates:

```json
{
  "generalCategories": ["PHYSICIAN", "MEDICAL PRACTICE"],
  "hasNpi": true,
  "excludedAfter": "2025-01-01",
  "includeNpiRegistry": true,
  "includeGeocode": true,
  "maxItems": 2000
}
```

Reinstatements over the last year:

```json
{
  "source": "reinstatements",
  "supplementMonths": 12,
  "maxItems": 2000
}
```

### Limits

- The LEIE is a monthly file: `dataAsOf` on each row is the date OIG last published it. Exclusions taken after that date are not in the list yet, on oig.hhs.gov or anywhere else.
- OIG truncates names and addresses (last name 20 characters, business name 30, address 30). Screening compensates for truncated business names; a person's full first name may appear shortened in the record.
- A date of birth is published for 95% of individuals; an NPI for about 8,800 records (most exclusions predate NPIs or concern people who never had one). `hasNpi` and `hasDateOfBirth` keep only records that carry them.
- Screening uses the full list only, so a subject reinstated last month correctly comes back unmatched. Up to 25 matching records are embedded per subject; `matchCount` reports the true number.
- OIG keeps about the last 19 monthly supplements online; older months are not available on the site.
- The Census geocoder does not resolve P.O. boxes, "C/O" addresses or foreign addresses (`state: "XX"`); those rows return `geocode.matched: false` and are not charged.
- The full list downloads and parses in a few seconds; 5,000 records write in under 10 seconds, the whole list in a couple of minutes. Use the filters or `maxItems` for routine runs.
- Apify gives every run a cost ceiling derived from your balance (`maxTotalChargeUsd`). The Actor checks it before each batch and stops cleanly at it, so you only receive rows that were paid for; the status message says "run cost limit reached".

### Pricing

Pay-per-event. **$4 per 1,000 records** plus $0.02 per run start. Extras are charged only when enabled and only for the records that actually returned data:

| Event | Price | When |
|---|---|---|
| `exclusion-record` | $0.004 | Every row from the full list |
| `monthly-exclusion-record` | $0.004 | Every row from a new-exclusions supplement |
| `reinstatement-record` | $0.004 | Every row from a reinstatements supplement |
| `supplement-file` | $0.01 | Each monthly supplement file read |
| `screening-check` | $0.008 | Each subject screened |
| `screening-match` | $0.004 | Each matching record embedded in a screening row |
| `npi-lookup` | $0.005 | NPI registry profile on, NPPES returned the profile |
| `geocode` | $0.003 | Geocoding on, the address resolved |

| Run | Approximate cost |
|---|---|
| 100 most recent exclusions | $0.42 |
| Last month's new exclusions and reinstatements (about 330 rows) | $1.36 |
| 500 employees screened, 3 matches | $4.03 |
| 1,000 records with an NPI, NPPES profile and geocoding (75% resolved) | $11.27 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 records (or 10 screened subjects) as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to pull the whole list.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [OIG Exclusion List (LEIE) Scraper](https://apify.com/parseforge/hhs-oig-leie-exclusions-scraper?fpr=vmoqkp).
3. Pick a source, set filters or paste the subjects to screen, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab, or schedule the run monthly.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to the OIG exclusion list through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/hhs-oig-leie-exclusions-scraper"
```

Then ask: *"Is NPI 1346474764 on the OIG exclusion list, and under which authority?"*

### FAQ

**Is the data public?** Yes. OIG publishes the LEIE for anyone to download and requires health care providers to check it; the Actor reads only those public files.

**How current is it?** OIG updates the LEIE by the middle of each month with the previous month's actions. `dataAsOf` on every row tells you which release you are looking at.

**Why does my search on exclusions.oig.hhs.gov show a person this Actor does not return?** The online search and the downloadable file are refreshed together, so the two agree; check the spelling and the `lastName` prefix. If the person was reinstated, they leave the list — use `source: "reinstatements"` to see when.

**Can it verify an SSN or EIN?** No. OIG's "Verify" step needs the SSN/EIN entered on its own site and returns only a yes/no; the Actor matches on name, date of birth and NPI instead.

# Actor input Schema

## `source` (type: `string`):

The full LEIE (about 83,800 currently excluded individuals and entities, refreshed by OIG around the 10th of each month), or the monthly supplement files: the exclusions added in a month, the reinstatements (people removed from the list) in a month, or both.

## `supplementMonths` (type: `integer`):

For the monthly supplement sources: how many of the most recent monthly files to read (1 = the latest month). OIG keeps about the last 19 months online.

## `maxItems` (type: `integer`):

Stop after this many records (or screened subjects). Free-plan runs return up to 10 as a preview.

## `sortBy` (type: `string`):

Newest exclusions first (default), oldest first, or alphabetical by name.

## `screenSubjects` (type: `array`):

Screening mode: one line per person, business or NPI to check against the list. Individuals as "LAST, FIRST" (optionally ", YYYY-MM-DD" for the date of birth), businesses as their name, NPIs as 10 digits. When this list is filled the Actor returns one row per subject with its matches instead of listing the database.

## `screenMatchMode` (type: `string`):

Standard: last name equal and first name equal or abbreviated (J. / JOHN), date of birth must agree when both sides have one; businesses match on the normalised name. Broad: also returns last-name-only and partial business-name matches, flagged with a lower match quality.

## `search` (type: `string`):

Text contained anywhere in the individual's name or the business name, e.g. "PHARMACY" or "GONZALEZ".

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

Individuals whose last name starts with this text (the same behaviour as the online LEIE search).

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

Individuals whose first name starts with this text.

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

Entities whose business name contains this text.

## `npis` (type: `array`):

One or more 10-digit National Provider Identifiers. Only about 8,800 LEIE records carry an NPI; the rest predate NPIs or belong to people who never had one.

## `entityType` (type: `string`):

Individuals (about 80,400 records) or business entities (about 3,400).

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

Two-letter state or territory codes of the record's address, e.g. \["CA", "FL"]. "XX" is used by OIG for addresses outside the United States.

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

City of the record's address (contains).

## `zip` (type: `string`):

ZIP code or ZIP prefix, e.g. "331" for Miami.

## `exclusionTypes` (type: `array`):

LEIE exclusion type codes. 1128(a) authorities are mandatory exclusions (convictions), 1128(b) are permissive (licence actions, defaults, kickbacks…).

## `exclusionClass` (type: `string`):

Mandatory exclusions (section 1128(a): convictions, 5-year minimum), permissive exclusions (section 1128(b)), or the remaining authorities (civil monetary penalties, QIO/PSRO findings, breaches of agreements).

## `generalCategories` (type: `array`):

OIG's general category of the excluded party, matched as contains: e.g. "NURSING", "PHARMACY", "PHYSICIAN", "DME", "HOME HEALTH", "HOSPITAL", "SKILLED NURSING", "BUS OWNER".

## `specialty` (type: `string`):

Specialty text, e.g. "NURSE", "PHARMACIST", "DENTIST", "INTERNAL MEDICINE", "OWNER/OPERATOR".

## `excludedAfter` (type: `string`):

YYYY-MM-DD. Exclusion date on or after this day.

## `excludedBefore` (type: `string`):

YYYY-MM-DD. Exclusion date on or before this day.

## `hasNpi` (type: `boolean`):

Keep only records that carry a real National Provider Identifier.

## `hasDateOfBirth` (type: `boolean`):

Keep only individuals whose date of birth is published.

## `includeNpiRegistry` (type: `boolean`):

For records with an NPI, look the number up in the CMS NPPES registry and add the provider's current status, enumeration date, credential, sex, primary taxonomy and licence, practice and mailing address with phone, and the authorized official for organisations. One request per NPI.

## `includeGeocode` (type: `boolean`):

Resolve the record's address with the U.S. Census Bureau geocoder: latitude, longitude, the standardised address, and the state, county, tract and block FIPS codes. P.O. boxes and foreign addresses do not resolve and are not charged.

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

oig.hhs.gov serves the files without any anti-bot layer, so no proxy is used by default. If the download is refused the Actor retries once through the Apify datacenter proxy on its own.

## Actor input object example

```json
{
  "source": "full-list",
  "supplementMonths": 1,
  "maxItems": 100,
  "sortBy": "newest",
  "screenMatchMode": "standard",
  "entityType": "all",
  "exclusionClass": "all",
  "hasNpi": false,
  "hasDateOfBirth": false,
  "includeNpiRegistry": false,
  "includeGeocode": false
}
```

# Actor output Schema

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

No description

## `exclusions` (type: `string`):

No description

## `csv` (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 = {
    "source": "full-list",
    "supplementMonths": 1,
    "maxItems": 100,
    "sortBy": "newest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/hhs-oig-leie-exclusions-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 = {
    "source": "full-list",
    "supplementMonths": 1,
    "maxItems": 100,
    "sortBy": "newest",
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/hhs-oig-leie-exclusions-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 '{
  "source": "full-list",
  "supplementMonths": 1,
  "maxItems": 100,
  "sortBy": "newest"
}' |
apify call parseforge/hhs-oig-leie-exclusions-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/hhs-oig-leie-exclusions-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/gwTUyIFtPec6rX65D/builds/roeTiev92Hdsi84FX/openapi.json
