# Plans that list a provider

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

Every plan whose network directory lists the provider, marketplace plans first, each with its plan year, source type and date. Filter by market, state and year; page with `offset`.

Free plan and up · 1 call per page. Source: https://inplan.io/docs/api/provider-plans

## When to use it

Use it to show every plan that keeps a provider, for example to quote plans that keep a client's doctors. To answer for one known plan, call [`GET /v1/check`](https://inplan.io/docs/api/check).

## 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`. |
| `market` | query | string · `aca` or `ma` | Optional | `aca` for marketplace plans, `ma` for Medicare Advantage plans. Omit for both. Example: `ma`. |
| `state` | query | string | Optional | 2-letter state. Marketplace plans: the plan's state. Medicare Advantage plans: a state in the plan's service area. Example: `OH`. |
| `year` | query | integer | Optional | Only plans for this plan year (2025 to 2030). Example: `2026`. |
| `limit` | query | integer · default 500 · max 2,000 | Optional | Plans per page. |
| `offset` | query | integer · default 0 | Optional | Plans to skip. Use `next_offset` from the previous page. |

## Request

curl:

```bash
curl https://api.inplan.io/v1/providers/1184617268/plans \
  -H "Authorization: Bearer $INPLAN_KEY" \
  -G -d year=2026 -d limit=2
```

JavaScript:

```javascript
const url = new URL("https://api.inplan.io/v1/providers/1184617268/plans");
url.search = new URLSearchParams({ year: "2026", limit: "2" });

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

Python:

```python
import os, requests

