localis

Describe a service in plain words, or type a CPT/HCPCS code.

API reference

API v1

Make your first request, then learn the authentication, versioning, provenance, and error conventions shared by every endpoint.

01

Create a key

Create an account and mint a team token, free and without a card.

02

Send a request

Pass the token as Bearer authentication to any endpoint under /v1.

03

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_…"

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

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.

example
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).

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.

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.
citations—abbreviated
{
  "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.

Endpoint directory

Choose the part of the API you are integrating. Each focused reference keeps its own endpoint navigation, examples, parameters, and response shapes.