Medicare Part B payment limits and ASP by HCPCS procedure code, version 1.
https://www.medpharmdata.com/api/v1/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.
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".
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": [ ... ]
}
| Parameter | Effect |
|---|---|
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. |
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_6 — payment_limit ÷
1.06.
derived_biosimilar_reference —
payment_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_missing —
asp 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.
unavailable — asp 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.
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.
| Status | Meaning |
|---|---|
400 | Malformed code, or more than 100 codes. |
401 | Key missing, unknown or revoked. |
404 | Valid code, but no payment limit for it in the requested period. |
429 | Rate 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.
curl -H "X-API-Key: $MPD_API_KEY" \
"https://www.medpharmdata.com/api/v1/payment-limits/?codes=J1745,J9035"
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.
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.