res = requests.get(
    "https://api.inplan.io/v1/providers/1184617268/plans",
    params={"year": "2026", "limit": "2"},
    headers={"Authorization": f"Bearer {os.environ['INPLAN_KEY']}"},
    timeout=10,
)
body = res.json()
print(body["data"]["total"], body["data"]["plans"])
```

## 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. |
| `provider_states` | string[] | States of the provider's practice locations. |
| `filters` | object | The filters you sent (`null` when not sent). |
| `filters.market` | string \| null | `aca`, `ma` or `null`. |
| `filters.state` | string \| null | The state filter. |
| `filters.year` | integer \| null | The plan year filter. |
| `total` | integer | Plans that match the filters, across all pages. |
| `counts` | object | The total, split by market. |
| `counts.aca` | integer | Marketplace plans that match. |
| `counts.ma` | integer | Medicare Advantage plans that match. |
| `offset` | integer | The offset of this page. |
| `limit` | integer | The page size. |
| `next_offset` | integer \| null | The `offset` for the next page, or `null` on the last page. |
| `plans` | object[] | The plans on this page: marketplace plans first, then Medicare Advantage plans. |
| `plans[].market` | string | `aca` or `ma`. |
| `plans[].plan_id` | string | The plan id. |
| `plans[].plan_year` | integer | The plan year of this listing. |
| `plans[].plan_name` | string \| null | The plan name, when we hold plan details. |
| `plans[].issuer` | object | Marketplace plans: the insurer. |
| `plans[].issuer.id` | string | The 5-digit insurer id. |
| `plans[].issuer.name` | string \| null | The insurer name, when we hold it. |
| `plans[].state` | string | Marketplace plans: the plan state. |
| `plans[].metal_level` | string \| null | Marketplace plans: the metal level. |
| `plans[].plan_type` | string \| null | HMO, PPO, EPO, POS and similar. |
| `plans[].network_tiers` | string[] | Marketplace plans: the tiers the directory names for this provider. |
| `plans[].plan_details_available` | boolean | `true` when plan name, metal level and plan type are included. |
| `plans[].source` | object | Where this listing comes from. |
| `plans[].source.type` | string | `insurer_directory` or `plan_directory`. |
| `plans[].source.as_of` | date \| null | The date we read that directory. |
| `plans[].organization` | string | Medicare Advantage plans: the organization that offers the plan. |
| `plans[].snp` | object | Medicare Advantage plans: special needs plan details. |
| `plans[].snp.is_snp` | boolean | `true` for a special needs plan. |
| `plans[].snp.type` | string | The special needs plan type, as published. |
| `plans[].service_area_states` | string[] | Medicare Advantage plans: states in the plan's service area. |
| `plans[].accepting_new_patients` | boolean \| null | Medicare Advantage plans: whether the directory says the provider accepts new patients. |
| `plans[].provider_kind` | string | Medicare Advantage plans: the kind of provider listed. |
| `plans[].taxonomy` | string | Medicare Advantage plans: the provider taxonomy code listed with the network entry. |
| `plans[].provider_state_in_service_area` | boolean \| null | Medicare Advantage plans: `true` when one of the provider's states is in the service area, `null` when either side is unknown. |

## Responses

### 200

A page of plans. `total` counts every match; `next_offset` is `null` on the last page.

Response (200 OK · application/json):

```json
{
  "request_id": "req_EEsgYcNXpuC_ijmU",
  "data_as_of": "2026-10-29",
  "data": {
    "npi": "1184617268",
    "provider_states": [
      "OH"
    ],
    "filters": {
      "market": null,
      "state": null,
      "year": 2026
    },
    "total": 46,
    "counts": {
      "aca": 46,
      "ma": 0
    },
    "offset": 0,
    "limit": 2,
    "next_offset": 2,
    "plans": [
      {
        "market": "aca",
        "plan_id": "29276OH0970001",
        "plan_year": 2026,
        "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",
        "network_tiers": [
          "PARTICIPATING"
        ],
        "plan_details_available": true,
        "source": {
          "type": "insurer_directory",
          "as_of": "2026-07-27"
        }
      },
      {
        "market": "aca",
        "plan_id": "29276OH0970002",
        "plan_year": 2026,
        "plan_name": "Anthem Heart Healthy Bronze Pathway 6000 ($0 Virtual PCP + $0 Select Drugs)",
        "issuer": {
          "id": "29276",
          "name": "Anthem Blue Cross and Blue Shield"
        },
        "state": "OH",
        "metal_level": "Expanded Bronze",
        "plan_type": "HMO",
        "network_tiers": [
          "PARTICIPATING"
        ],
        "plan_details_available": true,
        "source": {
          "type": "insurer_directory",
          "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"
    },
    {
      "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."
  ]
}
```

### 200 ma

With `market=ma`: Medicare Advantage plans add service area, new-patient and provider-kind fields.

Response (200 OK · application/json):

```json
{
  "request_id": "req_lUbO6VDvdYSs2XWz",
  "data_as_of": "2026-10-29",
  "data": {
    "npi": "1184617268",
    "provider_states": [
      "OH"
    ],
    "filters": {
      "market": "ma",
      "state": null,
      "year": null
    },
    "total": 36,
    "counts": {
      "aca": 0,
      "ma": 36
    },
    "offset": 0,
    "limit": 1,
    "next_offset": 1,
    "plans": [
      {
        "market": "ma",
        "plan_id": "H2526-001-000",
        "plan_year": 2027,
        "plan_name": "DEVOTED CHOICE 001 OH (PPO)",
        "organization": "Devoted Health",
        "plan_type": "PPO",
        "snp": {
          "is_snp": false,
          "type": "Not Applicable"
        },
        "service_area_states": [
          "OH"
        ],
        "accepting_new_patients": true,
        "provider_kind": "practitioner",
        "taxonomy": "207X00000X",
        "plan_details_available": true,
        "source": {
          "type": "plan_directory",
          "as_of": "2026-10-29"
        },
        "provider_state_in_service_area": true
      }
    ]
  },
  "sources": [
    {
      "type": "plan_directory",
      "description": "Provider network directories published by Medicare Advantage plans",
      "as_of": "2026-10-29"
    },
    {
      "type": "plan_catalog",
      "description": "Published health plan catalogs",
      "as_of": "2026-10-28"
    }
  ],
  "notes": [
    "Network directories change. Confirm with the plan or the provider before care.",
    "A plan's network can include providers outside the plan's service area. Compare service_area_states with the provider's location."
  ]
}
```

### 400

An invalid NPI or filter.

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/plans",
  "request_id": "req_tJFUtTPOxNSXJtXb",
  "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/plans",
  "request_id": "req_ItpJcJKIUQZ1dBDx",
  "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/plans",
  "request_id": "req_HVipN6sy7kXyvBYe",
  "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). 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).
