# OIG Exclusion Check (LEIE) Bulk Roster: Fuzzy Name + DOB (`willed_nursery/leie-exclusion-roster-screen`) Actor

Batch-screen staff, provider or vendor rosters against the fresh HHS-OIG LEIE list. Matching uses exact NPI plus fuzzy name with DOB and state, returns excluded/review/clear decisions, and stamps each row with a SHA-256 list version for audit files. Not legal advice.

- **URL**: https://apify.com/willed_nursery/leie-exclusion-roster-screen.md
- **Developed by:** [Joel Sumner](https://apify.com/willed_nursery) (community)
- **Categories:** AI, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 provider screeneds

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

## OIG Exclusion Check (LEIE) — Bulk Roster Screening with Fuzzy Name + DOB and Audit Stamp

**Monthly OIG exclusion screening for healthcare compliance teams:** screen staff, provider and vendor rosters against the HHS-OIG LEIE excluded-providers list in one run, with fuzzy name matching, DOB/state disambiguation, and a SHA-256 list-version stamp on every row for your audit file.

### NPI-only checks vs fuzzy name + DOB

| | NPI-only LEIE checkers | This Actor |
|---|---|---|
| Coverage | only LEIE rows with an NPI (~11%) | every LEIE row, by name |
| Typos / swapped names / suffixes | missed | Jaro-Winkler + phonetic fold |
| Disambiguation | none | DOB + state |
| Decision | hit / no hit | `excluded` / `review` / `clear` with `clear_basis` caveats |
| Audit evidence | rarely | list `last_modified`, row count, SHA-256, thresholds |

### Decision rules

Batch-screen staff, provider, and vendor rosters against the HHS-OIG **List of Excluded Individuals/Entities (LEIE)**, downloaded fresh from `oig.hhs.gov/exclusions/downloadables/UPDATED.csv` on every run. You get **one audit row per roster line**.

- **Exact NPI** match (check digit validated) → `excluded`
- **Fuzzy name** (typos, swapped first/last, punctuation, suffixes like JR/MD; businesses by token similarity) **+ DOB + state** disambiguation
- `excluded` only on exact NPI or name ≥ hit threshold **with exact DOB**. Name-only similarity is always `review`, never `excluded`. A near-exact name (≥0.95) with a **DOB mismatch is floored at `review` + `DOB_MISMATCH`, never `clear`**. An NPI hit whose name scores <0.8 is `review` + `NAME_DIFFERS`, not `excluded`. Last names are compared with Jaro-Winkler plus a phonetic fold (C/K, PH/F, S/Z…) over the full list, so first-letter typos are not lost by blocking.
- Every row is stamped with list `last_modified`, row count, and **SHA-256 of the file screened**, plus `screened_at` and the thresholds used.

### Example input

```json
{"roster":[{"first":"James","last":"Dove","dob":"1961-04-02","state":"TX","own_id":"emp-1"},{"business":"Acme Home Health LLC","npi":"1234567893","own_id":"v-9"}]}
```

### All input options

`roster`: `[{first,last,middle?,dob?,npi?,state?,business?,own_id?}]` or `csvText` (same headers, max 10 MB, max 50k rows). `reviewThreshold` (default 0.90) and `hitThreshold` (default 0.95). Street address/ZIP are omitted unless `includeStreetAddress`.
**Provider/staff/vendor identifiers only. Never upload patient data.**

### Output sample with audit stamp

```json
{"own_id":"emp-1","match_status":"review","match_basis":"name_similarity_without_dob_confirmation","clear_basis":{"status":"review","basis":"name_similarity_without_dob_confirmation","note":"..."},"best_score":0.9053,
 "candidates":[{"score":0.9053,"leie_name":"JAMES L DOVE","dob_agreement":"not_compared","excl_type":"1128a1","excl_date":"...","state":"TX"}],
 "list_version":{"source":"HHS-OIG LEIE UPDATED.csv","last_modified":"Fri, 09 Oct 2026 12:51:03 GMT","rows":84093,"sha256":"7483d4…"},
 "screened_at":"2026-10-25T03:20:00Z","thresholds":{"review":0.9,"hit":0.95}}
```

Statuses: `excluded` | `review` | `clear` | `invalid_input` (not charged). Every row has `clear_basis`: for `clear` rows it lists `fields_checked` and `caveats` (e.g. `MAY_BE_FALSE_NEGATIVE`, `NO_DOB_SUPPLIED`, `NPI_ONLY_WEAK`).

### Pricing (pay per event)

| Event | Price |
|---|---|
| `provider-screened` (per roster row) | $0.003 |
| `potential-match` (per row flagged review/excluded) | $0.01 |
| Run start | $0.00005 |
**Add DOB to cut review rows and cost.**
$0.003 per provider screened, plus $0.01 per row flagged review/excluded. Common names with no DOB will usually be flagged review, so add DOB to cut noise and cost. Example: a 1k roster with no DOB and many common names can run **$10+** (1,000 × $0.003 + ~700+ flagged × $0.01), not $3.30. A heavy-review roster approaches $0.013/row.

### Limits & disclaimer

**`clear` can be a false negative.** Causes: name variants, maiden/married name changes (our test: a different surname is not caught), data-entry errors in your roster or the LEIE, the ~1% of LEIE individuals with no DOB, and the fact that **~89% of LEIE rows (75,169 of 84,093) have no NPI**. An NPI-only `clear` therefore proves almost nothing. **You remain responsible for exclusion screening under OIG guidance.** This tool is **not a substitute for the OIG online search, SAM.gov, or state Medicaid exclusion lists.**
Not legal advice and not an eligibility determination. `clear` means no candidate above threshold in the LEIE file version stamped on the row. It does not mean "never excluded", and it does not cover SAM.gov or state Medicaid lists. OIG advises verifying potential matches by SSN/EIN through its online search. Data: HHS Office of Inspector General, LEIE (public domain). Not affiliated with or endorsed by HHS-OIG.
Throughput: about 10–15 rows/s (~40–50k rows/hr) after the list loads, because every name is scanned against the full list. Default timeout 3600 s; split rosters over ~40k rows.

### More Actors by willed_nursery

- Healthcare credentialing pair: [OIG LEIE Screener](https://apify.com/willed_nursery/leie-exclusion-roster-screen) ↔ [NPI Roster Validator](https://apify.com/willed_nursery/npi-roster-validator) — validate the same roster's NPIs against NPPES.
- KYB/lead: [Maps Lead Enricher (Domain Contact Enricher)](https://apify.com/willed_nursery/domain-contact-enricher)
- IP docket: [USPTO Trademark Deadlines](https://apify.com/willed_nursery/trademark-portfolio-deadline-scorer)
- Financial risk: [SEC Health Score](https://apify.com/willed_nursery/sec-financial-health-score)

# Actor input Schema

## `roster` (type: `array`):

Rows of {first,last,middle?,dob?(YYYY-MM-DD|MM/DD/YYYY|YYYY),npi?,state?,business?,own_id?}. Provider/staff/vendor identifiers only — never patient data.

## `csvText` (type: `string`):

Optional CSV with header first,last,middle,dob,npi,state,business,own_id. Max 10 MB.

## `reviewThreshold` (type: `number`):

Name match score at or above this (and below hit) lands in review. Default 0.90.

## `hitThreshold` (type: `number`):

Score at or above this with exact DOB or exact NPI can be excluded. Default 0.95.

## `includeStreetAddress` (type: `boolean`):

If true, include LEIE street address and ZIP in candidate evidence (off by default for privacy).

## Actor input object example

```json
{
  "roster": [
    {
      "first": "James",
      "last": "Dove",
      "dob": "1961-04-02",
      "state": "TX",
      "own_id": "emp-1"
    },
    {
      "business": "Acme Home Health LLC",
      "npi": "1234567893",
      "own_id": "v-9"
    }
  ],
  "reviewThreshold": 0.9,
  "hitThreshold": 0.95,
  "includeStreetAddress": false
}
```

# 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 = {
    "roster": [
        {
            "first": "James",
            "last": "Dove",
            "dob": "1961-04-02",
            "state": "TX",
            "own_id": "emp-1"
        },
        {
            "business": "Acme Home Health LLC",
            "npi": "1234567893",
            "own_id": "v-9"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("willed_nursery/leie-exclusion-roster-screen").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 = { "roster": [
        {
            "first": "James",
            "last": "Dove",
            "dob": "1961-04-02",
            "state": "TX",
            "own_id": "emp-1",
        },
        {
            "business": "Acme Home Health LLC",
            "npi": "1234567893",
            "own_id": "v-9",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("willed_nursery/leie-exclusion-roster-screen").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 '{
  "roster": [
    {
      "first": "James",
      "last": "Dove",
      "dob": "1961-04-02",
      "state": "TX",
      "own_id": "emp-1"
    },
    {
      "business": "Acme Home Health LLC",
      "npi": "1234567893",
      "own_id": "v-9"
    }
  ]
}' |
apify call willed_nursery/leie-exclusion-roster-screen --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,willed_nursery/leie-exclusion-roster-screen"
        }
    }
}
```

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/Ylhm2RFKRlVEOm9xX/builds/NvkNU4DQsTl6ebpbS/openapi.json
