# Coverage change feed

URL: https://docs.healthcare.dev/coverage-changes

`GET /v1/coverage/changes` lists changes to the coverage documents behind
[Medicare coverage support](/datasets/medicare-coverage): LCDs, billing and coding articles and
NCDs. It is part of the Pro and Team plans (`403` `plan-upgrade-required` on Free and Builder),
and like the dataset change feed it never counts as a billable call.

```sh
curl "https://api.healthcare.dev/v1/coverage/changes?code=11720&since=2026-10-01T00:00:00Z" \
  -H "Authorization: Bearer $HDEV_API_KEY"
```

```json
{
  "data": [
    {
      "id": "4182",
      "type": "coverage.changed",
      "source_type": "coverage",
      "payer": "medicare",
      "document": {
        "id": "A56640",
        "type": "article",
        "title": "Billing and Coding: Debridement of Mycotic Nails",
        "version_before": 15,
        "version_after": 16
      },
      "change": "revised",
      "kind": "material",
      "fields_changed": ["dx_supporting", "version"],
      "affected_codes": ["11720", "11721"],
      "affected_dx_count": 1,
      "effective_date": "2019-09-12",
      "detected_at": "2026-10-20T05:30:00.000Z",
      "evidence": {
        "url": "https://www.cms.gov/medicare-coverage-database/view/article.aspx?articleid=56640&ver=16",
        "anchor": "h3Icd10SupportHeader"
      }
    }
  ]
}
```

## Material changes only

We keep a dated copy of every version of the source documents and compare each new version with
the one before. A change is **material** when it can change an answer: a code list or a
diagnosis list changed, coverage status changed, an effective or retirement date moved, the
criteria changed, or a document was added or retired. Everything else is **cosmetic**: a new
revision that only fixes formatting, whitespace, row order, the title or the revision history.
Cosmetic changes are recorded but never listed here, so a formatting-only revision of a
document produces no event. An event appears once the answers it affects are live in
`/v1/coverage/medicare`, usually within minutes of detection.

- `change`: `added` (new, or newly in effect), `revised` or `removed` (retired or withdrawn).
- `fields_changed`: what changed, e.g. `codes`, `dx_supporting`, `dx_not_supporting`,
  `dx_groups`, `states`, `coverage_level`, `effective_date`, `retire_date`, `criteria`,
  `coding_rules`, `billing_codes`; `version` rides along when the revision number moved.
- `affected_codes`: the procedure codes whose answers may differ (code numbers only).
- `effective_date`: when the revision takes effect (for a removed document, its retirement date).
- `evidence`: the document's page in the Medicare Coverage Database, at the section that changed
  when it's a list.

Filter with `code=` (changes affecting that procedure code), `since=` (detected after a time) and
`payer=` (`medicare`; more payers later). Page with `cursor`, oldest first by default or
`order=desc` for the newest first. Each event's `id` is stable, so store the last one you
processed and continue from it.

Events say what changed in the source, not what to conclude: call
[`/v1/coverage/medicare`](/datasets/medicare-coverage) for the current answer, which explains how
it was reached in its `derivation` field (`source_stated` when a document's lists state it).

This feed is separate from the dataset change feed (`/v1/changes`, Builder and up), which lists
the records each dataset release added, changed or retired. [Webhooks](/webhooks) push the same
events (`coverage.changed`) to your endpoint as they appear, with the same body.
