# FDA Clinical Investigator Disqualification & Debarment Check (`malekh/fda-clinical-investigator-disqualification-check`) Actor

Bulk-screen investigators, sub-investigators and study staff against the FDA Clinical Investigators Disqualification Proceedings list and the FDA Debarment List. Returns FDA's verbatim status and whether the person is barred RIGHT NOW — 74 of 232 entries are listed but not disqualified.

- **URL**: https://apify.com/malekh/fda-clinical-investigator-disqualification-check.md
- **Developed by:** [Malek H](https://apify.com/malekh) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 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/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

## FDA Clinical Investigator Disqualification & Debarment Check

Bulk-screen clinical investigators, sub-investigators and study staff against
the two FDA registers you have to clear before putting someone on a trial or
naming them in a drug application:

1. **Clinical Investigators — Disqualification Proceedings** (21 CFR 312.70) —
   232 entries
2. **FDA Debarment List, drug product applications** (21 U.S.C. 335a) — 149
   named individuals, 0 firms at present

Give it a list of names. It returns, for each one, FDA's **verbatim status** and
a plain answer to the only question that matters: **is this person barred right
now?**

***

### What this does that a name-match does not

**Being on the FDA disqualification register does not mean you are
disqualified.** Measured against the live register on 2026-07-30:

| FDA status | Entries | Barred right now? |
|---|---:|---|
| Disqualified | 144 | **Yes** |
| Totally Restricted | 14 | **Yes** |
| Restricted | 23 | Only under FDA's conditions |
| Restrictions Removed | 27 | **No — cleared** |
| Not Disqualified | 8 | **No — cleared** |
| Reinstated | 7 | **No — cleared** |
| Adequate Assurances (and variants) | 9 | **No — cleared** |

**74 of 232 entries — just under a third — are listed but not disqualified.**
The register exists to record proceedings, including the ones FDA closed in the
investigator's favour or later lifted. Any tool that answers "found on the FDA
disqualification list" is wrong for all 74, in the direction that costs a real
investigator a contract.

This Actor returns `currently_barred` as `barred`, `restricted`, `not_barred` or
`unclear`, always alongside the exact FDA status string it came from, so you can
see the reasoning rather than trust it.

### What it does not cover — read this before you rely on a clear result

It checks **these two FDA registers only**. It does **not** check HHS-OIG LEIE,
GSA SAM exclusions, state Medicaid exclusion lists, DEA actions, or state
medical boards. FDA debarment for *device* applications is a separate list and
is not included either.

**A `NO_MATCH` means "not on these two FDA registers" — not "cleared
generally."** Every output item repeats this in a `coverage_note` field so a row
can never be read as broader than it is.

### Input

```json
{
  "names": [
    "Jane Q. Doe",
    "Roe, John A.",
    { "name": "Alex Smith", "recordId": "emp-4417" }
  ],
  "maxNames": 100
}
```

Either name order works — `First M. Last` or `Last, First M.` Degrees and
generational suffixes (`MD`, `DO`, `PhD`, `DVM`, `Jr`, `III`) are ignored, and
accents and hyphens are normalised, so `Anzures-Camarena, María` and
`Maria Anzures Camarena` reach the same entry. Pass objects with a `recordId` to
join the output straight back onto your own roster; it is echoed on every row,
including errors.

### Output

One row per name.

```json
{
  "input_name": "Jane Q. Doe",
  "recordId": null,
  "status": "ok",
  "result": "LISTED_BUT_NOT_BARRED",
  "match_count": 1,
  "matches": [
    {
      "register": "clinical-investigator-disqualification",
      "name": "Doe, Jane Q., MD",
      "center": "CDER",
      "status": "Restrictions Removed",
      "date_of_status": "06/23/1986",
      "date_nidpoe_issued": "08/06/1980",
      "date_nooh_issued": "11/12/1981",
      "match_confidence": "exact",
      "currently_barred": "not_barred",
      "what_this_means": "Restrictions were lifted; eligible."
    }
  ],
  "same_surname_not_matched": [],
  "same_surname_not_matched_count": 0
}
```

`result` is one of `BARRED`, `RESTRICTED`, `REVIEW`, `LISTED_BUT_NOT_BARRED`,
`NO_MATCH`, and `status` is `ok` or `error`.

**Namesakes.** A surname on its own is never treated as a match. Entries sharing
the surname but not the given name are returned separately in
`same_surname_not_matched` so a screener can eyeball them instead of never
seeing them. `match_confidence` is `exact` when the given name matches in full
and `initial` when only an initial was available on one side.

### Why you can trust a clear result

Both sources are HTML pages, so the real risk is not an outage — it is the page
quietly changing shape and the Actor confidently reporting an empty register.
Four guards run **before** anything is charged:

1. The disqualification page **states its own record count**
   (`No. of Records Found: 232`). The parsed row count must equal it exactly.
2. Both tables must present their expected column headers verbatim.
3. Both registers must clear a floor row count.
4. A name whose surname cannot be read is returned as `status: "error"` with
   the guidance *treat it as UNCHECKED, not as clear* — and is not billed.

If any guard trips, the run **fails loudly and costs you nothing**, rather than
returning a confident all-clear.

### Pricing

- **$0.05 per run** — charged once, after both registers download and pass their
  integrity checks. A failed or unreachable source is not charged.
- **$0.25 per name screened** — charged only for names actually answered.

Background-screening vendors sell a healthcare-sanctions check at **$12.50 per
name**, and the published coverage lists in that market routinely include the
FDA Debarment List while omitting the disqualification register entirely. 200
investigators a month costs $50 here.

### Source and licence

U.S. Food and Drug Administration public registers, retrieved live on every run:

- `accessdata.fda.gov/scripts/SDA/sdNavigation.cfm?sd=clinicalinvestigatorsdisqualificationproceedings`
- `fda.gov/inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/fda-debarment-list-drug-product-applications`

U.S. federal government works, public domain under 17 U.S.C. §105. No API key,
no account, no CAPTCHA; `robots.txt` permits both paths.

This Actor reports what the registers say. It is not legal advice, and it is not
a substitute for the debarment certification required by 21 U.S.C. 335a(k)(1).

# Actor input Schema

## `names` (type: `array`):

The people to check — investigators, sub-investigators, study coordinators, or anyone named in a drug application. Either order works: "Jane Q. Doe" or "Doe, Jane Q.". Degrees and generational suffixes (MD, DO, PhD, DVM, Jr, III) are ignored, accents and hyphens are normalised. To join results back onto your own list, pass objects instead of strings: {"name": "Jane Q. Doe", "recordId": "emp-4417"} — recordId is echoed onto every output row, including errors. A surname alone is never treated as a match; same-surname entries are returned separately for review.

## `maxNames` (type: `integer`):

Safety cap on the per-name charge. Names beyond this limit are not screened and not billed. Raise it deliberately for a large roster.

## Actor input object example

```json
{
  "names": [
    "Michael A. Arata",
    "Nayab Ali",
    {
      "name": "Gina Acosta",
      "recordId": "emp-4417"
    }
  ],
  "maxNames": 100
}
```

# 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 = {
    "names": [
        "Michael A. Arata",
        "Nayab Ali",
        {
            "name": "Gina Acosta",
            "recordId": "emp-4417"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/fda-clinical-investigator-disqualification-check").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 = { "names": [
        "Michael A. Arata",
        "Nayab Ali",
        {
            "name": "Gina Acosta",
            "recordId": "emp-4417",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/fda-clinical-investigator-disqualification-check").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 '{
  "names": [
    "Michael A. Arata",
    "Nayab Ali",
    {
      "name": "Gina Acosta",
      "recordId": "emp-4417"
    }
  ]
}' |
apify call malekh/fda-clinical-investigator-disqualification-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,malekh/fda-clinical-investigator-disqualification-check"
        }
    }
}

```

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/GggsA52RtPghbKVEw/builds/wEFF4IidDyj1VmUgs/openapi.json
