Specialty Drug Rates
What each insurer pays for every specialty and infusion drug, and for administering it.
Negotiated rates for every specialty and infusion drug code, plus the administration codes, measured against the federal benchmark.
Buy the slice you need
You do not have to take the whole grid. Every slice is the same columns, the same quality gates and the same quarterly refresh over less of it — and slices stack, so nothing is ever bought twice.
One molecule, every insurer
A single drug across all 37 insurers and every state. The floor price, and the usual way a launch team starts.
One therapeutic area
Every drug in a class — the immunology set, the bone agents, the anti-emetics — across all 37 insurers.
One state, every drug
The whole specialty set in a single state. For a provider who only bills in one place.
All specialty and infusion drugs
The whole drug set with the administration codes, all 37 insurers, all 50 states and DC. This is the standard buy.
What is in it
- Every specialty and infusion drug code, plus the five administration codes (96413, 96415, 96365, 96360, 96372)
- 37 insurers across all 50 states and DC
- Split by setting — doctor’s office, hospital outpatient, home
- Each rate next to Medicare, ASP+6% and what the drug costs to buy
- A new build every quarter, in Parquet and CSV
Questions it answers
- What does this insurer pay for zoledronic acid in Texas, and how does that compare with Medicare?
- Which of our top ten drugs are paid below the federal benchmark, and in which states?
- What is a practice actually paid for the first hour in the chair, separately from the drug?
What it does not do
These are market-level ranges by insurer, state and code. Provider-level detail is a different resolution and is in development.
That is Payer Coverage Requirements.
Who buys this
- Infusion centers and specialty practices pricing their next contract
- Field reimbursement and market access teams at drug manufacturers
- Investors underwriting an infusion or oncology platform
Why it is worth the money
The administration codes are included
Most rate data covers the drug and stops there. This includes CPT 96413, 96415, 96365, 96360 and 96372, so you can see what a practice is paid for chair time as well as for the drug. No other published dataset benchmarks these.
Every drug rate sits next to the federal benchmark
Each row shows what commercial pays as a percentage of ASP+6%. You can tell in one column whether an insurer pays above or below what Medicare would.
You get the range, not just an average
Every row carries the 10th through 90th percentile, how wide the spread is, and how many providers are behind it. You can see straight away whether a number rests on three rates or three thousand.
Drug cost is attached
Acquisition cost sits in the same row as the rate, so you can work out margin without buying a second dataset.
What a row looks like
Real rows from the current build, in the shape this dataset ships.
| Insurer | State | Rates | p10 | Median | p90 | Quality | Flagged |
|---|---|---|---|---|---|---|---|
| uhc | NY | 6,221 | $23.36 | $33.23 | $54.72 | 72.5 | no |
| uhc | CA | 6,092 | $25.52 | $34.83 | $64.87 | 72.5 | no |
| uhc | FL | 5,923 | $24.03 | $32.99 | $58.86 | 72.5 | no |
| aetna | FL | 5,611 | $30.03 | $1,591.69 | $4,227.98 | 65.0 | yes |
| uhc | TX | 5,472 | $24.41 | $33.22 | $57.82 | 72.5 | no |
| aetna | CA | 5,329 | $31.64 | $1,654.20 | $4,295.29 | 65.0 | yes |
The columns
Published in full, before you talk to anyone. Whether this fits your model is a technical question and you should be able to answer it yourself.
rate_intel
Specialty and infusion rates at tax-ID level, with the ghost count, the confidence interval and the federal benchmark already on every row. This is the production table, column for column.
Key vintage × payer × state × billing_code × billing_code_modifier × billing_class × tin
| Column | Type | What it is |
|---|---|---|
vintage key |
TEXT | Which quarterly build the row belongs to. Current is 2026-Q2-06. |
payer key |
TEXT | The insurer the rate is attributed to. |
src_payer |
TEXT | The file it came out of. Kept because one insurer’s file can carry rates for several. |
state key |
TEXT | Two-letter state. |
billing_code key |
TEXT | HCPCS or CPT. |
billing_code_modifier key |
TEXT | Part of the key. Averaging across modifiers gives a wrong number that looks right. |
service_code |
TEXT | Place-of-service grouping as the insurer filed it. |
billing_class key |
TEXT | professional or institutional. |
negotiated_type |
TEXT | negotiated, fee schedule, derived, or blank. |
tin key |
TEXT | Tax ID. This is what makes the table entity-level rather than market-level. |
n_obs |
BIGINT | Observations behind the row after filtering. |
n_raw |
BIGINT | Observations before filtering. |
n_ghost |
BIGINT | How many were ghost rates — codes that provider would never bill. Counted, not silently dropped. |
n_unit_uncertain |
BIGINT | Rows whose billing unit could not be resolved. Per-vial against per-milligram lives here. |
rate_raw |
DOUBLE | Before unit normalization. |
rate_final |
DOUBLE | After. This is the number to use. |
sd_used |
DOUBLE | Standard deviation behind the interval. |
ci_low |
DOUBLE | Lower bound of the confidence interval. |
ci_high |
DOUBLE | Upper bound. A wide interval is telling you something. |
veracity |
TEXT | measured where the rate is observed, otherwise how it was derived. |
proxy_source |
TEXT | What stood in when the rate was not directly observed. |
confidence |
DOUBLE | 0 to 1. Set your own floor; ours is high. |
medicare_bench |
DOUBLE | Medicare allowed for the same code and locality. |
asp_per_unit |
DOUBLE | CMS average sales price. Drugs only, null for procedures. |
asp_plus6 |
DOUBLE | ASP plus 6 percent, the federal drug benchmark. |
ratio_vs_medicare |
DOUBLE | The rate over the Medicare allowed amount. |
ratio_vs_asp6 |
DOUBLE | The rate over ASP+6%. Under 1 means commercial pays less than the federal benchmark. |
anchor_source |
TEXT | What the row was anchored against, usually medicare. |
triangulation |
TEXT | Whether independent sources agreed. |
Traps in this data, and how we handle them
These catch people out whoever they buy from. They are worth knowing before you model anything with rate or coverage data, including ours.
Most rows in the raw files are rates nobody would ever bill
Why it bitesPublished research on Transparency in Coverage data found the median insurer’s file was 95.7% ghost rates — provider and code pairs like a podiatrist priced for open-heart surgery. Across 61 insurers, 95.4% of pairs were ghosts. An average taken straight off a raw file is mostly noise.
How we handle itEvery row carries a distinct provider count and a 0 to 100 quality score, and we flag rather than delete, so you can set your own floor and see what you excluded. Our own published work uses 70 and above.
Some rates are a percentage, not a dollar amount
Why it bitesInsurers must publish a dollar figure wherever one can be calculated in advance. Where the contract is genuinely a percentage of billed charges, they publish the percentage instead. A 45 sitting next to a 4,500 is not a cheap version of the same thing.
How we handle itThe rate type travels with the value in every row. We never silently convert a percentage into dollars, and percentage rows are kept out of dollar comparisons rather than quietly averaged in.
A contracted rate is not what got paid
Why it bitesThese files describe what an insurer agreed to pay. They say nothing about deductibles, coinsurance, denials, retroactive adjustments or what actually landed on the remittance.
How we handle itWe say so on every page rather than in a footnote. If you need what was paid rather than what was agreed, this is the wrong dataset and we will tell you so before you buy it.
One insurer publishes many networks
Why it bitesA large insurer files rates for PPO, HMO, exchange, rental and administrative-services-only networks. Blending them produces a single rate that no provider is actually paid.
How we handle itNetworks stay distinct. Where you want one number we tell you which network it came from rather than averaging across products that are not comparable.
Averaging across modifiers gives a wrong number that looks right
Why it bitesJW and JZ change how drug wastage is billed. 26 and TC split a professional read from the equipment. Collapse them and the distribution shifts without any obvious sign.
How we handle itModifier is part of the key. The schema says so above the columns, and the sample is built so you can see the effect yourself.
Insurer names on multi-state files are not always what they seem
Why it bitesA file downloaded into one folder can carry a different company name inside it, which matters for plans operating across several states.
How we handle itWe are re-deriving names from file contents. Until that is finished every row carries a confidence column, so you can keep only the attribution you trust.
What to know before you buy
- We are re-checking insurer names on files from plans that operate in several states. Every row carries a confidence column so you can keep only the attribution you trust.
- Quarter-to-quarter change columns arrive with the next build. Today the file is a single point in time.
- Six insurer groups are not in this build. They are named on the coverage page.
Load it against your own model
Three states, the production columns, real rows, downloaded directly with no form in front of it. It is the fastest way to answer the fit question.