Check a provider and plan
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.
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
| NAME | DESCRIPTION |
|---|---|
npistring · Required | The provider's 10-digit National Provider Identifier. We validate the check digit. Example: 1184617268 |
plan_idstring · 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 |
yearinteger · 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:
| FIELD | DESCRIPTION |
|---|---|
npistring | The NPI you checked. |
plan_idstring | The plan we checked. Marketplace ids are normalized to the 14-character plan id. |
input_plan_idstring | The plan id exactly as you sent it. |
marketstring | aca for marketplace plans, ma for Medicare Advantage plans. |
plan_years_listedinteger[] | Plan years in which the directory lists the provider for this plan. |
in_networktrue | 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. |
answerstring | listed, not_found, or no_provider_network for a prescription drug plan id (contract ids that start with S). |
explanationstring | One plain sentence that states the answer. Safe to show to users as it is. |
evidenceobject[] | One entry for each listing we found. Empty when the answer is not_found. |
plan_yearinteger | null | The plan year this answer is about: the year you sent, else the newest year listed, else the newest plan year we hold. |
planobject | null | Plan details. null when we hold no details for this plan id. |
plan.plan_namestring | The plan name as the insurer publishes it. |
plan.issuerobject | Marketplace plans: the insurer. |
plan.issuer.idstring | The 5-digit insurer id (the first 5 characters of the plan id). |
plan.issuer.namestring | The insurer name. |
plan.statestring | Marketplace plans: the state the plan is sold in. |
plan.metal_levelstring | Marketplace plans: Bronze, Expanded Bronze, Silver, Gold, Platinum or Catastrophic. |
plan.plan_typestring | HMO, PPO, EPO, POS and similar. |
plan.variantstring | null | Marketplace plans: the 2-digit variant you sent (for example 01), else null. |
plan.organizationstring | Medicare Advantage plans: the organization that offers the plan. |
plan.service_area_statesstring[] | Medicare Advantage plans: the states in the plan's service area. |
sourceobject | The source type of the answer and its date. |
source.typestring | insurer_directory or plan_directory. |
source.as_ofdate | null | The date we read the directory that gave this answer. |
as_ofdate | 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.
| FIELD | DESCRIPTION |
|---|---|
evidence[].plan_idstring | The plan of this listing. |
evidence[].plan_yearinteger | The plan year of this listing. |
evidence[].network_tierstring | Marketplace plans: the tier the directory names, for example PARTICIPATING or PREFERRED. Several tiers are joined with commas. |
evidence[].sourceobject | Where this listing comes from. |
evidence[].source.typestring | insurer_directory for marketplace plans, plan_directory for Medicare Advantage plans. |
evidence[].source.as_ofdate | The date we read that directory. |
evidence[].accepting_new_patientsboolean | null | Medicare Advantage plans: whether the directory says the provider accepts new patients (null when it does not say). |
evidence[].provider_kindstring | 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.
{ "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.
{ "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.
{ "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.
{ "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.
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.
| PLAN | REQUESTS A SECOND | CALLS A MONTH |
|---|---|---|
| Free | 2 | 500 |
| Builder | 10 | 25,000 |
| Growth | 25 | 150,000 |
| Scale | Set with you | Set with you |