# Check a provider and plan

`GET https://api.inplan.io/v1/check`

Answers one question: does this plan's network directory list this provider? The answer comes with its evidence: the plan year, the network tier, the source type and the date we read it.

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

## When to use it

Use it when you already know the plan, for example to confirm a booking or to mark the doctors a quoted plan keeps. To list every plan for a provider, call [`GET /v1/providers/{npi}/plans`](https://inplan.io/docs/api/provider-plans). To check many pairs, call [`POST /v1/check/batch`](https://inplan.io/docs/api/check-batch).

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `npi` | query | string | Required | The provider's 10-digit National Provider Identifier. We validate the check digit. Example: `1184617268`. |
| `plan_id` | query | string | Required | A marketplace plan id (14 characters, or 16 with the variant) or a Medicare Advantage contract-plan-segment id. Example: `29276OH0970001 · H2526-001-000`. |
| `year` | query | integer | Optional | A plan year. Narrows the answer to that year. Example: `2026`. |

## Request

curl:

```bash
curl https://api.inplan.io/v1/check \
  -H "Authorization: Bearer $INPLAN_KEY" \
  -G -d npi=1184617268 -d plan_id=29276OH0970001
```

JavaScript:

```javascript
const url = new URL("https://api.inplan.io/v1/check");
url.search = new URLSearchParams({ npi: "1184617268", plan_id: "29276OH0970001" });

const res = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.INPLAN_KEY}` },
});
const body = await res.json();
console.log(body.data.answer, body.data.evidence);
```

Python:

```python
import os, requests

