SFOLN

Catalogue / Company & lead intelligence

NPI Lookup & OIG Exclusion Check

sfoln/npi-lookup · Lead generation, Developer tools, Automation On request

Look up US healthcare providers in the NPPES NPI Registry by NPI number or by name, state and specialty: provider type, names, credentials, taxonomies, practice and mailing addresses, phone and dates, plus optional HHS-OIG LEIE exclusion screening. $2 per 1,000 provider records.

About

What it does

NPI Lookup & OIG Exclusion Check verifies US healthcare providers against the official NPPES NPI Registry: send NPI numbers, or search by name, organization, state, city, ZIP code or specialty, and get one clean record per provider with the provider type, names, credential, primary and other taxonomies (specialties and license numbers), practice and mailing addresses, phone, enumeration and last-update dates, other names and identifiers. Switch on exclusion screening to check every provider against the HHS-OIG List of Excluded Individuals/Entities (LEIE): an NPI listed there is excluded, the same name in the provider's state is a potential_match to review. Built for credentialing, payer and pharmacy compliance, healthcare lead generation and data teams. $2 per 1,000 provider records, plus $2 per 1,000 screenings; unknown NPIs and failed lookups are free.

Price

Price per delivered record

EventPricePer 1,000Charged for
Provider record
provider-record
$0.002$2 / 1,000Charged once per provider delivered: an NPI found in the NPPES NPI Registry, or each provider a search returns. Unknown NPIs, empty searches, invalid input and errors are free.
Exclusion screening
exclusion-screening
$0.002$2 / 1,000Optional add-on (screenExclusions): charged once per provider checked against the HHS-OIG LEIE exclusion list, whatever the result (excluded, potential_match or no_match). Not charged when the list could not be loaded.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~npi-lookup/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"npis":["1134262819"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/npi-lookup"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~npi-lookup/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Look up NPI 1134262819 in the NPPES registry and check whether the provider is on the HHS-OIG exclusion list.

Input

Input fields

NPI numbers to look up and/or NPPES searches by name, state, city, ZIP or specialty. Each NPI produces one record; each search produces one record per provider found plus a summary record.

FieldTypeDefaultMeaning
npisarray—NPI numbers
10-digit National Provider Identifiers, one per line (invalid check digits are rejected before any lookup and not charged). Accounts on the Apify free plan can process up to 10 NPIs or searches per run.
searchesarray—Searches
NPPES searches, each an object with any of firstName, lastName, organizationName, state (2-letter code), city, postalCode, taxonomy (specialty description, e.g. "Family Medicine") and enumerationType (individual or organization). A name, city, postal code or taxonomy is required; state and provider type only narrow it. A trailing * matches a prefix ("smi*", at least two characters). Example: [{"lastName": "smith", "state": "VT", "taxonomy": "Family Medicine"}]
maxResultsPerSearchinteger10Max providers per search
How many providers each search may return (each one is a charged provider record). NPPES returns at most 1,200 results per search; free-plan accounts get up to 20. Range 1–1200.
screenExclusionsbooleanfalseScreen against the OIG exclusion list (+$0.002 per provider)
Check every provider against the HHS-OIG List of Excluded Individuals/Entities (LEIE): an NPI match is reported as excluded, a same-name match in the provider's state as potential_match. Charged as the exclusion-screening event per screened provider.
maxItemsinteger1000Max NPIs and searches
Safety cap on how many NPIs and searches are processed in this run; the rest are ignored and reported as inputItemsDropped in the OUTPUT record. Range 1–10000.
concurrencyinteger4Concurrency
How many NPIs or searches are processed in parallel (the NPPES API is also rate-limited to 5 requests per second per run). Range 1–10.
includeRawbooleanfalseInclude raw NPPES record
Attach the unmodified NPPES registry record to each provider record under raw (larger output).
Example input
{
  "npis": [
    "1134262819"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The NPI or the search object exactly as sent.
recordTypestringRecord type
provider (a provider record) | summary (one per search: counts and why it stopped).
positionintegerPosition
Search rows only: 1-based position of the provider within its search.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred its pay-per-event charge (provider-record; add-on charges are listed in chargedAddOns).
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged): provider-record.
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
chargedAddOnsarrayCharged add-ons
Add-on events charged for this record besides chargedEvent (present only then): exclusion-screening.
sourcestringSource
Upstream data source: nppes-npi-registry (screening: HHS-OIG LEIE).
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ code, message, provider?, status? } when status is not ok. Codes: not_found (unknown NPI, or a search without results), invalid_input, client (NPPES refused the search); set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream: http_error (with the HTTP status), network, tls_error, timeout, invalid_json, unexpected_type, too_large, invalid_response.
warningsarrayWarnings
Notes about this record: a screening that was not charged or not available, a search capped by NPPES, the free plan or the budget.
npistring | nullNPI
10-digit National Provider Identifier.
enumerationTypestring | nullEnumeration type
NPI-1 (individual) or NPI-2 (organization).
providerTypestring | nullProvider type
individual | organization.
npiStatusstring | nullNPI status
active (the registry lists active NPIs).
namestring | nullName
Organization name, or "FIRST MIDDLE LAST SUFFIX" for an individual.
firstNamestring | nullFirst name
Individual providers.
middleNamestring | nullMiddle name
Individual providers.
lastNamestring | nullLast name
Individual providers.
namePrefixstring | nullName prefix
e.g. Dr.
nameSuffixstring | nullName suffix
e.g. Jr.
credentialstring | nullCredential
e.g. MD, RN, DDS (as the provider entered it).
sexstring | nullSex
F or M (individual providers).
soleProprietorboolean | nullSole proprietor
Individual providers.
organizationNamestring | nullOrganization name
Legal business name (organizations).
organizationalSubpartboolean | nullSubpart
The organization is a subpart of a parent organization.
parentOrganizationNamestring | nullParent organization
Parent legal business name (subparts).
parentOrganizationEinstring | nullParent EIN
Parent organization EIN, when published.
authorizedOfficialobject | nullAuthorized official
Organizations: { firstName, middleName, lastName, namePrefix, nameSuffix, credential, title, phone }.
primaryTaxonomyobject | nullPrimary taxonomy
{ code, description, license, state, primary, group }: the provider's primary specialty (Health Care Provider Taxonomy code).
taxonomiesarrayTaxonomies
Every taxonomy { code, description, license, state, primary, group }.
practiceAddressobject | nullPractice address
{ line1, line2, city, state, postalCode, countryCode, countryName, phone, fax } of the primary practice location.
mailingAddressobject | nullMailing address
Same shape as practiceAddress.
otherPracticeLocationsarrayOther practice locations
Secondary practice locations (same shape as practiceAddress).
phonestring | nullPhone
Practice location phone (else the mailing address phone).
faxstring | nullFax
Practice location fax (else the mailing address fax).
enumerationDatestring | nullEnumeration date
When the NPI was issued (YYYY-MM-DD).
lastUpdatedstring | nullLast updated
Last update of the registry record (YYYY-MM-DD).
certificationDatestring | nullCertification date
Last certification of the record by the provider (YYYY-MM-DD), when present.
otherNamesarrayOther names
{ type, name, organizationName, firstName, middleName, lastName, credential }: former names, doing-business-as names.
identifiersarrayOther identifiers
{ identifier, description, issuer, state }: Medicaid and other payer identifiers.
endpointsarrayEndpoints
{ type, typeDescription, endpoint, use, affiliationName }: Direct messaging addresses and other health information exchange endpoints.
registryUrlstring | nullRegistry URL
The provider's page on npiregistry.cms.hhs.gov.
exclusionScreeningobject | nullExclusion screening
Only with screenExclusions: { result (excluded | potential_match | no_match), matches: [{ matchedOn, name, lastName, firstName, middleName, businessName, general, specialty, npi, city, state, zip, exclusionType, exclusionTypeDescription, exclusionDate, waiverDate, waiverState }], list, listUpdated, listRecords, listStale? }; null when the screening was not delivered (see warnings).
searchobjectSearch
Summary records: the search as sent to NPPES (firstName, lastName, organizationName, state, city, postalCode, taxonomy, enumerationType).
screenedbooleanScreened
Summary records: whether the search's providers were screened.
resultsDeliveredintegerProviders delivered
Summary records: provider records delivered (and charged) for the search.
stopReasonstringStop reason
Summary records: limit | end | free_plan | budget | aborted | deadline | empty_pages | max_pages | error.
rawobjectRaw
Only with includeRaw: the unmodified NPPES registry record.
Example record
Example record
[
  {
    "input": "1134262819",
    "recordType": "provider",
    "status": "ok",
    "charged": true,
    "chargedEvent": "provider-record",
    "chargedAddOns": [
      "exclusion-screening"
    ],
    "source": "nppes-npi-registry",
    "fetchedAt": "2026-10-14T22:39:43.512Z",
    "npi": "1134262819",
    "enumerationType": "NPI-2",
    "providerType": "organization",
    "npiStatus": "active",
    "name": "MASSACHUSETTS GENERAL HOSPITAL",
    "firstName": null,
    "middleName": null,
    "lastName": null,
    "namePrefix": null,
    "nameSuffix": null,
    "credential": null,
    "sex": null,
    "soleProprietor": null,
    "organizationName": "MASSACHUSETTS GENERAL HOSPITAL",
    "organizationalSubpart": false,
    "parentOrganizationName": null,
    "parentOrganizationEin": null,
    "authorizedOfficial": {
      "firstName": "JANE",
      "middleName": "Q",
      "lastName": "DOE",
      "namePrefix": "Ms.",
      "nameSuffix": null,
      "credential": "RN",
      "title": "Research Nurse",
      "phone": "6175550100"
    },
    "primaryTaxonomy": {
      "code": "282N00000X",
      "description": "General Acute Care Hospital",
      "license": "99562",
      "state": "MA",
      "primary": true,
      "group": null
    },
    "taxonomies": [
      {
        "code": "282N00000X",
        "description": "General Acute Care Hospital",
        "license": "99562",
        "state": "MA",
        "primary": true,
        "group": null
      }
    ],
    "practiceAddress": {
      "line1": "55 FRUIT ST",
      "line2": "YAWKEY CENTER-8TH FLOOR",
      "city": "BOSTON",
      "state": "MA",
      "postalCode": "02114-2621",
      "countryCode": "US",
      "countryName": "United States",
      "phone": "617-726-0575",
      "fax": "617-724-2840"
    },
    "mailingAddress": {
      "line1": "55 FRUIT ST",
      "line2": "YAWKEY CENTER-8TH FLOOR",
      "city": "BOSTON",
      "state": "MA",
      "postalCode": "02114-2621",
      "countryCode": "US",
      "countryName": "United States",
      "phone": "617-726-0575",
      "fax": "617-724-2840"
    },
    "otherPracticeLocations": [],
    "phone": "617-726-0575",
    "fax": "617-724-2840",
    "enumerationDate": "2007-02-14",
    "lastUpdated": "2020-08-22",
    "certificationDate": null,
    "otherNames": [],
    "identifiers": [],
    "endpoints": [],
    "registryUrl": "https://npiregistry.cms.hhs.gov/provider-view/1134262819",
    "exclusionScreening": {
      "result": "no_match",
      "matches": [],
      "list": "HHS-OIG LEIE",
      "listUpdated": "2026-10-09",
      "listRecords": 84093
    }
  },
  {
    "input": {
      "lastName": "smith",
      "state": "VT",
      "taxonomy": "Family Medicine"
    },
    "recordType": "summary",
    "status": "ok",
    "charged": false,
    "source": "nppes-npi-registry",
    "fetchedAt": "2026-10-14T22:39:44.020Z",
    "search": {
      "lastName": "smith",
      "state": "VT",
      "taxonomy": "Family Medicine"
    },
    "screened": true,
    "resultsDelivered": 4,
    "stopReason": "end"
  }
]

FAQ

Questions

What does the exclusion screening check?
The HHS-OIG List of Excluded Individuals/Entities (LEIE), the list of providers excluded from Medicare, Medicaid and other federal health care programs. A record carrying the provider's NPI is reported as excluded; a record with the same name (and middle initial, when both have one) in the provider's practice or mailing state is reported as potential_match, which needs a manual check because names are not unique. SAM.gov exclusions are not included.
How current are the registry and the exclusion list?
NPPES records are read live from the NPI Registry API. OIG updates the LEIE monthly; the Actor downloads it at most once a day and reports the list date as listUpdated in every screening.
How many providers can one search return?
Up to maxResultsPerSearch (default 10). NPPES itself returns at most 1,200 results per search (200 per page, skipping at most 1,000), so split broad searches by city, postal code or taxonomy.
Why is an NPI not found?
The NPI is not in the NPI Registry: it was never issued, or it was deactivated and is no longer listed. Such records are not_found and are not charged. A wrong check digit is rejected before any lookup (skipped_invalid, not charged).

Machine-readable

This page for agents