Dashboard

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

MethodPathDescription
GET/v1/pfs/:hcpcsSingle PFS/RVU lookup
POST/v1/pfs/_batchBatch 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

ParameterRequiredDescription
hcpcsYesHCPCS/CPT code (path parameter, 4-5 alphanumeric characters)

Batch Lookup

ParameterRequiredDescription
codesYesArray of HCPCS/CPT codes (request body, max 100)

Understanding the Response

RVU Breakdown

FieldTypeDescription
worknumberWork RVU — physician effort
pe_non_facilitynumberPractice Expense RVU for non-facility (office) setting
pe_facilitynumberPractice Expense RVU for facility (hospital) setting
mpnumberMalpractice RVU
total_non_facilitynumberSum of work + pe_non_facility + mp
total_facilitynumberSum of work + pe_facility + mp

Payment Calculation

FieldTypeDescription
conversion_factornumberCMS conversion factor (dollars per RVU)
calculated_payment.non_facilitynumbertotal_non_facility * conversion_factor
calculated_payment.facilitynumbertotal_facility * conversion_factor

The calculated payment is the national base rate before geographic adjustments (GPCIs). Actual Medicare payments vary by locality.

Indicators

FieldTypeDescription
global_daysstring | nullGlobal surgery period ("000", "010", "090", "XXX", "YYY", "ZZZ")
multiple_surgerystring | nullMultiple surgery indicator
bilateral_surgerystring | nullBilateral surgery indicator ("0" = 150%, "1" = 150% if modifier 50, "2" = bilateral already included)

Status Codes

CodeMeaning
AActive — separately payable code
BBundled — payment included in another code
CCarrier-priced — no national fee, priced by MAC
IInvalid — not payable under PFS
NNon-covered — not covered by Medicare
RRestricted — 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