API reference
API v1Make your first request, then learn the authentication, versioning, provenance, and error conventions shared by every endpoint.
Send a request
Pass the token as Bearer authentication to any endpoint under /v1.
Keep the provenance
The response identifies the release, CMS source rows, and calculation behind the amount.
curl https://localishealth.com/v1/rates/99213 \
-H "Authorization: Bearer sk_live_…"
const response = await fetch('https://localishealth.com/v1/rates/99213', {
headers: { Authorization: 'Bearer sk_live_…' },
});
const rate = await response.json();
import requests
response = requests.get(
"https://localishealth.com/v1/rates/99213",
headers={"Authorization": "Bearer sk_live_…"},
)
rate = response.json()
Overview
All endpoints are mounted under /v1 and
return JSON. There will be no separate sandbox—every key works against the same live,
versioned data CMS publishes.
- Base URL
- https://localishealth.com/v1
- Format
- JSON request bodies (POST) and JSON responses
- Auth
- Bearer token on every request—see Authentication
| Param | Type | Description |
|---|---|---|
| Base URL | https://localishealth.com/v1 | |
| Format | JSON request bodies (POST) and JSON responses | |
| Auth | Bearer token on every request—see Authentication |
Authentication
Every request—even against the free tier—needs a valid Sanctum API token in the
Authorization header.
A missing or invalid token returns 401.
curl https://localishealth.com/v1/rates/99213 \
-H "Authorization: Bearer sk_live_…"
Create an account and mint a token under Settings → API tokens. Tokens belong to your team rather than to you personally, so quota is shared across everyone you invite and revoking a teammate's access doesn't strand the integration.
Rate limits
The API is metered in cost-weighted units, not requests: a single-code (or single-ZIP) lookup
costs 1 unit, and a bulk request costs one unit per code/ZIP in the batch—so a 500-code
bulk call can't undercut the limit by counting as one request. Both a per-minute burst budget
and a per-account daily quota apply, keyed to your account (all of an account's tokens share
one quota). Every response carries the current budget in headers; exceeding either limit
returns 429 with a Retry-After header.
- X-RateLimit-Limit
- header
- The per-account daily unit quota.
- X-RateLimit-Remaining
- header
- Units left in the current day.
- Retry-After
- header
- Seconds until the exceeded window resets (429 responses only).
| Param | Type | Description |
|---|---|---|
| X-RateLimit-Limit | header | The per-account daily unit quota. |
| X-RateLimit-Remaining | header | Units left in the current day. |
| Retry-After | header | Seconds until the exceeded window resets (429 responses only). |
Historical lookups
Releases are immutable and versioned by (schedule, year, quarter): A = Jan, B = Apr, C = Jul,
D = Oct. Every rate and ZIP endpoint accepts either an explicit year+quarter
pair or an as_of calendar date (mutually exclusive—supplying
both is a 422). Omit both for the current release.
- year
- integer
- Release year, e.g. 2026. Requires quarter.
- quarter
- A|B|C|D
- Release quarter. Requires year.
- as_of
- date
- Resolve the release effective on this calendar date instead of a specific quarter.
| Param | Type | Description |
|---|---|---|
| year | integer | Release year, e.g. 2026. Requires quarter. |
| quarter | A|B|C|D | Release quarter. Requires year. |
| as_of | date | Resolve the release effective on this calendar date instead of a specific quarter. |
Citations & provenance
Every payable rate (and every resolved ZIP) carries a citations object
naming the exact CMS file and row each number came from, plus the arithmetic it was plugged
into—enough to defend a number on an appeal without re-deriving it yourself.
- sources
- object
- One entry per CMS dataset this line's numbers came from (e.g. "rvu", "gpci", "conversion_factor", "zip_locality"). Keys vary by what the calculation needed.
- sources.*.file
- string
- The specific file inside the CMS release the value was read from, e.g. "PPRRVU2026_Jan_nonQPP.csv".
- sources.*.cms_page_url / download_url
- string
- The CMS page the file is published on, and a direct file link when CMS provides a stable one.
- sources.*.row
- integer
- The 1-based row inside the file the value came from—cite this in an appeal alongside the file name.
- sources.*.values
- object
- The raw values read from that row, keyed by field name.
- sources.*.revision
- integer
- The ingested revision of the release the file belongs to.
- sources.*.effective_period
- string
- The window the cited revision's figures governed, e.g. "January 1 – March 31, 2026". Narrower than the calendar quarter when CMS split one mid-quarter ("March 9 – March 31, 2024" for RVU24AR) or a correction ended the revision early.
- sources.*.revision_state
- string
- "Latest revision of this release" or "Superseded revision"—whether CMS has since corrected this file.
- sources.*.release_path
- string
- Our archive page for the release: CMS download link, hashes and member files. Omitted for a superseded revision, since the archive page serves the latest revision.
- calculation
- object
- The formula and the exact inputs it was evaluated with, so the amount can be reproduced by hand.
| Param | Type | Description |
|---|---|---|
| sources | object | One entry per CMS dataset this line's numbers came from (e.g. "rvu", "gpci", "conversion_factor", "zip_locality"). Keys vary by what the calculation needed. |
| sources.*.file | string | The specific file inside the CMS release the value was read from, e.g. "PPRRVU2026_Jan_nonQPP.csv". |
| sources.*.cms_page_url / download_url | string | The CMS page the file is published on, and a direct file link when CMS provides a stable one. |
| sources.*.row | integer | The 1-based row inside the file the value came from—cite this in an appeal alongside the file name. |
| sources.*.values | object | The raw values read from that row, keyed by field name. |
| sources.*.revision | integer | The ingested revision of the release the file belongs to. |
| sources.*.effective_period | string | The window the cited revision's figures governed, e.g. "January 1 – March 31, 2026". Narrower than the calendar quarter when CMS split one mid-quarter ("March 9 – March 31, 2024" for RVU24AR) or a correction ended the revision early. |
| sources.*.revision_state | string | "Latest revision of this release" or "Superseded revision"—whether CMS has since corrected this file. |
| sources.*.release_path | string | Our archive page for the release: CMS download link, hashes and member files. Omitted for a superseded revision, since the archive page serves the latest revision. |
| calculation | object | The formula and the exact inputs it was evaluated with, so the amount can be reproduced by hand. |
{
"sources": {
"rvu": {
"dataset": "rvu",
"label": "Physician relative value file (PPRRVU)",
"release": "2026A",
"cms_page_url": "https://www.cms.gov/medicare/payment/fee-schedules/physician",
"file": "PPRRVU2026_Jan_nonQPP.csv",
"row": 4118,
"values": { "work_rvu": { "value": 1.30 }, "status_code": { "value": "A" } }
},
"gpci": {
"dataset": "gpci",
"label": "Geographic practice cost indices (GPCI)",
"release": "2026A",
"file": "GPCI2026.csv",
"row": 33,
"values": { "work_gpci": { "value": 1.045 } }
}
},
"calculation": {
"formula": "(work_rvu × work_gpci + pe_rvu × pe_gpci + mp_rvu × mp_gpci) × conversion_factor",
"inputs": { "work_rvu": 1.30, "work_gpci": 1.045, "pe_rvu": 1.02, "pe_gpci": 1.10, "mp_rvu": 0.09, "mp_gpci": 0.98, "conversion_factor": 33.29 }
}
}
Errors
Errors carry a client-safe error or reason string
explaining what went wrong—never a bare status code.
- 401
- Missing or invalid API token.
- 404
- The requested code, locality, ZIP, release, or utilization cohort is unavailable. Utilization endpoints also use 404 when no cells clear the publication floor; they never return an implied zero.
- 422
- Contradictory input—e.g. a ZIP and an explicit locality that disagree, or both year/quarter and as_of supplied.
- 429
- Per-minute or per-day rate limit exceeded. See the Retry-After header.
| Param | Type | Description |
|---|---|---|
| 401 | Missing or invalid API token. | |
| 404 | The requested code, locality, ZIP, release, or utilization cohort is unavailable. Utilization endpoints also use 404 when no cells clear the publication floor; they never return an implied zero. | |
| 422 | Contradictory input—e.g. a ZIP and an explicit locality that disagree, or both year/quarter and as_of supplied. | |
| 429 | Per-minute or per-day rate limit exceeded. See the Retry-After header. |
Endpoint directory
Choose the part of the API you are integrating. Each focused reference keeps its own endpoint navigation, examples, parameters, and response shapes.
Rates API
Price one code, a batch of codes, or a year-by-year series against the Medicare Physician Fee Schedule.
Claims & MPPR API
Check cross-line claim rules, NCCI edits, unit ceilings, and multiple-procedure reductions.
Geography API
Resolve ZIP codes through versioned CMS crosswalks and browse Medicare payment localities.
Reference data API
Inspect published releases, their exact source files, and the payment rules the pricing engine applies.
Watchlist API
Store the codes your team bills and measure how a new release changes their expected value.
Fees & utilization API
Read clinical lab and MAC-published fees alongside observed Original Medicare utilization.