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

Quickstart

Get a key, check one provider against one plan, read the answer, then check many pairs in one call.

.mdView as MarkdownOpen in PlaygroundUpdated 2026-10-30

Get a key

Sign up, open Keys in the dashboard and choose Create key. Keys start with ip_live_. We store only a hash of each key, so copy it when it appears.

shell
export INPLAN_KEY="ip_live_..."

Want to try before you sign up? The Playground runs on a demo key that answers for a set of sample providers.

Make your first call

Ask whether a plan lists a provider. Send the provider's NPI and the plan ID. Every request goes to https://api.inplan.io with your key in the Authorization header.

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

This example checks Michael B. Williard, MD (NPI 1184617268) against the 2026 marketplace plan Anthem Bronze Pathway 10600 (29276OH0970001). Medicare Advantage plan IDs look like H2526-001-000.

Read the answer

The answer sits in data. The evidence block is the receipt: it says which directory listed the provider, for which plan year, and when we read it.

200 OK · application/jsonevidence marked
{  "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."  ]}
Fields to read first
FIELDWHAT IT TELLS YOU
data.in_networktrue when the plan's directory lists the provider. null when we found no listing.
data.answerlisted or not_found. Use this value to pick the words you show.
data.explanationOne plain sentence you can show to users as it is.
data.evidence[]One entry for each listing: plan year, network tier, and for Medicare Advantage plans, whether the provider accepts new patients.
evidence[].sourceThe source type and as_of, the date we read the data.
data.planPlan name, insurer, state, metal level and plan type.
request_idUnique to this request. Quote it when you contact support.

Every check returns one of two answers:

LISTED · in_network: trueThe plan's network directory lists the provider. Show the plan year, tier and the date from evidence.
NOT FOUND · in_network: nullNo listing found in current directory data for this provider and plan. Ask the user to confirm with the plan. Do not show it as out of network.

Check many pairs in one call

On Builder and above, send up to 100 provider-plan pairs to POST /v1/check/batch in a body with the key items. Each pair counts as one call. A bad pair returns its own error and the rest of the batch still answers.

curl https://api.inplan.io/v1/check/batch \  -H "Authorization: Bearer $INPLAN_KEY" \  -H "Content-Type: application/json" \  -d '{"items": [        {"npi": "1184617268", "plan_id": "29276OH0970001"},        {"npi": "1184617268", "plan_id": "H2526-001-000"}      ]}'
200 OK · response, shortened
{  "request_id": "req_KHtLEQJ46JLKLkZZ",  "data_as_of": "2026-10-29",  "data": {    "count": 4,    "summary": {      "listed": 2,      "not_found": 1,      "invalid": 1    },    "results": [      {        "index": 0,        "npi": "1184617268",        "plan_id": "29276OH0970001",        "market": "aca",        "in_network": true,        "answer": "listed",        "evidence": [          {            "plan_id": "29276OH0970001",            "plan_year": 2026,            "network_tier": "PARTICIPATING",            "source": {              "type": "insurer_directory",              "as_of": "2026-07-27"            }          }        ]      },      {        "index": 1,        "npi": "1184617268",        "plan_id": "H2526-001-000",        "market": "ma",        "in_network": true,        "answer": "listed",        "evidence": [          {            "plan_id": "H2526-001-000",            "plan_year": 2027,            "accepting_new_patients": true,            "provider_kind": "practitioner",            "source": {              "type": "plan_directory",              "as_of": "2026-10-29"            }          }        ]      },      {        "index": 2,        "npi": "1376006148",        "plan_id": "13262AR0230002",        "market": "aca",        "in_network": null,        "answer": "not_found",        "evidence": []      },      {        "index": 3,        "npi": "1234567890",        "plan_id": "29276OH0970001",        "error": {          "type": "invalid_npi",          "title": "Invalid NPI",          "detail": "\"1234567890\" fails the NPI check digit (Luhn with prefix 80840)."        }      }    ]  }}

Read data.summary for the counts, then each item in data.results. The index matches the position of the pair you sent. See Batch checks.

Handle errors

Errors use the application/problem+json format (RFC 7807). Branch on type, show detail in your logs, and keep request_id.

Error statuses and types
STATUSTYPEWHAT TO DO
400invalid_npi, invalid_plan_id, invalid_requestFix the input. The detail names the field.
401unauthorizedCheck the Authorization header and that the key is active.
403plan_upgrade_required, demo_restrictedThe endpoint needs a larger plan, or the demo key only answers for sample providers.
404not_found, plan_not_foundWe hold no record for this NPI or plan ID.
429rate_limited, quota_exceededWait for Retry-After seconds. Quota errors clear on the 1st of the month, UTC.
503busy, timeoutRetry after Retry-After seconds.

Every lookup response also carries rate-limit and quota headers. Calls to /v1/status do not count against your quota. See Rate limits and quotas and Errors.

Next steps

Docs / Get started / QuickstartNext: Authentication