Physician Fee Schedule / RVU Lookup
Look up Medicare Physician Fee Schedule data and Relative Value Unit (RVU) breakdowns for HCPCS/CPT codes.
Overview
The Medicare Physician Fee Schedule (PFS) determines how much Medicare pays for physician services. Each procedure code is assigned Relative Value Units (RVUs) across three components:
- Work RVU — Physician time, skill, and intensity
- Practice Expense (PE) RVU — Overhead costs (staff, equipment, supplies), with separate values for facility and non-facility settings
- Malpractice (MP) RVU — Professional liability insurance costs
The total RVU is multiplied by the conversion factor (a dollar amount updated annually by CMS) to calculate the Medicare payment amount.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /v1/pfs/:hcpcs |
Single PFS/RVU lookup |
| POST | /v1/pfs/_batch |
Batch lookup (up to 100 codes) |
Single Lookup
Look up RVU data for an office visit
Request
Node.js
const response = await fetch(
"https://api.fhirfly.io/v1/pfs/99213",
{
method: "GET",
headers: {
"x-api-key": "YOUR_API_KEY",
}
}
);
const data = await response.json();
console.log(data);Response
JSON
{
"data": {
"hcpcs_code": "99213",
"description": "Office or other outpatient visit for the evaluation and management of an established patient",
"status_code": "A",
"rvu": {
"work": 1.3,
"pe_non_facility": 1.28,
"pe_facility": 0.52,
"mp": 0.07,
"total_non_facility": 2.65,
"total_facility": 1.89
},
"conversion_factor": 32.74,
"calculated_payment": {
"non_facility": 86.76,
"facility": 61.88
},
"indicators": {
"global_days": "XXX",
"multiple_surgery": "0",
"bilateral_surgery": "0"
}
},
"meta": {
"source": {
"name": "CMS Physician Fee Schedule",
"quarter": "2026-Q1"
},
"legal": {
"license": "public_domain",
"attribution_required": false,
"source_name": "CMS Physician Fee Schedule/RVU Files",
"citation": "CMS Physician Fee Schedule Relative Value Files. Accessed via FHIRfly."
}
}
}Parameters
Single Lookup
| Parameter | Required | Description |
|---|---|---|
hcpcs |
Yes | HCPCS/CPT code (path parameter, 4-5 alphanumeric characters) |
Batch Lookup
| Parameter | Required | Description |
|---|---|---|
codes |
Yes | Array of HCPCS/CPT codes (request body, max 100) |
Understanding the Response
RVU Breakdown
| Field | Type | Description |
|---|---|---|
work |
number | Work RVU — physician effort |
pe_non_facility |
number | Practice Expense RVU for non-facility (office) setting |
pe_facility |
number | Practice Expense RVU for facility (hospital) setting |
mp |
number | Malpractice RVU |
total_non_facility |
number | Sum of work + pe_non_facility + mp |
total_facility |
number | Sum of work + pe_facility + mp |
Payment Calculation
| Field | Type | Description |
|---|---|---|
conversion_factor |
number | CMS conversion factor (dollars per RVU) |
calculated_payment.non_facility |
number | total_non_facility * conversion_factor |
calculated_payment.facility |
number | total_facility * conversion_factor |
The calculated payment is the national base rate before geographic adjustments (GPCIs). Actual Medicare payments vary by locality.
Indicators
| Field | Type | Description |
|---|---|---|
global_days |
string | null | Global surgery period ("000", "010", "090", "XXX", "YYY", "ZZZ") |
multiple_surgery |
string | null | Multiple surgery indicator |
bilateral_surgery |
string | null | Bilateral surgery indicator ("0" = 150%, "1" = 150% if modifier 50, "2" = bilateral already included) |
Status Codes
| Code | Meaning |
|---|---|
A |
Active — separately payable code |
B |
Bundled — payment included in another code |
C |
Carrier-priced — no national fee, priced by MAC |
I |
Invalid — not payable under PFS |
N |
Non-covered — not covered by Medicare |
R |
Restricted — special coverage rules apply |
Batch Lookup
Look up RVU data for multiple codes in a single request:
Look up RVU data for multiple codes
Request
Node.js
const response = await fetch(
"https://api.fhirfly.io/v1/pfs/_batch",
{
method: "POST",
headers: {
"x-api-key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"codes": [
"99213",
"99214"
]
})
}
);
const data = await response.json();
console.log(data);Response
JSON
{
"count": 2,
"results": [
{
"input": "99213",
"hcpcs_code": "99213",
"status": "ok",
"data": {
"hcpcs_code": "99213",
"description": "Office or other outpatient visit, established patient",
"status_code": "A",
"rvu": {
"work": 1.3,
"pe_non_facility": 1.28,
"pe_facility": 0.52,
"mp": 0.07,
"total_non_facility": 2.65,
"total_facility": 1.89
},
"conversion_factor": 32.74,
"calculated_payment": {
"non_facility": 86.76,
"facility": 61.88
}
}
},
{
"input": "99214",
"hcpcs_code": "99214",
"status": "ok",
"data": {
"hcpcs_code": "99214",
"description": "Office or other outpatient visit, established patient",
"status_code": "A",
"rvu": {
"work": 1.92,
"pe_non_facility": 1.73,
"pe_facility": 0.78,
"mp": 0.1,
"total_non_facility": 3.75,
"total_facility": 2.8
},
"conversion_factor": 32.74,
"calculated_payment": {
"non_facility": 122.78,
"facility": 91.67
}
}
}
],
"meta": {
"legal": {
"license": "public_domain",
"attribution_required": false,
"source_name": "CMS Physician Fee Schedule/RVU Files",
"citation": "CMS Physician Fee Schedule Relative Value Files. Accessed via FHIRfly."
}
}
}Batch requests count as 1 request toward your rate limit.
SDK Usage
Node.js
import { Fhirfly } from "@fhirfly-io/terminology";
const client = new Fhirfly({ apiKey: "your-api-key" });
// Single lookup
const pfs = await client.claims.lookupPfs("99213");
console.log(`Work RVU: ${pfs.data.rvu.work}`);
console.log(`Non-facility payment: $${pfs.data.calculated_payment.non_facility}`);
console.log(`Facility payment: $${pfs.data.calculated_payment.facility}`);
// Batch lookup
const batch = await client.claims.lookupPfsMany(["99213", "99214"]);
for (const result of batch.results) {
if (result.status === "ok") {
console.log(`${result.hcpcs_code}: $${result.data.calculated_payment.non_facility}`);
}
}
Required Scopes
claims.read— Single and batch PFS/RVU lookups
See Also
- MUE Limits — Maximum units per service
- Coverage Determinations — LCD policy lookups
- Claims Intelligence Overview — All claims APIs