# Medicare Part D Formulary & Plan Change Feed

> Medicare Part D Formulary & Plan Change Feed is a paid API for AI agents from data.spencermcw.com, paid per call via x402, $0.05/call, status unknown (last checked 2026-10-23).

Returns a paginated feed of Medicare Part D formulary and plan changes detected monthly from CMS data, including drug additions/removals, tier changes, prior-auth, step-therapy, quantity-limit, and premium changes.

## Facts

- Endpoint: GET https://data.spencermcw.com/v1/medicare/partd/changes?utm_source=zero.xyz
- Price: $0.05/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-23
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/medicare-part-d-formulary-plan-change-feed-fbad1fcf
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_xrvuvonchnOxEAZVebblI

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability medicare-part-d-formulary-plan-change-feed-fbad1fcf
```

Example prompt: Show me all Medicare Part D formulary changes detected since January 1, 2025, up to 50 records — I want to see which drugs changed tier, were added, or dropped from coverage.

## When to prefer this

Use this endpoint when you need to track month-over-month changes in Medicare Part D formularies or plan attributes derived directly from CMS official monthly files. It is ideal for compliance monitoring, beneficiary advocacy tools, pharmacy benefit analysis, or any workflow that needs auditable change history with source file hashes. Prefer it over manually diffing CMS files or scraping plan websites.

## Known failure modes

- Invalid since datetime format returns 400 validation error
- Cursor value out of range or malformed returns 400
- Plan year outside valid range (2000-2100) returns 400
- Exceeding 3 free daily calls without payment returns 402 Payment Required
- Invalid entity enum value (not formulary or plan) returns 400
- No changes found for specified filters returns empty records array

## How this service works

Which Medicare Part D formularies changed this month? Drugs added or dropped, tier, prior-authorization, step-therapy and quantity-limit changes and plan premium changes, computed by Distill from CMS’s monthly formulary files. Updated monthly. $0.05 per call (x402, USDC on Base); 3 free calls a day.

## Output

A paginated array of change records, each containing: a unique change ID, plan year, release date, entity type (formulary or plan), a key identifying the specific drug (RxCUI) or plan (contract-plan-segment), the field that changed (e.g. tier, prior_auth, premium), old and new values, detection timestamp, method version, and SHA256 hashes of the source CMS files used for comparison. Also includes a next_cursor for pagination.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "properties": {
      "key": {
       "type": "string",
       "pattern": "^[A-Za-z0-9:-]{1,40}$"
      },
      "limit": {
       "type": "integer",
       "maximum": 100,
       "minimum": 1
      },
      "since": {
       "type": "string",
       "format": "date-time",
       "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
      },
      "cursor": {
       "type": "string",
       "pattern": "^\\d{1,12}$"
      },
      "entity": {
       "enum": [
        "formulary",
        "plan"
       ],
       "type": "string"
      },
      "plan_year": {
       "type": "integer",
       "maximum": 2100,
       "minimum": 2000
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "properties": {
      "data": {
       "type": "object",
       "required": [
        "records",
        "next_cursor"
       ],
       "properties": {
        "records": {
         "type": "array",
         "items": {
          "type": "object",
          "required": [
           "id",
           "plan_year",
           "released",
           "entity",
           "key",
           "field",
           "old",
           "new",
           "detected_at",
           "source_sha256_old",
           "source_sha256_new",
           "method_version"
          ],
          "properties": {
           "id": {
            "type": "string"
           },
           "key": {
            "type": "string",
            "description": "formulary: <formulary id>:<RxCUI>; plan: contract-plan-segment."
           },
           "new": {
            "type": [
             "string",
             "null"
            ]
           },
           "old":
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/medicare-part-d-formulary-plan-change-feed-fbad1fcf/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from data.spencermcw.com](https://www.zero.xyz/host/data.spencermcw.com/llms.txt)
