NPI Data Services logo NPI Registry API
Workflow Guide

Provider Credentialing Automation — NPI, PECOS & LEIE via API

Updated June 9, 2026 · VBC Risk Analytics

Provider credentialing requires collecting and verifying data from multiple sources: NPI status from NPPES, Medicare enrollment from PECOS, exclusion status from the OIG LEIE, state licensure, and more. Gathering this data manually for each provider is slow and error-prone. The NPI Registry API automates the NPI, PECOS, and LEIE components of credentialing — returning all three in a single REST call per provider, with defined monthly quotas for running against a full roster.

Manual credentialing vs. API automation

Before — manual (per provider)

① Open NPPES website · search NPI
② Copy taxonomy, address to spreadsheet
③ Open PECOS portal · search enrollment
④ Open OIG LEIE site · search exclusion list
⑤ Paste all results into spreadsheet

After — API (per provider)

① Call findbyNPIId with NPI
② Receive JSON: NPI + PECOS + LEIE
③ Auto-flag PASS / FLAGGED
✓ Credentialing check complete

ROI at scale

Roster sizeManual timeAPI timeTime saved
50 providers~50 minutes~5 seconds~50 minutes
500 providers~8 hours~1 minute~8 hours
5,000 providers~4 days~10 minutes~4 days
25,000 providersWeeks~1 hourWeeks

Assumes ~1 min per provider for manual lookup across 3 portals (NPPES + PECOS + OIG LEIE). API at 1 req/sec on Starter plan with 100ms sleep between requests.

What a complete credentialing verification covers

Credentialing standards (NCQA, URAC, Joint Commission) require primary source verification of specific data elements. Here is which elements the NPI Registry API can automate, and which require other sources:

Credentialing elementNPI Registry APIOther source required
NPI status (active/inactive) Yes — findbyNPIId confirms active status
Primary taxonomy / specialty Yes — taxonomy code and description returned
Practice address Yes — primary and mailing addresses
Medicare enrollment (PECOS) Yes — enrollment ID, PAC ID, provider type, in_pecos flag
OIG LEIE exclusion Yes — in_leie flag in every response SAM.gov, state Medicaid exclusion lists (separate)
State licensure No State medical board verification required
DEA registration No DEA database verification required
Malpractice claims history No NPDB query required

What a single API call returns per provider

One findbyNPIId call returns everything you need for the NPI, PECOS, and LEIE steps of credentialing:

curl -X GET   'https://restapi.npidataservices.com/api/v1/findbyNPIId?NPIId=1053500652'   -H 'ApiKey: YOUR_API_KEY'

// Response — credentialing fields highlighted:
{
  "npi": 1053500652,
  "status": "success",
  "entity_type_cd": "2",
  "organization": [{ "org_name": "LEVEL HOME HEALTH INC." }],
  "taxonomy": [{
    "taxonomy_code": "251E00000X",
    "taxonomy_desc": "Agencies: Home Health",   // ✓ specialty confirmed
    "prim_taxonomy_switch": "Y"
  }],
  "location": [{
    "addr_fl":      "260 S LOS ROBLES AVE STE 101",
    "addr_city":    "PASADENA",
    "addr_state":   "CA",
    "addr_post_cd": "911012869",
    "telephone":    "9492060691"
  }],
  "entity_type": [{
    "in_pecos":  "Y",                           // ✓ enrolled in Medicare
    "in_leie":   "N",                           // ✓ not on OIG exclusion list
    "enum_date": "2007-10-18"
  }],
  "medicare_enrlmt": [{
    "enrlmt_id":         "O20080407000727",      // ✓ enrollment ID
    "pac_id":            "4284711805",           // ✓ PAC ID
    "provider_type_dec": "PART A PROVIDER - HOME HEALTH AGENCY",
    "state_cd":          "CA"
  }]
}

Automated credentialing pipeline in Python

This example processes a provider roster and outputs a credentialing report with pass/fail status and flags for manual review:

import time, requests, csv

API_KEY  = "YOUR_API_KEY"
BASE_URL = "https://restapi.npidataservices.com/api/v1/findbyNPIId"

