Payment Limit API

Medicare Part B payment limits and ASP by HCPCS procedure code, version 1.

Base URL
https://www.medpharmdata.com/api/v1/

Authentication

Every request needs a key. Send it in either header — use whichever your HTTP client makes easier:

X-API-Key: mpd_live_xxxxxxxx
Authorization: Bearer mpd_live_xxxxxxxx

Keys are issued by MedPharmData and shown once. We store only a hash, so a lost key cannot be recovered — ask for a replacement and the old one will be revoked. Treat it like a password: it identifies your organisation, not an individual user.

Look up one code

GET https://www.medpharmdata.com/api/v1/payment-limits/J1745/
{
  "hcpcs_code": "J1745",
  "description": "Injection, infliximab, excluding biosimilar, 10 mg",
  "dosage": "10 MG",
  "current": {
    "quarter": "2026Q3",
    "year": 2026,
    "quarter_number": 3,
    "payment_limit": "82.510",
    "asp": "77.839623",
    "asp_source": "derived_asp_plus_6",
    "coinsurance_percent": 20,
    "notes": null,
    "source_file": "July 2026 Medicare Part B Payment Limit File 061626.xls"
  }
}

An unknown code returns 404 with an explanation, rather than an empty success — so your error handling can tell "no such price" apart from "lookup worked, found nothing".

Look up many at once

GET https://www.medpharmdata.com/api/v1/payment-limits/?codes=J1745,J9035,J0135

Up to 100 codes per request. The response lists any codes with no pricing under not_found, so you do not have to diff your request against the reply:

{
  "count": 2,
  "not_found": ["J0135"],
  "results": [ ... ]
}

Parameters

ParameterEffect
quarter Pin a period, e.g. quarter=2026Q3. Defaults to the most recent loaded quarter. Use this to reproduce a calculation exactly as it stood at the time. Valid values come from https://www.medpharmdata.com/api/v1/quarters/.
history history=true adds a history array with every loaded quarter, newest first, alongside current.
codes Comma-separated list, batch endpoint only. Duplicates are collapsed; your ordering is preserved.

How to read the numbers

Amounts are strings, not JSON numbers. A payment limit is an exact decimal; parsing it as a float would introduce rounding into a figure you reconcile against CMS to the cent. Parse it into your language's decimal type.

Every asp we return is an estimate, not a CMS figure. CMS does not publish ASP in the payment limit file at all. We compute it by removing the statutory 6% markup. If you need an official ASP, the payment limit is the published number — the ASP is ours.

Biosimilars do not use the same formula. Medicare pays a biosimilar its own ASP plus an add-on based on the reference product's ASP, so dividing a biosimilar payment limit by 1.06 overstates the ASP by the whole add-on. We compute those separately and tell you which basis was used.

  • derived_asp_plus_6payment_limit ÷ 1.06.
  • derived_biosimilar_referencepayment_limit − (reference_asp × reference_addon_percent). The response includes reference_hcpcs_code, reference_asp and reference_addon_percent so you can reproduce it.
  • unavailable_biosimilar_reference_missingasp is null. It is a biosimilar, but we have no reference product recorded, so the calculation cannot be completed. The payment limit is still correct and still usable.
  • unavailableasp is null. The code is a vaccine, blood product or clotting factor, or its notes show the limit was set from WAC, AWP or by a contractor. Dividing those by 1.06 would produce a number that looks like an ASP and is not one, so we return nothing rather than mislead. Treat null as "unknown", never as zero.

Available quarters

GET https://www.medpharmdata.com/api/v1/quarters/

New CMS releases are loaded weekly. Data appears here as soon as it loads; there is no separate publication step.

Limits and errors

StatusMeaning
400Malformed code, or more than 100 codes.
401Key missing, unknown or revoked.
404Valid code, but no payment limit for it in the requested period.
429Rate limit exceeded. Retry-After says how long to wait.

The default limit is 1000 requests per hour per key. Batch requests count as one. If you need more, ask — limits are set per key.

Example

curl -H "X-API-Key: $MPD_API_KEY" \
  "https://www.medpharmdata.com/api/v1/payment-limits/?codes=J1745,J9035"

Prefer to ask in plain language?

MedPharmData is also an MCP server, so Claude can answer pricing questions directly — "what does Medicare pay for infliximab?" — without you writing any code against this API.

MCP server documentation


Source data is published by CMS. MedPharmData loads it and derives ASP as described above; we do not alter published payment limits. Questions or a key request: get in touch.