res = requests.get(
    "https://api.inplan.io/v1/check",
    params={"npi": "1184617268", "plan_id": "29276OH0970001"},
    headers={"Authorization": f"Bearer {os.environ['INPLAN_KEY']}"},
    timeout=10,
)
body = res.json()
print(body["data"]["answer"], body["data"]["evidence"])
```

## 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 checked. |
| `plan_id` | string | The plan we checked. Marketplace ids are normalized to the 14-character plan id. |
| `input_plan_id` | string | The plan id exactly as you sent it. |
| `market` | string | `aca` for marketplace plans, `ma` for Medicare Advantage plans. |
| `plan_years_listed` | integer[] | Plan years in which the directory lists the provider for this plan. |
| `in_network` | true \| null | `true`: the directory lists the provider for this plan. `null`: no listing found in current directory data. It is never a statement that the provider is out of network. |
| `answer` | string | `listed`, `not_found`, or `no_provider_network` for a prescription drug plan id (contract ids that start with S). |
| `explanation` | string | One plain sentence that states the answer. Safe to show to users as it is. |
| `evidence` | object[] | One entry for each listing we found. Empty when the answer is `not_found`. |
| `evidence[].plan_id` | string | The plan of this listing. |
| `evidence[].plan_year` | integer | The plan year of this listing. |
| `evidence[].network_tier` | string | Marketplace plans: the tier the directory names, for example `PARTICIPATING` or `PREFERRED`. Several tiers are joined with commas. |
| `evidence[].source` | object | Where this listing comes from. |
| `evidence[].source.type` | string | `insurer_directory` for marketplace plans, `plan_directory` for Medicare Advantage plans. |
| `evidence[].source.as_of` | date | The date we read that directory. |
| `evidence[].accepting_new_patients` | boolean \| null | Medicare Advantage plans: whether the directory says the provider accepts new patients (`null` when it does not say). |
| `evidence[].provider_kind` | string | Medicare Advantage plans: the kind of provider listed, for example `practitioner`. |
| `plan_year` | integer \| null | The plan year this answer is about: the `year` you sent, else the newest year listed, else the newest plan year we hold. |
| `plan` | object \| null | Plan details. `null` when we hold no details for this plan id. |
| `plan.plan_name` | string | The plan name as the insurer publishes it. |
| `plan.issuer` | object | Marketplace plans: the insurer. |
| `plan.issuer.id` | string | The 5-digit insurer id (the first 5 characters of the plan id). |
| `plan.issuer.name` | string | The insurer name. |
| `plan.state` | string | Marketplace plans: the state the plan is sold in. |
| `plan.metal_level` | string | Marketplace plans: Bronze, Expanded Bronze, Silver, Gold, Platinum or Catastrophic. |
| `plan.plan_type` | string | HMO, PPO, EPO, POS and similar. |
| `plan.variant` | string \| null | Marketplace plans: the 2-digit variant you sent (for example `01`), else `null`. |
| `plan.organization` | string | Medicare Advantage plans: the organization that offers the plan. |
| `plan.service_area_states` | string[] | Medicare Advantage plans: the states in the plan's service area. |
| `source` | object | The source type of the answer and its date. |
| `source.type` | string | `insurer_directory` or `plan_directory`. |
| `source.as_of` | date \| null | The date we read the directory that gave this answer. |
| `as_of` | date \| null | The date we read the directory that gave this answer (same as `source.as_of`). |

## Responses

### 200 listed

The plan's directory lists the provider. The evidence block carries the plan year, tier, source type and date.

Response (200 OK · application/json):

```json
{
  "request_id": "req_ws7hhhC7uSWYqEye",
  "data_as_of": "2026-07-27",
  "data": {
    "npi": "1184617268",
    "plan_id": "29276OH0970001",
    "input_plan_id": "29276OH0970001",
    "market": "aca",
    "plan_years_listed": [
      2026
    ],
    "in_network": true,
    "answer": "listed",
    "explanation": "The insurer's network directory lists this provider for this plan.",
    "evidence": [
      {
        "plan_id": "29276OH0970001",
        "plan_year": 2026,
        "network_tier": "PARTICIPATING",
        "source": {
          "type": "insurer_directory",
          "as_of": "2026-07-27"
        }
      }
    ],
    "plan_year": 2026,
    "plan": {
      "plan_name": "Anthem Bronze Pathway 10600 ($0 Virtual PCP + $0 Select Drugs)",
      "issuer": {
        "id": "29276",
        "name": "Anthem Blue Cross and Blue Shield"
      },
      "state": "OH",
      "metal_level": "Bronze",
      "plan_type": "HMO",
      "variant": null
    },
    "source": {
      "type": "insurer_directory",
      "as_of": "2026-07-27"
    },
    "as_of": "2026-07-27"
  },
  "sources": [
    {
      "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"
    }
  ],
  "notes": [
    "in_network=null means no listing was found in current directory data. It is not a statement that the provider is out of network.",
    "Network directories change. Confirm with the plan or the provider before care."
  ]
}
```

### 200 not_found

No listing found in current directory data for this provider and plan. `in_network` is `null` and `evidence` is empty. Show it as unknown, not as out of network.

Response (200 OK · application/json):

```json
{
  "request_id": "req_p-wTVhm9dU50UsKb",
  "data_as_of": "2026-10-28",
  "data": {
    "npi": "1376006148",
    "plan_id": "13262AR0230002",
    "input_plan_id": "13262AR0230002",
    "market": "aca",
    "plan_years_listed": [],
    "in_network": null,
    "answer": "not_found",
    "explanation": "No listing found in current directory data for this provider and plan.",
    "evidence": [],
    "plan_year": 2026,
    "plan": {
      "plan_name": "HA Silver AH",
      "issuer": {
        "id": "13262",
        "name": "Health Advantage"
      },
      "state": "AR",
      "metal_level": "Silver",
      "plan_type": "POS",
      "variant": null
    },
    "source": {
      "type": "insurer_directory",
      "as_of": "2026-10-28"
    },
    "as_of": "2026-10-28"
  },
  "sources": [
    {
      "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"
    }
  ],
  "notes": [
    "in_network=null means no listing was found in current directory data. It is not a statement that the provider is out of network.",
    "Network directories change. Confirm with the plan or the provider before care."
  ]
}
```

### 400

The NPI fails its check digit, the plan id has an unknown format, or a parameter is invalid. The `type` is `invalid_npi`, `invalid_plan_id` or `invalid_request`.

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/check",
  "request_id": "req_tyeV9VkOEHSgXbbW",
  "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/check",
  "request_id": "req_pctJoQwOrN-xK9Wp",
  "docs": "https://inplan.io/docs/errors#unauthorized"
}
```

### 429

You sent more requests a second than your key allows (`rate_limited`), or used this month's calls (`quota_exceeded`). Wait for `Retry-After` seconds. Calls over the quota are never billed.

Response (429 Too Many Requests · application/problem+json):

```http
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json; charset=utf-8
Retry-After: 1
RateLimit-Limit: 2
RateLimit-Remaining: 0
RateLimit-Reset: 1
RateLimit-Policy: 2;w=1;burst=5
X-Request-Id: req_TrHd8LO8HNbLoZ_D
```

## 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) 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).
