Batch check
The check answer for up to 100 provider-plan pairs in one call. Each pair is answered as a single check would be; a bad pair gets its own error and the rest still answer.
WHEN TO USE IT
Use it for rosters: every doctor of an employee against every plan on offer, or a nightly re-check of saved pairs. See Batch checks for counting and limits.
REQUEST BODY
JSON, with Content-Type: application/json, at most 64 KB.
| NAME | DESCRIPTION |
|---|---|
itemsobject[] · 1 to 100 · Required | The pairs to check. Each item: npi (string, required), plan_id (string, required), year (integer, optional). |
yearinteger · Optional | Default plan year for items without their own 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 |
|---|---|
countinteger | The number of items you sent. |
summaryobject | Counts of the answers in this batch. |
summary.listedinteger | Items answered listed. |
summary.not_foundinteger | Items answered with in_network: null. |
summary.invalidinteger | Items that failed validation and carry an error. |
resultsobject[] | One result for each item, in the order you sent them. |
results[].indexinteger | The position of the item in your items array, starting at 0. |
results[].npistring | The NPI you checked. |
results[].plan_idstring | The plan we checked. Marketplace ids are normalized to the 14-character plan id. |
results[].input_plan_idstring | The plan id exactly as you sent it. |
results[].marketstring | aca for marketplace plans, ma for Medicare Advantage plans. |
results[].plan_years_listedinteger[] | Plan years in which the directory lists the provider for this plan. |
results[].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. |
results[].answerstring | listed, not_found, or no_provider_network for a prescription drug plan id (contract ids that start with S). |
results[].explanationstring | One plain sentence that states the answer. Safe to show to users as it is. |
results[].evidenceobject[] | One entry for each listing we found. Empty when the answer is not_found. |
results[].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. |
results[].planobject | null | Plan details. null when we hold no details for this plan id. |
results[].plan.plan_namestring | The plan name as the insurer publishes it. |
results[].plan.issuerobject | Marketplace plans: the insurer. |
results[].plan.issuer.idstring | The 5-digit insurer id (the first 5 characters of the plan id). |
results[].plan.issuer.namestring | The insurer name. |
results[].plan.statestring | Marketplace plans: the state the plan is sold in. |
results[].plan.metal_levelstring | Marketplace plans: Bronze, Expanded Bronze, Silver, Gold, Platinum or Catastrophic. |
results[].plan.plan_typestring | HMO, PPO, EPO, POS and similar. |
results[].plan.variantstring | null | Marketplace plans: the 2-digit variant you sent (for example 01), else null. |
results[].plan.organizationstring | Medicare Advantage plans: the organization that offers the plan. |
results[].plan.service_area_statesstring[] | Medicare Advantage plans: the states in the plan's service area. |
results[].sourceobject | The source type of the answer and its date. |
results[].source.typestring | insurer_directory or plan_directory. |
results[].source.as_ofdate | null | The date we read the directory that gave this answer. |
results[].as_ofdate | null | The date we read the directory that gave this answer (same as source.as_of). |
results[].errorobject | Only on an item that failed validation. The other fields of a check are then absent. |
results[].error.typestring | The problem type, for example invalid_npi. |
results[].error.titlestring | A short summary. |
results[].error.detailstring | What is wrong with this item. |
EVIDENCE FIELDS
results[].evidence[] holds one entry for each listing we found. It is empty when the answer is not_found. See Answers and evidence.
| FIELD | DESCRIPTION |
|---|---|
results[].evidence[].plan_idstring | The plan of this listing. |
results[].evidence[].plan_yearinteger | The plan year of this listing. |
results[].evidence[].network_tierstring | Marketplace plans: the tier the directory names, for example PARTICIPATING or PREFERRED. Several tiers are joined with commas. |
results[].evidence[].sourceobject | Where this listing comes from. |
results[].evidence[].source.typestring | insurer_directory for marketplace plans, plan_directory for Medicare Advantage plans. |
results[].evidence[].source.as_ofdate | The date we read that directory. |
results[].evidence[].accepting_new_patientsboolean | null | Medicare Advantage plans: whether the directory says the provider accepts new patients (null when it does not say). |
results[].evidence[].provider_kindstring | Medicare Advantage plans: the kind of provider listed, for example practitioner. |
RESPONSES
One result for each item, in order. summary counts listed, not_found and invalid items.
{ "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", "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" }, { "index": 1, "npi": "1184617268", "plan_id": "H2526-001-000", "input_plan_id": "H2526-001-000", "market": "ma", "plan_years_listed": [ 2027 ], "in_network": true, "answer": "listed", "explanation": "The plan's network directory lists this provider for this plan.", "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" } } ], "plan_year": 2027, "plan": { "plan_name": "DEVOTED CHOICE 001 OH (PPO)", "organization": "Devoted Health", "plan_type": "PPO", "service_area_states": [ "OH" ] }, "source": { "type": "plan_directory", "as_of": "2026-10-29" }, "as_of": "2026-10-29" }, { "index": 2, "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" }, { "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)." } } ] }, "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" } ], "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." ]}
More than 100 items (batch_too_large), or a body without an items array (invalid_request).
{ "type": "batch_too_large", "title": "Batch too large", "status": 400, "detail": "At most 100 pairs per call; got 101.", "instance": "/v1/check/batch", "request_id": "req_hxtwDDAeyVY4wVMP", "docs": "https://inplan.io/docs/errors#batch_too_large"}
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/batch", "request_id": "req_GeDGBDA_JgNwi3Hq", "docs": "https://inplan.io/docs/errors#unauthorized"}
The key is on the Free plan. Batch checks start on Builder.
{ "type": "plan_upgrade_required", "title": "Plan upgrade required", "status": 403, "detail": "This endpoint needs the builder plan or higher; this key is on free.", "instance": "/v1/check/batch", "request_id": "req_RL1ifh22It4kUXjz", "docs": "https://inplan.io/docs/errors#plan_upgrade_required", "current_plan": "free", "required_plan": "builder"}
The Content-Type is not application/json.
{ "type": "unsupported_media_type", "title": "JSON required", "status": 415, "detail": "Send `Content-Type: application/json`.", "instance": "/v1/check/batch", "request_id": "req_zdyooaUKchC18Eiy", "docs": "https://inplan.io/docs/errors#unsupported_media_type"}
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: 413 (body over 64 KB), 429 (rate limit or quota; a batch is refused whole when the quota cannot cover it) and 503 (busy or timed out; the batch is not counted). 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 |