Documentation

API documentation

Bearer API key on every request. Monthly credits are shared across lookup, search, and bulk.Each successful GET with HTTP 200 uses one credit (including empty search results and each metered bulk found / not_found item).Lookup 404 (npi_not_found) also uses one credit; 502 upstream errors do not.See OpenAPI for full schemas and response headers.

No credit card on free tierOpenAPI specPostman collectionUS NPI Registry (NPPES) source dataNPI-1 and NPI-2
Quickstart

Three steps

Then use Try it for a no-key sample shape, or Copy snippets for curl and other runtimes.

2. Create a key

In API keys, create a key and copy the secret when it appears (shown once).

3. Call the API

Use your bearer token on GET /api/v1/npi/{npi}, GET /api/v1/providers/search, or POST /api/v1/npi/bulk for roster batches.

Try it

Preview a sample API response

Load a static JSON snapshot for NPI 1003000126 — no account and no API key. This is the same field layout as a real 200 OK from GET /api/v1/npi/{npi}, but values are illustrative only.

Sample response body
Same JSON shape as OpenAPI NpiLookupResponse. The spec lists only authenticated routes (GET /api/v1/npi/{npi}), not this demo URL.
Get free API key
Copy-ready requests
Smoke-test from any shell with your real key.
curl -sS -H "Authorization: Bearer YOUR_API_KEY" "https://healthproviderapi.com/api/v1/npi/1003000126"

# Directory search (NPPES-backed). Each HTTP 200 uses one monthly lookup credit for the whole page (including empty results).
curl -sS -H "Authorization: Bearer YOUR_API_KEY" "https://healthproviderapi.com/api/v1/providers/search?last_name=Smith&limit=10"
Contract

OpenAPI and downloads

Machine-readable spec and a ready-made Postman collection.

OpenAPI 3.1 (YAML)
Same contract as docs/openapi.yaml in the repo — use the deployment URLs below in production.
Postman collection
Import JSON v2.1 — includes single lookup, bulk lookup, and search requests.
Endpoints

Lookup, bulk, and search

No signup preview: Try it (static JSON shape only).

GET /api/v1/npi/{npi}
Path parameter: 10-digit NPI (trimmed). Responses may be cached.

Example URL: https://healthproviderapi.com/api/v1/npi/1003000126

curl -sS -H "Authorization: Bearer YOUR_API_KEY" "https://healthproviderapi.com/api/v1/npi/1003000126"
GET /api/v1/providers/search
Requires last_name and/or organization_name. Not cached in v1. Optional enrichment query parameter on Growth+ plans.

Example URL: https://healthproviderapi.com/api/v1/providers/search?last_name=Smith&limit=10

curl -sS -H "Authorization: Bearer YOUR_API_KEY" "https://healthproviderapi.com/api/v1/providers/search?last_name=Smith&limit=10"
POST /api/v1/npi/bulk
Request body uses npis (1-50 items). One batch returns mixed per-item statuses: found, not_found, upstream_error, and quota_exceeded.
curl -sS \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"npis":["1003000126","1932100864","1851789159"]}' \
  "https://healthproviderapi.com/api/v1/npi/bulk"
Bulk roster

Bulk roster enrichment

Refresh CSV rosters without a dashboard upload. Workflow overview: bulk enrichment solution page.

Request with 3–5 NPIs

Send npis as a JSON array (1–50 strings). Each element is looked up independently; the HTTP response is always 200 when the batch is accepted (per-item errors appear inside data[]).

curl -sS \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"npis":["1003000126","1932100864","1851789159","1234567893","1467560003"]}' \
  "https://healthproviderapi.com/api/v1/npi/bulk"

Mixed found / not_found response

Each row includes status (found, not_found, upstream_error, or quota_exceeded). Found rows include the same ProviderData object as single lookup.

{
  "data": [
    {
      "npi": "1003000126",
      "status": "found",
      "provider": { "npi": "1003000126", "entityType": "NPI-1" },
      "cached": true,
      "requestId": "req_bulk01_00",
      "error": null
    },
    {
      "npi": "1932100864",
      "status": "not_found",
      "provider": null,
      "cached": false,
      "requestId": "req_bulk01_01",
      "error": null
    },
    {
      "npi": "1851789159",
      "status": "upstream_error",
      "provider": null,
      "cached": false,
      "requestId": "req_bulk01_02",
      "error": {
        "code": "upstream_unavailable",
        "message": "The upstream provider registry is temporarily unavailable."
      }
    }
  ],
  "meta": {
    "requestId": "req_bulk01",
    "counts": {
      "requested": 3,
      "found": 1,
      "notFound": 1,
      "upstreamErrors": 1,
      "quotaExceeded": 0,
      "cacheHits": 1
    }
  }
}

Quota metering (per item)

Each found and each not_found item consumes one monthly credit from your shared pool (same as lookup 200/404). upstream_error rows do not bill. If the batch would exceed remaining quota, later items may return quota_exceeded without calling upstream. See meta.counts in the response.

CSV → JSON preparation

Export a single column of ten-digit NPIs from your spreadsheet (no hyphens). In a script or spreadsheet formula, build the request body:

{
  "npis": [
    "1003000126",
    "1932100864",
    "1851789159"
  ]
}

