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.
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
| NAME | DESCRIPTION |
|---|---|
marketstring · aca or ma · Optional | aca or ma. Omit for both.Example: ma |
statestring · Optional | Only this state (2-letter code). Example: OH |
yearinteger · 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:
| FIELD | DESCRIPTION |
|---|---|
filtersobject | The filters you sent (null when not sent). |
filters.marketstring | null | aca, ma or null. |
filters.statestring | The state filter. |
filters.yearinteger | null | The plan year filter. |
marketsstring[] | Markets with listings for these filters. |
summaryobject | 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}.statesinteger | States with listings. |
summary.{market}.{year}.insurersinteger | Insurers or organizations with listings. |
summary.{market}.{year}.plansinteger | Plans with listings. |
summary.{market}.{year}.as_ofdate | The newest date we read a directory in this group. |
rowsobject[] | One row for each market, state, insurer and plan year with listings. |
rows[].marketstring | aca or ma. |
rows[].statestring | 2-letter state code. |
rows[].insurerstring | The insurer or organization name. |
rows[].plan_yearinteger | The plan year. |
rows[].plansinteger | Plans with listings in this row. |
rows[].as_ofdate | 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).
{ "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.
{ "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.
{ "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.
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
{ "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.
| 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 |