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

Coverage

GEThttps://api.inplan.io/v1/coverage

What we hold: for each market, state, insurer and plan year, how many plans have provider listings, and the date we read them. Filter by market, state and year.

.mdView as MarkdownFree plan and up · 1 call

WHEN TO USE IT

Use it to decide which states and insurers to offer checks for, or to show users how current the data is for their state.

QUERY PARAMETERS

Query parameters for GET /v1/coverage
NAMEDESCRIPTION
market
string · aca or ma · Optional
aca or ma. Omit for both.
Example: ma
state
string · Optional
Only this state (2-letter code).
Example: OH
year
integer · Optional
Only this plan 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
filters
object
The filters you sent (null when not sent).
filters.market
string | null
aca, ma or null.
filters.state
string
The state filter.
filters.year
integer | null
The plan year filter.
markets
string[]
Markets with listings for these filters.
summary
object
Totals by market, then by plan year.
summary.{market}
object
aca or ma.
summary.{market}.{year}
object
Totals for one plan year.
summary.{market}.{year}.states
integer
States with listings.
summary.{market}.{year}.insurers
integer
Insurers or organizations with listings.
summary.{market}.{year}.plans
integer
Plans with listings.
summary.{market}.{year}.as_of
date
The newest date we read a directory in this group.
rows
object[]
One row for each market, state, insurer and plan year with listings.
rows[].market
string
aca or ma.
rows[].state
string
2-letter state code.
rows[].insurer
string
The insurer or organization name.
rows[].plan_year
integer
The plan year.
rows[].plans
integer
Plans with listings in this row.
rows[].as_of
date | null
The date we read the directory for this row.

RESPONSES

Totals in summary, one row per market, state, insurer and plan year in rows (shortened here).

200 OK · application/json
{  "request_id": "req_0U9QnpvGhkSal2Qg",  "data_as_of": "2026-10-29",  "data": {    "filters": {      "market": null,      "state": "OH",      "year": null    },    "markets": [      "aca",      "ma"    ],    "summary": {      "aca": {        "2026": {          "states": 1,          "insurers": 11,          "plans": 189,          "as_of": "2026-10-29"        }      },      "ma": {        "2027": {          "states": 1,          "insurers": 6,          "plans": 45,          "as_of": "2026-10-29"        }      }    },    "rows": [      {        "market": "aca",        "state": "OH",        "insurer": "Ambetter from Buckeye Health Plan",        "plan_year": 2026,        "plans": 16,        "as_of": null      },      {        "market": "aca",        "state": "OH",        "insurer": "Anthem Blue Cross and Blue Shield",        "plan_year": 2026,        "plans": 11,        "as_of": "2026-07-27"      },      {        "market": "aca",        "state": "OH",        "insurer": "Antidote Health Plan of Ohio, Inc.",        "plan_year": 2026,        "plans": 15,        "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"    },    {      "type": "plan_directory",      "description": "Provider network directories published by Medicare Advantage plans",      "as_of": "2026-10-29"    }  ]}

An invalid market, state or year.

400 Bad Request · application/problem+json
{  "type": "invalid_request",  "title": "Invalid state",  "status": 400,  "detail": "`state` must be a 2-letter US state code; got \"XX\".",  "instance": "/v1/coverage",  "request_id": "req_O2YuV9GXYt2-y6DK",  "docs": "https://inplan.io/docs/errors#invalid_request"}

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/coverage",  "request_id": "req_BylbsNzGqRikrP1Y",  "docs": "https://inplan.io/docs/errors#unauthorized"}

More requests a second than the key allows.

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
429 Too Many Requests · application/problem+json
{  "type": "rate_limited",  "title": "Too many requests",  "status": 429,  "detail": "This key allows 2 requests per second.",  "instance": "/v1/coverage",  "request_id": "req_TrHd8LO8HNbLoZ_D",  "docs": "https://inplan.io/docs/errors#rate_limited"}

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 and 503. 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