Tip: strip whitespace and validate length locally before POSTing. For large rosters, chunk into batches of 50 and pace requests to stay within burst rate limits.

Enrichment on bulk

enrichment=quality_freshness is available on single lookup and provider search (Growth+ plans). It is not supported on POST /api/v1/npi/bulk today—run enrichment on individual lookups when you need freshness or completeness signals for specific rows.

Enrichment

Data quality and freshness signals

Available on Growth and Pro plans. Adds derived enrichment to each provider record.

Request format

Pass enrichment as a query parameter on search, or as a query parameter or HTTP header on single lookup (Growth and Pro plans). Bulk lookup does not accept enrichment—use single lookup for enriched rows. Factors: completeness, quality_score, freshness, or the preset quality_freshness (all three). Combine search factors with commas, e.g. enrichment=completeness,freshness.

Provider search

GET /api/v1/providers/search?last_name=Smith&enrichment=quality_freshness
Authorization: Bearer YOUR_KEY

Single lookup (query or header)

GET /api/v1/npi/1003000126?enrichment=quality_score
Authorization: Bearer YOUR_KEY

curl -sS \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "enrichment: quality_score" \
  "https://healthproviderapi.com/api/v1/npi/1003000126"

Credit cost

Each enrichment request costs 2 credits total, regardless of how many factors you request. Non-enriched requests cost 1 credit as before.

Response fields

When enrichment is applied, each provider includes an enrichment object with dataQuality.score (0-100), dataQuality.completeness.* flags, and freshness.* fields. The meta.enrichment request-level object shows applied factors and credit cost.

Not a verification

Enrichment signals are derived from NPPES data only and are not legal or clinical verification. Use enrichment to rank/filter providers, not to make compliance determinations.

Examples

Example JSON bodies (HTTP 200)

Lookup returns one ProviderData in data; search returns an array plus meta.pagination. Sample NPI 1003000126 — illustrative fields only.

Lookup response
GET /api/v1/npi/{npi}meta.cached tracks cache (see X-Cache-Status).
{
  "data": {
    "npi": "1003000126",
    "entityType": "NPI-1",
    "status": "active",
    "name": {
      "full": "JOHN SMITH, M.D.",
      "first": "JOHN",
      "middle": null,
      "last": "SMITH",
      "prefix": null,
      "credential": "M.D."
    },
    "primaryTaxonomy": {
      "code": "208M00000X",
      "description": "Hospitalist",
      "state": "DC",
      "license": "MD600003480"
    },
    "taxonomies": [
      {
        "code": "208M00000X",
        "description": "Hospitalist",
        "state": "DC",
        "license": "MD600003480"
      }
    ],
    "mailingAddress": {
      "street": "123 EXAMPLE MEDICAL PLZ",
      "city": "WASHINGTON",
      "state": "DC",
      "zip": "20001",
      "country": "US"
    },
    "practiceLocations": [
      {
        "street": "456 CLINIC AVE",
        "city": "ARLINGTON",
        "state": "VA",
        "zip": "22201",
        "country": "US"
      }
    ],
    "enumerationDate": "2007-08-31",
    "lastUpdated": "2026-05-01",
    "source": {
      "name": "NPPES",
      "version": "2.1"
    }
  },
  "meta": {
    "requestId": "req_public_demo",
    "cached": true
  }
}
Search response
GET /api/v1/providers/search — same provider objects in data[].
{
  "data": [
    {
      "npi": "1003000126",
      "entityType": "NPI-1",
      "status": "active",
      "name": {
        "full": "JOHN SMITH, M.D.",
        "first": "JOHN",
        "middle": null,
        "last": "SMITH",
        "prefix": null,
        "credential": "M.D."
      },
      "primaryTaxonomy": {
        "code": "208M00000X",
        "description": "Hospitalist",
        "state": "DC",
        "license": "MD600003480"
      },
      "taxonomies": [
        {
          "code": "208M00000X",
          "description": "Hospitalist",
          "state": "DC",
          "license": "MD600003480"
        }
      ],
      "mailingAddress": {
        "street": "123 EXAMPLE MEDICAL PLZ",
        "city": "WASHINGTON",
        "state": "DC",
        "zip": "20001",
        "country": "US"
      },
      "practiceLocations": [
        {
          "street": "456 CLINIC AVE",
          "city": "ARLINGTON",
          "state": "VA",
          "zip": "22201",
          "country": "US"
        }
      ],
      "enumerationDate": "2007-08-31",
      "lastUpdated": "2026-05-01",
      "source": {
        "name": "NPPES",
        "version": "2.1"
      }
    }
  ],
  "meta": {
    "requestId": "req_search_demo",
    "pagination": {
      "limit": 10,
      "skip": 0,
      "returned": 1,
      "hasMore": false
    }
  }
}
Errors

HTTP status and error codes

JSON shape { error, meta }. Details: OpenAPI ErrorResponse.

  • 400invalid_npi or invalid_search_params or invalid_enrichment_params
  • 401invalid_api_key
  • 403subscription_inactive or quota_exceeded or enrichment_not_available_on_plan
  • 404npi_not_found
  • 429rate_limited
  • 500internal_error
  • 502upstream_unavailable

Quota and plans

Monthly credits and API key limits depend on your plan.

Pricing