Medicare Advantage internal criteria (preview)
Which services a Medicare Advantage plan covers with its own internal coverage criteria, as its public posting says, with links to the plan's documents. Preview: not available yet.
Preview: not available yet
This dataset is built but not released. Until it is, its endpoints answer 503
dataset-unavailable and it is not listed in /v1/datasets. This page describes how it will
work; details may change before release.
| Source | Each Medicare Advantage organization's public posting of its internal coverage criteria, required by 42 CFR 422.101(b)(6) (CMS-4201-F) |
| Source id | plan-postings |
| Release cadence | Plans revise their policies monthly or so; we check the postings daily and publish a new version when one changes |
| License | Facts from public postings federal rules require, with a link to the plan's document; never the plan's documents or criteria text |
| Plans | Pro and Team (403 plan-upgrade-required below) |
| Endpoints | /v1/medicare-advantage/plans, /v1/medicare-advantage/{plan_id}/criteria?code= |
A Medicare Advantage plan has to follow Medicare's coverage rules: statutes, regulations, National Coverage Determinations (NCDs) and Local Coverage Determinations (LCDs). Where those don't fully establish the criteria for a service, the plan may use internal coverage criteria of its own, and it must post them publicly, without a login or paywall. This dataset tells you which services a plan's posting covers that way, the procedure codes it lists, and where the plan's own document is.
Look a plan up by Medicare Advantage contract or organization id, optionally for one code:
curl "https://api.healthcare.dev/v1/medicare-advantage/plans" -H "Authorization: Bearer $HDEV_API_KEY"
curl "https://api.healthcare.dev/v1/medicare-advantage/unitedhealthcare/criteria?code=91110" \
-H "Authorization: Bearer $HDEV_API_KEY"{
"data": {
"plan": {
"id": "unitedhealthcare",
"organization": { "id": "unitedhealthcare", "name": "UnitedHealthcare" },
"contract": null,
"applies_to": "all_ma_plans"
},
"code": "91110",
"disclaimer": "Reference data, not a coverage determination.",
"note": "Facts from each Medicare Advantage organization's public posting ...",
"pending_review": 0,
"criteria": [
{
"organization": { "id": "unitedhealthcare", "name": "UnitedHealthcare" },
"service": {
"key": "capsule-endoscopy",
"policy_id": null,
"name": "Capsule Endoscopy"
},
"codes": ["91110", "91111", "91112", "91299"],
"uses_internal_criteria": {
"answer": "yes",
"confidence": 0.8,
"derivation": "derived",
"evidence": [
{
"url": "https://www.uhcprovider.com/en/policies-protocols/medicare-advantage-policies/medicare-advantage-medical-policies.html"
}
],
"as_of": "2026-10-25T05:30:00.000Z"
},
"basis": "organization_statement",
"criteria_url": "https://www.uhcprovider.com/content/dam/provider/docs/public/policies/medadv-mp/capsule-endoscopy.pdf",
"posting_url": "https://www.uhcprovider.com/en/policies-protocols/medicare-advantage-policies/medicare-advantage-medical-policies.html",
"effective_date": null,
"updated_date": "2026-09-01"
}
]
}
}plan_id is a contract (H1036) or an organization id from GET /v1/medicare-advantage/plans.
An organization's posting applies to all its Medicare Advantage plans, so a contract answers with
its organization's services (applies_to: all_ma_plans). Without code you get every service
in the posting; with it, the services whose posting lists that code. A code no service lists
means only that: the plan may cover it under a policy without a code list, or follow Medicare's
own criteria for it.
The fields
| Field | What it is |
|---|---|
service | The plan's policy: our stable key, the plan's own policy_id when it gives one, and its name |
codes | Procedure codes the posting lists for the service: HCPCS Level II codes and CPT numbers, never CPT descriptions |
uses_internal_criteria | yes or no, as the posting states it, with derivation, confidence, evidence and as_of |
basis | Where the answer comes from: the organization's statement (organization_statement) or a person's check |
criteria_url | The plan's document for the service: read it for the criteria themselves |
posting_url | The organization's page listing its policies |
effective_date, updated_date | When the policy's current version took effect, and when the plan last published or reviewed it |
differs_from_medicare_criteria | Present only when a person confirmed a difference from an NCD or LCD (below) |
We never store or serve the criteria text. The plan's document is the source; we give you the facts to find it and the link.
How answers are read: derivation
We read organizations' public policy lists and statement pages, not the policy documents
themselves (basis: organization_statement):
source_stated(confidence 1): the organization says plainly that every Medicare Advantage policy it lists is written where Medicare's criteria aren't fully established.derived(confidence below 1): the organization says it may apply internal criteria in the policies it lists, without saying which; the plan's document says where they apply.reviewed: the posting didn't say, so a person read it (basis: person_checked_posting).
A policy whose posting doesn't say waits for that person and isn't listed until then;
pending_review counts those. When the plan changes a policy's entry in its list, we read it
afresh.
differs_from_medicare_criteria
Where Medicare's own criteria exist for a code, a plan has to follow them. We compare plans' postings with Medicare coverage documents: rules find candidates (for example, a plan says a policy's codes have no Medicare criteria while an LCD lists them, or a code tied to an NCD is under a plan's internal criteria), and a person reads both documents and decides every one. Nothing is ever flagged by rules alone, and a candidate is never shown before that review.
When the person confirms that the plan's criteria differ from Medicare's for some codes, the service carries:
"differs_from_medicare_criteria": [
{
"medicare_document": {
"id": "L35013",
"type": "lcd",
"title": "...",
"url": "https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=35013&ver=4"
},
"codes": ["11720"],
"states": ["TX"],
"finding": {
"answer": "differs",
"confidence": 1,
"derivation": "reviewed",
"evidence": [{ "url": "https://..." }, { "url": "https://www.cms.gov/..." }],
"as_of": "2026-10-25T05:30:00.000Z"
}
}
]It says the two documents differ for those codes where the Medicare document applies (states;
empty when it is national). It is a comparison of two public documents, not a legal finding or a
coverage determination. Its absence means no confirmed difference, not that the criteria match.
What it is not
- Not a coverage determination and not prior authorization: whether a member's service is covered depends on their plan and situation.
- Not the criteria. Read the plan's document (
criteria_url). - Not every plan. Some organizations publish their criteria only behind a portal that needs
accepted terms or a sign-in, or ask not to be crawled; we leave those out rather than work
around them.
GET /v1/medicare-advantage/planslists the organizations we hold.
MCP and SDKs
- MCP:
check_ma_internal_criteriawith{ "plan": "H1036", "code": "91110" }. - TypeScript:
hdev.medicareAdvantage.criteria("H1036", { code: "91110" }),hdev.medicareAdvantage.plans(). - Python:
hdev.medicare_advantage.criteria("H1036", code="91110"),hdev.medicare_advantage.plans().
Payer prior authorization metrics
How often health plans approve and deny prior authorization requests and how long they take to decide, as each plan posts it every year, in one schema with a link to the posting.
Prior authorization requirements (preview)
Whether a payer's public prior authorization lists require prior authorization for a procedure code, per line of business, with dates, evidence links and an honest answer when a code isn't listed. Preview: not available yet.