def credential_provider(npi):
    """Verify one provider's NPI, PECOS, and LEIE status."""
    r = requests.get(BASE_URL,
                     params={"NPIId": npi},
                     headers={"ApiKey": API_KEY},
                     timeout=5)
    if r.status_code == 404:
        return {"npi": npi, "status": "INVALID_NPI", "flags": ["NPI not found"]}

    r.raise_for_status()
    d = r.json()

    entity  = (d.get("entity_type") or [{}])[0]
    enrlmt  = (d.get("medicare_enrlmt") or [{}])[0]
    tax     = (d.get("taxonomy") or [{}])[0]

    flags = []
    if entity.get("in_leie") == "Y":
        flags.append("OIG LEIE EXCLUSION")
    if entity.get("in_pecos") != "Y":
        flags.append("Not PECOS enrolled")

    return {
        "npi":          npi,
        "status":       "FLAGGED" if flags else "PASS",
        "flags":        flags,
        "taxonomy":     tax.get("taxonomy_desc", ""),
        "in_pecos":     entity.get("in_pecos"),
        "in_leie":      entity.get("in_leie"),
        "enrlmt_id":    enrlmt.get("enrlmt_id", ""),
        "pac_id":       enrlmt.get("pac_id", ""),
        "provider_type": enrlmt.get("provider_type_dec", ""),
    }

# Process a roster
roster = ["1053500652", "1184713042", "1023374782"]
results = []
for npi in roster:
    result = credential_provider(npi)
    results.append(result)
    time.sleep(0.1)   # pace requests within your monthly quota

# Write credentialing report
with open("credentialing_report.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=results[0].keys())
    writer.writeheader()
    writer.writerows(results)

# Print flagged providers for review
flagged = [r for r in results if r["status"] == "FLAGGED"]
print(f"\n{len(flagged)} provider(s) flagged for review:")
for r in flagged:
    print(f"  NPI {r['npi']}: {', '.join(r['flags'])}")

What the output looks like

NPIStatusFlagsPECOSLEIETaxonomy
1053500652PASSYNHome Health Agency
1184713042PASSYNInternal Medicine
1023374782FLAGGEDNot PECOS enrolledNNHome Health

Providers flagged with "OIG LEIE EXCLUSION" require immediate action before any billing or engagement. Providers flagged with "Not PECOS enrolled" cannot bill Medicare and should be investigated if they are expected to be Medicare-enrolled.

Ongoing credentialing vs. initial credentialing

The NPI Registry API supports both:

Why not use the free NPPES API for credentialing?

The free NPPES API at npiregistry.cms.hhs.gov returns only raw NPPES fields — NPI, name, taxonomy, and address. It does not return:

To get all three from free government sources, you would need to separately query NPPES, download and query the PECOS enrollment dataset, and download and query the OIG LEIE file — maintaining and joining three separate data sources. The NPI Registry API returns all three in a single REST call, eliminating the integration complexity. See the full NPPES API vs NPI Registry API comparison.

Request quota planning for credentialing workloads

PlanMonthly requestsTypical credentialing fit
Free1,000 / monthPilot or small team testing the credentialing workflow
Starter ($490/yr)12,500 / monthMonthly LEIE screening for rosters up to 12,500 providers; initial credentialing for medium-sized groups
Pro ($1,490/yr)125,000 / monthLarge health systems, staffing platforms, or MCOs with monthly screening and frequent re-credentialing
EnterpriseCustomAny volume; dedicated SLA for compliance-critical workflows

Related guides

Automating provider credentialing?

The NPI Registry API returns NPI status, PECOS enrollment, and OIG LEIE exclusion in a single call per provider — no joining across government portals. Start a free trial to test the response format on your provider roster.

Explore the API & start a free trial →
Need credentialing and exclusion monitoring without an engineering team?

Provider Signals Risk gives credentialing and CVOs a dashboard for ongoing OIG exclusion screening and NPPES deactivation alerts across an existing provider roster — no API integration, no code, no data pipeline to maintain.

Explore Provider Signals for credentialing →

Frequently asked questions

What data does a credentialing API need to return per provider?
NPI status, primary taxonomy, practice address, Medicare PECOS enrollment status, and OIG LEIE exclusion status. The NPI Registry API returns all five in a single findbyNPIId call.

How often should credentialing data be re-verified?
NCQA/URAC standards require re-credentialing every 2–3 years. OIG recommends monthly LEIE screening. For directory accuracy, re-verify NPI data quarterly. All three cadences are supported on Starter and Pro plans.

Can I automate provider credentialing with an API?
Yes — NPI validation, PECOS enrollment, and LEIE screening can all be automated via the NPI Registry API. State licensure, DEA registration, and NPDB queries require separate primary source verification from those respective sources.

What is the difference between credentialing and privileging?
Credentialing verifies qualifications and enrollment — including NPI, PECOS, and LEIE data (automatable). Privileging grants specific clinical privileges at a facility based on those credentials (a human decision). The API automates the data-collection step of credentialing.

Written by Chin Ramamoorthi

CEO, NPI Data Services — a VBC Risk Analytics company — 20+ years in healthcare data, provider data management, and risk analytics.