Every CPT code has a market. That market is the distribution of negotiated rates across Cigna, Aetna, UnitedHealth, BCBS, and Humana — for that procedure, across every provider type. Once you can see the full distribution, a rate negotiation stops being a guessing game.

This guide covers how CPT benchmarks work, what data sources power them, and how to query them programmatically via the PayerBenchmark API.

What Is CPT Code Benchmarking?

CPT (Current Procedural Terminology) benchmarking is the practice of comparing negotiated rates for a specific procedure code across payers, geographies, and provider types. The goal is to answer: for a given CPT code, what is the p25, p50, and p90 negotiated rate in this market?

Before the CMS Transparency in Coverage rule (effective July 2022), this data was largely unavailable. Health insurers were under no obligation to publish their contracted rates. What existed was survey-based benchmarks from FAIR Health, Optum, and similar organizations — useful, but not derived from actual negotiated rates.

The rule changed that. Every health insurer with more than 50 enrollees is now required to publish monthly machine-readable files (MRFs) containing every negotiated rate for every in-network provider. That is roughly 2 billion rows across the five major commercial payers — and PayerBenchmark indexes all of them.

How Percentile Benchmarks Are Computed

For any given CPT code, PayerBenchmark computes rate percentiles as follows:

  1. Collect all negotiated rates for that CPT code across all payers, networks, and provider types.
  2. Filter to a consistent scope: same billing code modifier set, same service code, same rate type (fee-for-service vs. case rate).
  3. Compute p10, p25, p50, p75, and p90 across the resulting distribution.
  4. Optionally stratify by payer, geography (state, CBSA), or provider specialty.

Why p50 and p90? The p50 (median) is useful as a "market rate" benchmark. The p90 is used as a ceiling in many fee schedule disputes and OON claims. p10 reveals unusually low contracts that may reflect narrow-network or value-based arrangements.

Querying Benchmarks via API

The PayerBenchmark /v1/benchmarks endpoint returns pre-computed percentiles for any CPT code. No need to download or parse raw MRF files yourself.

GET https://api.payerbenchmark.com/v1/benchmarks
  ?procedure_code=99213
  &payer=all
  &geography=national

The response includes percentiles broken down by payer:

{
  "procedure_code": "99213",
  "geography": "national",
  "rate_count": 4821043,
  "benchmarks": {
    "p10": 52.14,
    "p25": 71.88,
    "p50": 91.20,
    "p75": 118.40,
    "p90": 148.72
  },
  "by_payer": {
    "Cigna":        { "p50": 88.40, "p90": 142.10 },
    "Aetna":        { "p50": 93.10, "p90": 151.20 },
    "UnitedHealth": { "p50": 90.80, "p90": 147.50 },
    "BCBS":         { "p50": 89.30, "p90": 146.80 },
    "Humana":       { "p50": 86.70, "p90": 139.40 }
  }
}

Cross-Payer Rate Comparisons

One of the most valuable use cases is comparing a specific payer's rate against the market distribution. For example: Is our Aetna PPO rate for 99213 above or below the national p50?

To answer this, pull the provider's contracted rate from /v1/rates and compare it to the /v1/benchmarks output for the same CPT code. If the Aetna rate is $93.10 and the national p50 is $91.20, the contract is performing at the 52nd percentile — slightly above median.

Practical tip: When benchmarking a rate negotiation, always filter benchmarks to a consistent geography and provider specialty. National benchmarks can be misleading when a payer's dominant network is in a lower-cost region.

Common CPT Codes for Benchmarking

The highest-value CPT codes for benchmarking are typically high-volume evaluation and management (E&M) codes, surgical procedures with significant rate spread, and codes where payer variation is known to be wide:

  • 99213 — Office visit, established patient, low complexity (highest volume E&M code)
  • 99214 — Office visit, established patient, moderate complexity
  • 27447 — Total knee arthroplasty (high-value surgical)
  • 93000 — Electrocardiogram with interpretation
  • 70553 — MRI brain with and without contrast
  • 36415 — Routine venipuncture (high-volume, low spread)

Rate Types in MRF Data

Not all negotiated rates are created equal. MRF files contain multiple rate types, and mixing them in a benchmark will produce misleading results. The key types to filter on:

  • fee_for_service — Traditional negotiated rate per unit of service. Most common. Use this for standard CPT benchmarking.
  • case_rate — A bundled payment for an episode of care (e.g. DRG-based hospital payment). Filter these out when benchmarking individual CPT codes.
  • capitation — Per-member per-month arrangements. Not comparable to FFS rates.
  • percent_of_billed_charges — Rate expressed as a percentage of the provider's billed charge. Requires conversion before comparison.

PayerBenchmark's /v1/rates endpoint exposes rate_type on every row. Always filter to rate_type=fee_for_service when building CPT-level benchmarks.

Building a Benchmarking Pipeline

For teams running ongoing rate analysis, a simple benchmarking pipeline looks like this:

  1. Pull your contracts' CPT codes and payer-specific negotiated rates from your practice management or contract management system.
  2. For each CPT code, call /v1/benchmarks to get the current national and regional p50/p90.
  3. Calculate each rate's percentile position within the market distribution.
  4. Flag codes where your rate is below p25 (likely underpaid) or above p90 (potentially outlier).
  5. Schedule this to run monthly, aligned with PayerBenchmark's refresh cycle, so your benchmarks stay current.

This gives you a continuously updated view of where every payer's rate stands relative to the market — without downloading or parsing a single MRF file.

Start Benchmarking CPT Rates Today

API access to 2B+ negotiated rate rows across Cigna, Aetna, UHC, BCBS, and Humana. Sub-50ms queries.

Get API Access →