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

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