← Docs

NPI Lookup API

A US provider, specialty, address, and registry status.

Look up a National Provider Identifier in the CMS NPPES registry. You get the checksum verdict and the record: provider name, individual or organization, credential, primary specialty with its NUCC taxonomy code, practice address, and phone. Junk or a failed checksum answers valid: false as a 200, never a 404. A checksum-valid number the registry does not know answers registered: false with record fields null.

active means the number is not deactivated. deep.deactivated_at is the date CMS published when it is. excluded checks the OIG LEIE exclusion list by NPI, and false is not clearance: LEIE rows without an NPI cannot be matched by number. An NPI is not proof of licensure. We serve the published NPPES dissemination file only. Provider directory data, not PHI.

?deep=true adds deep.deactivated_at, deep.medicare, deep.opt_out, and deep.enrollments on paid plans. medicare is the published FFS enrollment extract. opt_out is the affidavit list, matched by NPI only. false is not clearance. Neither flag is licensure.

Lookup

GET
api.parseapi.com/npi/{npi}
Provider, specialty, practice address, and flags from the registry
Explore
Parameters 3
npistring · path · required

The NPI as you have it. Spaces and punctuation fold out

langstring · query · optional

Display language as one BCP 47 tag, such as fr or zh-Hant. Changes supported display labels only; IDs, codes, native names, facts, parsing and deep access stay unchanged. Omit for the original response. Unsupported regions use the supported language base; unsupported languages or scripts use English. Missing labels retain their source value. Accept-Language is not read automatically. Available on the current API contract; frozen 1.0.0 is unchanged.

deepboolean · query · optional

Deactivation date and Medicare enrollment detail. Included on paid plans.

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.npi("1881018208");
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "npi": "1881018208",
  "valid": true,
  "registered": true,
  "active": true,
  "excluded": false,
  "type": "organization",
  "name": "Mayo Clinic",
  "first": null,
  "last": null,
  "credential": null,
  "specialty": "Multi-Specialty Clinic/Center",
  "taxonomy": "261QM1300X",
  "address": "200 1st St SW",
  "city": "Rochester",
  "state": "MN",
  "state_name": "Minnesota",
  "postal": "55905-0001",
  "country": "US",
  "phone": "+15072842511"
}

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.npi("1891058467");
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "npi": "1891058467",
  "valid": true,
  "registered": true,
  "active": true,
  "excluded": false,
  "type": "individual",
  "name": "Rasha Abdelsalam",
  "first": "Rasha",
  "last": "Abdelsalam",
  "credential": "MD",
  "specialty": "Family Medicine Physician",
  "taxonomy": "207Q00000X",
  "address": "2283 S Monaco Pkwy Ste 105",
  "city": "Denver",
  "state": "CO",
  "state_name": "Colorado",
  "postal": "80222",
  "country": "US",
  "phone": "+17205312370"
}

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.npi("1891-058-467");
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "npi": "1891058467",
  "valid": true,
  "registered": true,
  "active": true,
  "excluded": false,
  "type": "individual",
  "name": "Rasha Abdelsalam",
  "first": "Rasha",
  "last": "Abdelsalam",
  "credential": "MD",
  "specialty": "Family Medicine Physician",
  "taxonomy": "207Q00000X",
  "address": "2283 S Monaco Pkwy Ste 105",
  "city": "Denver",
  "state": "CO",
  "state_name": "Colorado",
  "postal": "80222",
  "country": "US",
  "phone": "+17205312370"
}

Run uses the free demo on API 2.0.0. Copied code uses your API key when signed in, or YOUR_API_KEY when signed out.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.npi("1234567890");
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "npi": "1234567890",
  "valid": false,
  "registered": null,
  "active": null,
  "excluded": null,
  "type": null,
  "name": null,
  "first": null,
  "last": null,
  "credential": null,
  "specialty": null,
  "taxonomy": null,
  "address": null,
  "city": null,
  "state": null,
  "state_name": null,
  "postal": null,
  "country": null,
  "phone": null
}

Deep examples run with your own key. Check this API’s included units and pricing before running.

import { parseAPI } from '@parseapi/sdk';

