# Provider profile

`GET https://api.inplan.io/v1/providers/{npi}`

Who the provider is, from national provider registry records: name and credential, specialties, practice locations, groups and facility affiliations. `plan_summary` counts the plans that list the provider.

Free plan and up · 1 call. Source: https://inplan.io/docs/api/providers

## When to use it

Use it to show a provider before you check plans, or to see in one call how many marketplace and Medicare Advantage plans list them. To list those plans, call [`GET /v1/providers/{npi}/plans`](https://inplan.io/docs/api/provider-plans).

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `npi` | path | string | Required | The provider's 10-digit National Provider Identifier. We validate the check digit. Example: `1184617268`. |

## Request

curl:

```bash
curl https://api.inplan.io/v1/providers/1184617268 \
  -H "Authorization: Bearer $INPLAN_KEY"
```

JavaScript:

```javascript
const res = await fetch("https://api.inplan.io/v1/providers/1184617268", {
  headers: { Authorization: `Bearer ${process.env.INPLAN_KEY}` },
});
const body = await res.json();
console.log(body.data.name.display, body.data.plan_summary);
```

Python:

```python
import os, requests

res = requests.get(
    "https://api.inplan.io/v1/providers/1184617268",
    headers={"Authorization": f"Bearer {os.environ['INPLAN_KEY']}"},
    timeout=10,
)
body = res.json()
print(body["data"]["name"]["display"], body["data"]["plan_summary"])
```

## Response fields

Every response has the envelope `request_id`, `data_as_of`, `data`, `sources` and `notes`. Fields of `data`:

| Field | Type | Description |
| --- | --- | --- |
| `npi` | string | The NPI you asked for. |
| `profile_found` | boolean | `true` when we hold identity details for this NPI. When `false`, only `npi`, `plan_summary` and `links` are present. |
| `name` | object | The name as published, with a display form. |
| `name.first` | string | First name. |
| `name.middle` | string | Middle name. |
| `name.last` | string | Last name. |
| `name.suffix` | string \| null | Suffix, for example Jr. |
| `name.display` | string | Name and credential ready to show, for example "Michael B. Williard, MD". We never add titles. |
| `credential` | string | The credential as published, for example MD, DO, NP or PA. |
| `gender` | string | `male`, `female`, or `null` when not published. |
| `status` | string | `active` or `deactivated` in the national provider registry. |
| `specialties` | object[] | Specialties, primary first. |
| `specialties[].name` | string | The specialty name. |
| `specialties[].primary` | boolean | `true` for the primary specialty. |
| `education` | object | Training details, or `null` when not published. |
| `education.medical_school` | string | The school named in the registry. |
| `education.graduation_year` | integer | The graduation year. |
| `locations` | object[] | Practice locations. |
| `locations[].address_line_1` | string | Street address. `null` when the provider asked us to hide contact details. |
| `locations[].address_line_2` | string \| null | Suite or second address line. |
| `locations[].city` | string | City. |
| `locations[].state` | string | 2-letter state code. |
| `locations[].zip` | string | 5-digit ZIP code. |
| `locations[].phone` | string \| null | Phone number, digits only. `null` when not published or hidden at the provider's request. |
| `locations[].latitude` | number \| null | Latitude of the location, when known. |
| `locations[].longitude` | number \| null | Longitude of the location, when known. |
| `locations[].group` | object | The group practice at this location, or `null`. |
| `locations[].group.name` | string | The group name. |
| `locations[].group.pac_id` | string | The group identifier in the national registry. |
| `locations[].telehealth` | boolean \| null | `true` when the registry marks telehealth at this location, else `null`. |
| `groups` | object[] | Group practices the provider belongs to. |
| `groups[].name` | string | The group name. |
| `groups[].pac_id` | string | The group identifier in the national registry. |
| `groups[].members` | integer | Number of providers in the group. |
| `affiliations` | object[] | Facilities the provider is affiliated with. |
| `affiliations[].facility_type` | string | For example Hospital or Home health agency. |
| `affiliations[].ccn` | string | The facility's 6-character certification number. |
| `affiliations[].name` | string \| null | Facility name, when we hold it. |
| `affiliations[].city` | string \| null | Facility city. |
| `affiliations[].state` | string \| null | Facility state. |
| `privacy` | object | Privacy settings for this record. |
| `privacy.contact_masked` | boolean | `true` when the provider asked us to hide street address and phone. Those fields are then `null`. |
| `plan_summary` | object | Counts of the plans that list this provider. Get the plans from `links.plans`. |
| `plan_summary.aca` | object | Marketplace plans. |
| `plan_summary.aca.plans` | integer | Plan and plan-year pairs that list the provider. |
| `plan_summary.aca.issuers` | integer | Insurers among those plans. |
| `plan_summary.aca.states` | string[] | States of those plans. |
| `plan_summary.aca.plan_years` | integer[] | Plan years with a listing. |
| `plan_summary.aca.as_of` | date | The newest date we read a directory that lists the provider. |
| `plan_summary.ma` | object | Medicare Advantage plans. |
| `plan_summary.ma.plans` | integer | Plan and plan-year pairs that list the provider. |
| `plan_summary.ma.organizations` | integer | Organizations among those plans. |
| `plan_summary.ma.plan_years` | integer[] | Plan years with a listing. |
| `plan_summary.ma.accepting_new_patients_any` | boolean | `true` when at least one directory says the provider accepts new patients, else `null`. |
| `plan_summary.ma.as_of` | date | The newest date we read a directory that lists the provider. |
| `links` | object | Related endpoints. |
| `links.plans` | string | The path of the full plan list for this provider. |

## Responses

### 200

The profile, shortened here to one location.

Response (200 OK · application/json):

```json
{
  "request_id": "req_fjj3DnMpm3d4ZZNK",
  "data_as_of": "2026-10-29",
  "data": {
    "npi": "1184617268",
    "profile_found": true,
    "name": {
      "first": "Michael",
      "middle": "Buttimer",
      "last": "Williard",
      "suffix": null,
      "display": "Michael B. Williard, MD"
    },
    "credential": "MD",
    "gender": "male",
    "status": "active",
    "specialties": [
      {
        "name": "Orthopedic Surgery",
        "primary": true
      }
    ],
    "education": {
      "medical_school": "Ohio State University College of Medicine",
      "graduation_year": 1987
    },
    "locations": [
      {
        "address_line_1": "605 Crescent Pl",
        "address_line_2": null,
        "city": "Gahanna",
        "state": "OH",
        "zip": "43230",
        "phone": "6145457900",
        "latitude": null,
        "longitude": null,
        "group": {
          "name": "Orthopedic One, Inc.",
          "pac_id": "3072598283"
        },
        "telehealth": null
      }
    ],
    "groups": [
      {
        "name": "Orthopedic One, Inc.",
        "pac_id": "3072598283",
        "members": 282
      }
    ],
    "affiliations": [
      {
        "facility_type": "Home health agency",
        "ccn": "368154",
        "name": null,
        "city": null,
        "state": null
      },
      {
        "facility_type": "Hospital",
        "ccn": "360035",
        "name": "Mount Carmel East & West",
        "city": "Columbus",
        "state": "OH"
      }
    ],
    "privacy": {
      "contact_masked": false
    },
    "plan_summary": {
      "aca": {
        "plans": 77,
        "issuers": 4,
        "states": [
          "OH"
        ],
        "plan_years": [
          2025,
          2026,
          2027
        ],
        "as_of": "2026-10-28"
      },
      "ma": {
        "plans": 36,
        "organizations": 4,
        "plan_years": [
          2027
        ],
        "accepting_new_patients_any": true,
        "as_of": "2026-10-29"
      }
    },
    "links": {
      "plans": "/v1/providers/1184617268/plans"
    }
  },
  "sources": [
    {
      "type": "provider_registry",
      "description": "National provider registry and practice records",
      "as_of": "2026-10-29"
    },
    {
      "type": "insurer_directory",
      "description": "Provider network directories published by health insurers",
      "as_of": "2026-10-29"
    },
    {
      "type": "plan_catalog",
      "description": "Published health plan catalogs",
      "as_of": "2026-10-28"
    },
    {
      "type": "plan_directory",
      "description": "Provider network directories published by Medicare Advantage plans",
      "as_of": "2026-10-29"
    }
  ],
  "notes": [
    "Network directories change. Confirm with the plan or the provider before care."
  ]
}
```

### 400

The NPI is not 10 digits or fails its check digit.

Response (400 Bad Request · application/problem+json):

```json
{
  "type": "invalid_npi",
  "title": "Invalid NPI",
  "status": 400,
  "detail": "\"1234567890\" fails the NPI check digit (Luhn with prefix 80840).",
  "instance": "/v1/providers/1234567890",
  "request_id": "req_RYHURQjbqOzSrK9m",
  "docs": "https://inplan.io/docs/errors#invalid_npi"
}
```

### 401

The `Authorization` header is missing or malformed, or the key is unknown or revoked.

Response (401 Unauthorized · application/problem+json):

```json
{
  "type": "unauthorized",
  "title": "Missing API key",
  "status": 401,
  "detail": "Send `Authorization: Bearer ip_live_...`.",
  "instance": "/v1/providers/1184617268",
  "request_id": "req_eQx8WCqv-SXJ-RZw",
  "docs": "https://inplan.io/docs/errors#unauthorized"
}
```

### 404

We hold no provider record and no plan listing for this NPI.

Response (404 Not Found · application/problem+json):

```json
{
  "type": "not_found",
  "title": "Provider not found",
  "status": 404,
  "detail": "No provider found for NPI 1999999984.",
  "instance": "/v1/providers/1999999984",
  "request_id": "req_eHYrIWCixJ4RIl52",
  "docs": "https://inplan.io/docs/errors#not_found"
}
```

## Errors

Errors use `application/problem+json` (RFC 7807): `type`, `title`, `status`, `detail`, `instance`, `request_id`, `docs`. Other statuses this endpoint can return: `403` (plan, account or demo-key limit), `429` (rate limit or quota) and `503` (busy or timed out; retry after `Retry-After`). See [Errors](https://inplan.io/docs/errors).

## Rate-limit headers

Every response that passes the key and plan checks carries `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, `RateLimit-Policy`, `X-Quota-Limit`, `X-Quota-Remaining`, `X-Quota-Reset` and `X-Request-Id`. See [Rate limits and quotas](https://inplan.io/docs/rate-limits).
