NEWMedicare Advantage 2027 plans are live in the API.Read the changelog

Check a provider and plan

GEThttps://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.

.mdView as MarkdownFree plan and up · 1 call

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. To check many pairs, call POST /v1/check/batch.

QUERY PARAMETERS

Query parameters for GET /v1/check
NAMEDESCRIPTION
npi
string · Required
The provider's 10-digit National Provider Identifier. We validate the check digit.
Example: 1184617268
plan_id
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
integer · Optional
A plan year. Narrows the answer to that year.
Example: 2026

RESPONSE FIELDS

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

Response fields
FIELDDESCRIPTION
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.
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).

EVIDENCE FIELDS

evidence[] holds one entry for each listing we found. It is empty when the answer is not_found. See Answers and evidence.

Evidence fields
FIELDDESCRIPTION
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.

RESPONSES

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

200 OK · application/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."  ]}

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.

200 OK · application/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."  ]}

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.

400 Bad Request · application/problem+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"}

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

401 Unauthorized · application/problem+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"}

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.

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

ERROR FORMAT

Errors use application/problem+json (RFC 7807) with type, title, status, detail, instance, request_id and 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.

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. Limits apply to each key. See Rate limits and quotas.

Limits by plan
PLANREQUESTS A SECONDCALLS A MONTH
Free2500
Builder1025,000
Growth25150,000
ScaleSet with youSet with you