# Medicare Advantage internal criteria (preview)

URL: https://docs.healthcare.dev/datasets/ma-internal-criteria

<Callout type="warn" title="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.
</Callout>

|                 |                                                                                                                                                                                                                                                                             |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Source          | Each Medicare Advantage organization's public posting of its internal coverage criteria, required by [42 CFR 422.101(b)(6)](https://www.ecfr.gov/current/title-42/chapter-IV/subchapter-B/part-422/subpart-C/section-422.101) (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`](/reference/medicare-advantage/medicare-advantage-organizations-with-internal-criteria-postings), [`/v1/medicare-advantage/{plan_id}/criteria?code=`](/reference/medicare-advantage/a-medicare-advantage-plan-s-internal-coverage-criteria) |

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:

```sh
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"
```

```json
{
  "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](/datasets/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:

```json
"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/plans` lists the organizations we hold.

## MCP and SDKs

- MCP: `check_ma_internal_criteria` with `{ "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()`.
