API Documentation
Base URL https://api.npiportal.com. The machine-readable spec lives at
/openapi.json (OpenAPI 3.1).
Authentication
Every /v1 request needs an API key, sent either as
Authorization: Bearer npk_… or x-api-key: npk_…. Keys are issued
per account — see plans & signup. Keys are stored hashed; treat yours
like a password.
Rate limits & quotas
Limits depend on your tier (Free 5/min · Starter 60/min · Pro 300/min · Business 1,000/min,
with monthly quotas of 1k/50k/500k/5M). Every response carries
x-ratelimit-limit, x-ratelimit-remaining,
x-ratelimit-reset, and x-quota-monthly-remaining headers.
Exceeding a limit returns 429 with an explanatory error body.
Errors
Errors return { "error": { "code", "message" } } with conventional HTTP
status codes: 400 bad input, 401 missing/invalid key,
404 not found, 422 checksum failure, 429 rate limited.
GET /v1/npi/{number}
Look up a single NPI. Returns the full normalized NPPES record: names, credential, taxonomies with license numbers, practice and mailing addresses, other identifiers (Medicaid, legacy Medicare), enumeration and deactivation dates. The `source` field tells you whether the record came from our indexed snapshot (kv/r2) or the live registry (nppes-live).
Request
curl https://api.npiportal.com/v1/npi/1234567893 \
-H "Authorization: Bearer npk_your_key" Response
{
"npi": "1234567893",
"source": "r2",
"record": {
"npi": "1234567893",
"entityType": 1,
"firstName": "JANE",
"lastName": "SMITH",
"credential": "MD",
"taxonomies": [
{ "code": "207Q00000X", "primary": true, "license": "036.123456", "licenseState": "IL" }
],
"practiceAddress": { "line1": "123 MAIN ST", "city": "CHICAGO", "state": "IL", "zip": "60601", "phone": "3125550100" },
"enumerationDate": "2007-05-23",
"lastUpdateDate": "2024-01-15",
"deactivationDate": null
}
} GET /v1/npi/search
Search providers. Query parameters: `q` (free text name or NPI), `first_name`, `last_name`, `organization`, `state`, `city`, `zip`, `taxonomy`, `entity_type` (1 or 2), `limit` (max 100), `offset`. At least one criterion is required. Returns slim result rows; follow up with the single-NPI endpoint for full records.
Request
curl "https://api.npiportal.com/v1/npi/search?last_name=smith&state=IL&limit=5" \
-H "x-api-key: npk_your_key" Response
{
"total": 1204,
"count": 5,
"offset": 0,
"source": "d1",
"results": [ { "npi": "1234567893", "name": "JANE SMITH", "entityType": 1, "state": "IL", "taxonomyCode": "207Q00000X" } ]
} POST /v1/npi/batch
Batch-verify up to 100 NPIs. Send `{"npis": ["…", …]}` (max 100). Each result reports `status`: `active`, `deactivated`, `not_found`, or `invalid` (checksum failure), plus name, primary taxonomy, and state. One batch call counts as 10 requests against your quota. Built for credentialing sweeps and claims scrubbing.
Request
curl -X POST https://api.npiportal.com/v1/npi/batch \
-H "Authorization: Bearer npk_your_key" \
-H "Content-Type: application/json" \
-d '{"npis": ["1234567893", "1679576722"]}' Response
{
"count": 2,
"results": [
{ "npi": "1234567893", "status": "active", "entityType": 1, "name": "JANE SMITH", "primaryTaxonomy": "207Q00000X", "state": "IL" },
{ "npi": "1679576722", "status": "active", "entityType": 2, "name": "EXAMPLE HOSPITAL", "primaryTaxonomy": "282N00000X", "state": "NY" }
]
} GET /v1/npi/validate/{number}
Checksum-validate an NPI. Pure ISO/Luhn check-digit validation (prefix 80840 + first 9 digits) — no registry lookup, so it cannot tell you whether the NPI was ever issued. Use it to reject malformed input before a lookup.
Request
curl https://api.npiportal.com/v1/npi/validate/1234567893 \
-H "x-api-key: npk_your_key" Response
{
"input": "1234567893",
"normalized": "1234567893",
"wellFormed": true,
"checksumValid": true,
"valid": true,
"reason": null
} GET /v1/taxonomy/{code}
Decode a taxonomy code. Returns the NUCC record for a 10-character taxonomy code: grouping, classification, specialization, plain-English definition, and the number of providers using it as their primary taxonomy in the latest snapshot.
Request
curl https://api.npiportal.com/v1/taxonomy/207Q00000X \
-H "x-api-key: npk_your_key" Response
{
"code": "207Q00000X",
"grouping": "Allopathic & Osteopathic Physicians",
"classification": "Family Medicine",
"specialization": null,
"displayName": "Family Medicine",
"specialtySlug": "family-medicine",
"providerCount": 118432
}