const parse = parseAPI("YOUR_API_KEY");
const result = await parse.npi("1881018208", { deep: true });
console.log(result);

Run on your server with a secret key. Calling from a browser or app?

Example response
{
  "npi": "1881018208",
  "valid": true,
  "registered": true,
  "active": true,
  "excluded": false,
  "type": "organization",
  "name": "Mayo Clinic",
  "first": null,
  "last": null,
  "credential": null,
  "specialty": "Multi-Specialty Clinic/Center",
  "taxonomy": "261QM1300X",
  "address": "200 1st St SW",
  "city": "Rochester",
  "state": "MN",
  "state_name": "Minnesota",
  "postal": "55905-0001",
  "country": "US",
  "phone": "+15072842511",
  "deep": {
    "medicare": true,
    "opt_out": false,
    "enrollments": [
      {
        "type": "part_b",
        "state": "MN",
        "specialty": "Clinic/Group Practice"
      }
    ],
    "deactivated_at": null
  }
}

Response fields

npi
The number as folded, digits only. Invalid input still echoes the fold
valid
10 digits and the Luhn check digit with the 80840 prefix holds
registered
The NPI exists in the NPPES registry. null when the number is invalid
active
Not deactivated. null when not registered
excluded
On the OIG LEIE exclusion list, matched by NPI only. false is not clearance: many LEIE rows carry no NPI. null when not registered
type
individual or organization
name
Provider name. Organizations ship the legal business name
first
First name. null for organizations
last
Last name. null for organizations
credential
Credential as the provider registered it (MD, DDS). null for organizations
specialty
Primary taxonomy display name from the NUCC code set
taxonomy
The primary NUCC taxonomy code
address
Practice location street line
city
Practice location city
state
Practice location state code
state_name
State display name
postal
Practice location postal code, ZIP+4 when NPPES has it
country
Practice location country, ISO 3166-1 alpha-2
phone
Practice location phone, E.164

Deep fields

deep.deactivated_at
Date CMS deactivated the NPI, YYYY-MM-DD. null when the number is still active or not registered
deep.medicare
In the published Medicare FFS enrollment extract. false is not a clearance. null when not registered or not yet stamped. Paid plans
deep.opt_out
On the CMS opt-out affidavit list, matched by NPI only. false is not clearance. Paid plans
deep.enrollments
Enrollment rows (type, specialty, state). Empty when medicare is false. null when unstamped or not registered. Paid plans

Display language

Pass lang with a language tag such as fr, pt-BR, or zh-Hant. Separately sourced state_name when available. Person names, provider names and addresses stay unchanged.

Omitting lang preserves the original response. Codes, IDs, numeric facts and native-name fields stay unchanged. Missing translations keep their existing source value; unknown values stay null. A preserved name_local may equal the translated name.

Send a chosen browser preference explicitly, for example { lang: navigator.language } in your JavaScript SDK options. The API does not read Accept-Language automatically. Unsupported regions fall back to their supported base language; unsupported languages or scripts use English. Empty, invalid or repeated tags return 400.

Content-Language identifies languages used in translated display fields and known English fallbacks. This option follows the current API contract. Requests selecting frozen 1.0.0 retain that contract. Select API 2.0.0 to use display language.

41 display language choices
Language tagLanguage
enAmerican English
zh-Hans简体中文
frfrançais (France)
deDeutsch
ititaliano
ja日本語
ko한국어
esespañol de España
arالعربية
bgбългарски
cacatalà
hrhrvatski
csčeština
dadansk
nlNederlands
fisuomi
elΕλληνικά
heעברית
hiहिन्दी
humagyar
idIndonesia
kkқазақ тілі
msMelayu
nbnorsk bokmål
plpolski
ptportuguês (Brasil)
roromână
ruрусский
skslovenčina
svsvenska
thไทย
trTürkçe
ukукраїнська
viTiếng Việt
zh-Hant繁體中文
en-AUAustralian English
en-GBBritish English
fr-CAfrançais canadien
es-419español latinoamericano
pt-PTportuguês europeu
zh-Hant-HK繁體中文(中國香港特別行政區)

Build with NPI

All tutorials →

Questions? Email