Medicare Tools: Fee Schedule & LCD Lookup
Pricing
from $20.00 / 1,000 fee schedule rows
Medicare Tools: Fee Schedule & LCD Lookup
Medicare physician, clinical lab, and DMEPOS fee schedules by CPT/HCPCS and locality, with LCD coverage matches and office vs ASC vs hospital comparisons. Built on current CMS files, verified to the cent.
Pricing
from $20.00 / 1,000 fee schedule rows
Rating
0.0
(0)
Developer
Martyn Gross
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Part of Iceni Data · Medicare Tools
Medicare Tools: Fee Schedule Lookup
Prices HCPCS/CPT codes against the Medicare Physician Fee Schedule, Clinical Laboratory Fee Schedule, or DMEPOS fee schedule; compares office/facility/ASC/hospital-outpatient payment side by side; or checks LCD coverage by MAC jurisdiction. Built on the CMS PFS Relative Value Files, the Clinical Laboratory Fee Schedule Files, the DMEPOS Fee Schedule Files, the ASC Payment Rates & Addenda, the OPPS quarterly Addendum B, NCCI MUE tables, and the Medicare Coverage Database. Runs on the Apify platform, so you get scheduling, an API, webhooks, and monitoring for free.
What does Medicare Fee Coverage Lookup do?
Two inputs shape every run: mode picks what kind of result you get, and schedule picks which fee schedule a plain lookup prices against.
mode: "lookup" (default) — a plain per-code lookup, dispatched by schedule:
schedule: "pfs"(default): computes the base Medicare Physician Fee Schedule payment —(work RVU × work GPCI + PE RVU × PE GPCI + MP RVU × MP GPCI) × conversion factor— for each (HCPCS/CPT code, locality) pair, using the office or facility PE RVU and the standard or QP-differential conversion factor. Also attaches NCCI MUE limits, any NCD/LCD coverage match, and any related Billing & Coding Article.schedule: "clfs": looks up the national Clinical Laboratory Fee Schedule rate for each lab or PLA code — no locality involved.schedule: "dmepos": looks up the DMEPOS fee schedule rate for each code, per state (states) and rural/non-rural (rural), across every rental/purchase modifier CMS prices it under.
mode: "site_of_service" — for each (HCPCS code, locality) pair, returns the PFS office and facility payment alongside the ASC and OPPS (hospital-outpatient) national payment rates, so you can see all four sites of service for one code in one row. schedule is ignored.
mode: "lcd_matrix" — for each HCPCS code, returns covered / not_covered / no_policy per MAC jurisdiction, built from the LCD data already in the cache. schedule is ignored.
Every mode/schedule combination reads from the same cached lookup table (see Refresh cadence below); the first run downloads and normalizes all of it, every run after that reads from the cache, so most runs finish in seconds.
Why use Medicare Fee Coverage Lookup?
- Billing/RCM teams can batch-price a code list across every locality a multi-site practice operates in, instead of clicking through CMS's own locality-by-locality fee schedule lookup tool one code at a time.
- Lab billing teams can batch-check the national CLFS rate for a panel of CPT lab codes and PLA codes in one run, instead of looking each one up on CMS's own CLFS file by hand.
- DME suppliers can compare a rental vs. purchase rate for a code across the states they ship to in one run, instead of downloading CMS's own fee-schedule spreadsheet and building the state/modifier lookup themselves.
- Practice administrators deciding where to furnish a service can pull office/facility/ASC/hospital-outpatient payment for the same code side by side with
mode: "site_of_service", instead of cross-referencing four separate CMS files by hand. - Compliance/coding teams can spot-check whether a code has an NCD, LCD, or Billing & Coding Article they should be aware of before billing it (
mode: "lookup"), or see the full per-MAC-jurisdiction coverage picture at once (mode: "lcd_matrix"). - Health-tech and RCM software builders get a normalized JSON feed of RVUs, GPCIs, MUEs, coverage matches, and CLFS/DMEPOS/ASC/OPPS rates to embed in their own product, instead of maintaining five separate CMS file-parsing pipelines.
How to use Medicare Fee Coverage Lookup
- Click Try for free (or Start) on this Actor's page.
- In the Input tab, choose
mode("lookup","site_of_service", or"lcd_matrix") and, for"lookup",schedule("pfs","clfs", or"dmepos"). - Set
hcpcs_codes, plus whichever oflocalities/states/rural/site_of_service/apm_qualifyingyour mode/schedule needs (see the Input table below). - Click Start. The first run for a given cache period downloads and normalizes every CMS source file this Actor reads (typically 2-5 minutes, across seven quarterly releases); every run after that within the 30-day cache window is fast.
- Open the Dataset tab to view, filter, or export the results (JSON, CSV, Excel, HTML, and more). Use the matching view — Payments, Lab, DMEPOS, Site of service, or Coverage matrix — for a pre-shaped table.
Input
All fields are described with an example in the Input tab. Full schema: .actor/input_schema.json.
| Field | Type | Description |
|---|---|---|
mode | string | "lookup" (default, dispatched by schedule), "site_of_service", or "lcd_matrix". |
schedule | string | "pfs" (default), "clfs", or "dmepos". Only consulted when mode is "lookup". |
hcpcs_codes | array of strings | HCPCS/CPT codes to price or check. |
localities | array of strings | Locality codes ("CA-18") or a bare state code ("CA", expands to every locality in it). Required for schedule: "pfs" and mode: "site_of_service". |
site_of_service | string | "office" or "facility" — which PE RVU to price. Default "office". schedule: "pfs" only. |
apm_qualifying | boolean | Price with the 2026 QP-differential conversion factor instead of the standard one. Default false. schedule: "pfs" and mode: "site_of_service". |
states | array of strings | Two-letter state codes. schedule: "dmepos" only. |
rural | boolean | Price at the rural rate instead of non-rural (falls back to non-rural where CMS hasn't published a distinct rural rate). Default false. schedule: "dmepos" only. |
force_refresh | boolean | Maintenance mode: reload every CMS source file and rebuild the cache even if it's under 30 days old. Default false. |
Three worked inputs
1. Price a couple of common codes across every California locality (the prefill):
{"hcpcs_codes": ["99213", "96900"],"localities": ["CA"],"site_of_service": "office"}
2. CLFS lab-code lookup — a PLA code and two CPT lab codes, no locality needed:
{"schedule": "clfs","hcpcs_codes": ["0011U", "80053", "81479"]}
3. DMEPOS rental vs. purchase comparison — one code, one state, every modifier CMS prices it under:
{"schedule": "dmepos","hcpcs_codes": ["E0607"],"states": ["CA"],"rural": false}
Site-of-service comparison — office vs. facility vs. ASC vs. hospital-outpatient for one code/locality:
{"mode": "site_of_service","hcpcs_codes": ["99213"],"localities": ["CA-05"]}
LCD coverage matrix — covered/not_covered/no_policy per MAC jurisdiction for a code:
{"mode": "lcd_matrix","hcpcs_codes": ["96900"]}
Maintenance run — force a fresh pull of every CMS source file:
{"hcpcs_codes": ["99213"],"localities": ["CA-18"],"force_refresh": true}
What this Actor does not do
- No MAC-specific fee schedule adjustments. This computes the base national PFS/ASC/OPPS formula or rate. Some Medicare Administrative Contractors apply their own further adjustments for specific codes/situations that aren't captured here.
- No sequestration or other claims-processing reductions. Every payment figure is the pre-sequestration allowed amount, not the actual amount a claim would remit.
- No anesthesia base-unit pricing. Anesthesia codes (
001xx-019xx, statusJ) are priced by anesthesia base units × a separate anesthesia conversion factor, not the RVU formula this Actor uses. - Billing & Coding Articles are informational only, not a coverage determination. They're returned in
related_articles, separate fromcoverage_matches, and are never charged for. coverage_matchesandmode: "lcd_matrix"only count a code as covered when it's directly enumerated in that LCD's own HCPCS code list — never because it's merely referenced from a related document. NCDs carry no structured per-code list at all in CMS's downloads, so no code path here can produce an NCD match.- No CLFS/DMEPOS/ASC/OPPS coverage matching.
coverage_matches/related_articlesonly ever populate onschedule: "pfs"rows. - No MAC gapfill history. When a CLFS code has no national rate (
payment_rate: null) or a DMEPOS code/state has no published rural rate, this Actor doesn't attempt to reconstruct what an individual MAC gapfilled it to in a given jurisdiction or prior year — only the current national/quarterly file is read. - No commercial-payer rates. Every number here is a Medicare rate, never a commercial insurer's contracted or list rate.
- No AMA CPT long descriptors, and no AMA PLA code list.
description/short_descriptionare CMS's own short-description fields; this Actor never reads or stores the AMA's copyrighted long descriptor text or its separate PLA code list, even though the underlying CMS files carry AMA-copyrighted CPT data. mode: "site_of_service"'s ASC/OPPS amounts are national, unadjusted rates — not wage-index-adjusted for the requested locality, unlike the PFS office/facility figures alongside them. A code with no separate ASC or OPPS payment (most E/M codes, for instance) legitimately showsnullfor those two fields; that's expected, not partial data.
Output
One flat JSON object per row, pushed to the default dataset — the row unit depends on mode/schedule: (HCPCS code, locality) for schedule: "pfs" and mode: "site_of_service"; HCPCS/PLA code alone for schedule: "clfs" and mode: "lcd_matrix"; (HCPCS code, state) for schedule: "dmepos". You can download it as JSON, CSV, Excel, HTML, XML, or RSS from the Export results button. Missing values are null, never empty strings (see my_actor/common/models.py); partial_data: true marks a row where the code/locality/state or its core payment/rate couldn't be resolved.
Example output row (PFS lookup)
{"hcpcs": "99213","description": "Office o/p est low 20 min","status_code": "A","locality_code": "CA-18","locality_name": "LOS ANGELES-LONG BEACH-ANAHEIM (LOS ANGELES/ORANGE CNTY)","state": "CA","site_of_service": "office","work_rvu": 1.30,"pe_rvu": 1.46,"mp_rvu": 0.09,"work_gpci": 1.041,"pe_gpci": 1.183,"mp_gpci": 0.664,"conversion_factor": 33.4009,"conversion_factor_type": "non_qualifying","payment": 104.89,"mue_practitioner": 1,"mue_facility": 1,"coverage_matches": [],"related_articles": [],"data_as_of": "2026-09-06","source_urls": ["https://www.cms.gov/files/zip/rvu26d-updated-08-26-2026.zip"],"partial_data": false}
One row per view
Lab (schedule: "clfs"):
{ "hcpcs": "80053", "short_description": "Comprehen metabolic panel", "payment_rate": 10.56, "status_indicators": { "indicator": "N" }, "is_pla": false, "effective_quarter": "2026-Q3", "data_as_of": "2026-09-06", "source_urls": ["https://www.cms.gov/files/zip/26clabq3.zip"], "partial_data": false }
DMEPOS (schedule: "dmepos"):
{ "hcpcs": "E0607", "description": "Blood glucose monitor home", "category": "IN", "jurisdiction": "D", "state": "CA", "rural": false, "rates": { "NU": 95.23, "RR": 9.52, "UE": 71.40 }, "data_as_of": "2026-09-06", "source_urls": ["https://www.cms.gov/files/zip/dme26-c.zip"], "partial_data": false }
Site of service (mode: "site_of_service") — 99213 in CA-05 (San Francisco-Oakland-Berkeley), no ASC/OPPS payment for a plain office visit:
{ "hcpcs": "99213", "description": "Office o/p est low 20 min", "locality_code": "CA-05", "locality_name": "SAN FRANCISCO-OAKLAND-BERKELEY (SAN FRANCISCO/SAN MATEO/ALAMEDA/CONTRA COSTA CNTY)", "state": "CA", "office_payment": 117.58, "facility_payment": 64.37, "asc_payment": null, "hospital_outpatient_payment": null, "conversion_factor_type": "non_qualifying", "data_as_of": "2026-09-06", "source_urls": ["https://www.cms.gov/files/zip/rvu26d-updated-08-26-2026.zip"], "partial_data": false }
Coverage matrix (mode: "lcd_matrix"):
{ "hcpcs": "96900", "description": "Actinotherapy uv light", "jurisdictions": { "CGS Administrators, LLC": "not_covered", "Noridian Healthcare Solutions, LLC": "covered", "Palmetto GBA": "not_covered" }, "data_as_of": "2026-09-06", "source_urls": ["https://downloads.cms.gov/medicare-coverage-database/downloads/exports/current_lcd.zip"], "partial_data": false }
Data table
| Field | Type | Description | Applies to |
|---|---|---|---|
hcpcs | string | HCPCS/CPT code priced. | all |
description | string | null | Short CMS description of the code. | pfs, site_of_service, lcd_matrix |
status_code | string | null | PFS status code (e.g. A = active/payable). | pfs |
locality_code, locality_name, state | string | null | Locality identifiers. | pfs, site_of_service |
site_of_service | string | "office" or "facility" — which PE RVU was used. | pfs |
work_rvu, pe_rvu, mp_rvu, work_gpci, pe_gpci, mp_gpci | number | null | RVU/GPCI components. | pfs |
conversion_factor, conversion_factor_type | number/string | null | PFS conversion factor used. | pfs, site_of_service |
payment | number | null | Computed base PFS payment. | pfs |
mue_practitioner, mue_facility | integer | null | NCCI Medically Unlikely Edit limits. | pfs |
coverage_matches, related_articles | array | {type, id, title, contractor, effective_date, url} per LCD match / related Article. | pfs |
short_description | string | null | CMS's own short description (never the AMA long descriptor). | clfs |
payment_rate | number | null | National CLFS rate. null if no national rate exists. | clfs |
status_indicators | object | Pass-through of the CLFS file's own indicator field(s). | clfs |
is_pla | boolean | true for a PLA code (ends in "U"). | clfs |
effective_quarter | string | null | CLFS release quarter. | clfs |
category, jurisdiction | string | null | DMEPOS benefit category / pricing jurisdiction code. | dmepos |
rural | boolean | Whether the rural rate was requested. | dmepos |
rates | object | Rate per modifier ("flat", or "NU"/"RR"/"UE"). | dmepos |
office_payment, facility_payment, asc_payment, hospital_outpatient_payment | number | null | Payment at each site of service. | site_of_service |
jurisdictions | object | MAC jurisdiction name -> "covered" | "not_covered" | "no_policy". | lcd_matrix |
data_as_of | string (date) | Date the row's data was current as of. | all |
source_urls | array of strings | CMS source file URL(s) this row was built from. | all |
partial_data | boolean | true if the code/locality/state or its core payment/rate couldn't be resolved. | all |
Refresh cadence & how caching works
On first use, this Actor downloads the current-quarter CMS PFS RVU release (standard and QP-differential conversion factor files), the current NCCI MUE practitioner/facility tables, the current-quarter CLFS national rate file, the current-quarter DMEPOS fee schedule, the current ASC Addendum AA and OPPS Addendum B, and the Medicare Coverage Database LCD/Article exports — seven quarterly CMS releases in total — normalizes them into one lookup table, and caches it for 30 days in a store shared across runs. Each release's own label (e.g. RVU26D, 26CLABQ3, DME26-C) is folded into the cache's version key, so it always reflects the actual source files behind it. Every run within the 30-day window reuses the cache. Each run also does a cheap check for a newer quarterly PFS or CLFS release and refreshes early if one has appeared, even inside the window (DMEPOS/ASC/OPPS don't get this early-refresh check — the 30-day TTL and force_refresh cover them). Set force_refresh: true to rebuild the cache immediately regardless of its age.
Pricing / Cost estimation
This Actor uses the Pay Per Event model:
lookup_returned— charged once per row returned formode: "lookup"(any schedule) andmode: "lcd_matrix".coverage_returned— charged once perschedule: "pfs"row whosecoverage_matchesis non-empty. Related Articles are never charged for; no other schedule/mode triggers this event.comparison_returned— charged once per row returned formode: "site_of_service".
Free-plan users are capped at 25 rows per run (see my_actor/common/free_tier.py); paying users are not capped. A schedule: "pfs" run pricing 2 codes across 18 California localities (36 rows) with half having a coverage match costs 36 lookup_returned + 18 coverage_returned events. A mode: "site_of_service" run for 1 code across 5 localities costs 5 comparison_returned events.
Tips / Advanced options
- Pass a bare two-letter state (
"CA","TX","NY") inlocalitiesto price a code everywhere in that state without looking up every locality number yourself. (schedule: "pfs"andmode: "site_of_service".) - Batch as many
hcpcs_codes,localities, andstatesas you need in one run — the cache means the marginal cost of a big run is just the per-row charges, not extra fetch time. - Use
force_refresh: truesparingly — it re-downloads and re-parses CMS zip files across seven source families, which takes real time. The 30-day cache plus the PFS/CLFS new-release check cover the normal case. - A
nullpayment_rateon aschedule: "clfs"row (e.g. some Tier 2 molecular pathology codes) means CMS hasn't set a national CLFS rate for that code — it's priced by each MAC instead. - A
nullinratesfor aschedule: "dmepos"row means that state has no rate published for that modifier at all — different from a genuine0, which would appear as0.0.
FAQ, disclaimers, and support
This Actor reads only from public CMS data downloads (CMS Physician Fee Schedule, CLFS, DMEPOS, ASC, OPPS, NCCI, and Medicare Coverage Database file exports); it does not scrape any paywalled or ToS-restricted site. It is not legal, billing, or coding advice, and CMS payment rules change — always confirm against the source files linked in source_urls before relying on a number for actual billing. Found a code, locality, or state that looks wrong, or a CMS file structure change this Actor doesn't handle? Open an issue on the Actor's Issues tab.
Related tools
Part of the Medicare Tools family on Apify:
- Medicare Reimbursement Calculator — prices a single HCPCS/CPT code with modifiers, participation status, and sequestration, one code at a time.