Methodology
What each figure in Soro Data means, where it comes from and how we process it along the way. Every definition here describes a rule our software enforces, not a marketing claim.
Hospital side: the machine-readable files hospitals publish
Every hospital must publish a machine-readable file (MRF) of its standard charges under 45 CFR 180. We fetch the file from the hospital's own site, record its URL, size, checksum and retrieval time, and read every row that carries a billing code and a payer-specific negotiated amount.
Gates
Before any of its rows enter our data, a file must pass a set of checks we call gates. We refuse a file when it has no hospital name; no rows we could scan; no payer names; a reported date that is missing, in the future or older than the rule allows; an unrecognized schema version; no NPI; an implausible maximum rate; or a share of retained rows showing that the parser misread it. We record each refused file with the gate it failed, so a hospital is never silently left out.
Normalization
- Codes. The code system is read from the row (CPT, HCPCS, MS-DRG, revenue code). DRG and revenue codes are stored without leading zeros:
DRG 0470andDRG 470are the same code. Modifiers are kept on the export row, not folded into the code. - Setting. Inpatient and outpatient rows are kept separate where the file says which is which; where it does not, the row is left unlabeled rather than guessed.
- Dollar rows only. A negotiated dollar amount is a rate. A percentage of charges or an algorithm is kept as what it is (
negotiated_percentage,negotiated_algorithm) and is never converted into a dollar figure unless the file itself supplies the estimated amount. The percent-of-charge view labels every derived figure as an estimate. - Outliers are left out, not flagged. A figure far outside the market for its code, such as a percentage typed as dollars or a 999,999.99 placeholder, is removed from the rates we serve, and the source file keeps it. The test, and the few places it does not apply, are set out under Outliers.
Min, median and max
For each hospital and code we hold the number of payer-specific dollar rows and their lowest, median and highest values. The population is every payer-and-plan row that carries a negotiated dollar amount for that code at that hospital. We count rows, not distinct dollar values, so two plans with the same figure count twice. The $1 floor applies first: a posted figure under one dollar is a placeholder, not a price, and is left out of the count, the minimum, the median and the maximum. Dropped placeholders are counted in the dataset (placeholderRatesDropped), and the raw export still contains them. With an even count, the median is the mean of the two middle rows in our state-level rate index; in our hospital-level datasets it is the upper of the two middle rows. We state both conventions because both are in use, and they differ only when the two middle rows differ. Across hospitals, a code's percentiles are computed over the per-hospital medians, so a hospital that lists forty plans for one code counts once.
Payer side: the Transparency in Coverage (TiC) files insurers publish
Insurers publish their in-network negotiated rates under the Transparency in Coverage rule (85 FR 72158). These files are enormous and highly repetitive, and reading them well is where most of our work has gone.
What a figure is: max observed
For one insurer file, one hospital and one billing code, the figure we hold is the maximum qualifying negotiated dollar amount on file for that code at that facility. Facility (institutional) prices and professional (clinician) fees are held separately. Every dollar statistic on a payer profile uses the facility figures only: the per-code median, 25th and 75th percentiles, minimum and maximum, the distribution by code system, and the Medicare and all-payer ratios. Each is a statistic of these per-hospital maximums, one per hospital and code, not of every plan-level quote, and the data we serve says so (basis: "maxObserved" on each row and a note on the profile). The figure is not a single contracted price. One hospital can carry several plan-specific figures for one code inside one payer file, and we keep the maximum so that every figure means the same thing across payers. Every column that shows it is labeled max observed, never rate.
Quotes, not cells
A cell is one (payer file, hospital, code) triple. A quote is one distinct (hospital, code, dollar). Our coverage figures count quotes. Counting cells instead would overstate our data about seventeen times over, because the same negotiation appears in file after file (see the next section).
BlueCard restatement: the visible difference
When a Blue Cross plan covers a member treated outside its own state, it pays the local Blue's negotiated rate and republishes that figure in its own file. Horizon's price for DRG 470 at a New Jersey hospital appears, to the dollar, in Anthem's file, Highmark Pennsylvania's and HMSA Hawaii's. That is one negotiation, not four. A tool that counts each file separately would count it four times; we count it once.
Three mechanisms cause the repetition, and we handle each one differently:
- Some whole files are copies. Regence's Idaho, Washington and Oregon files are identical in every cell. We detect an exact copy with a content hash over every (hospital, code, cents) triple; it contributes nothing to any count, and the payer entity it duplicates lists it. A near-copy (within 0.1% on cells and hospitals, such as Aetna ALICFI against Aetna CVS Health) is kept and flagged sameShapeAs, because its handful of genuine differences are real prices.
- BlueCard. For every quote we record which plan negotiated it and on what basis. A plan outside the Blue Cross Blue Shield system is always its own negotiator. Among the Blues, the plan whose home state is the hospital's state is the negotiator, and every other Blue that restates the figure is republishing it. The bases are
negotiated(the plan's own figure),shared-blues(the local Blue's figure, restated by other Blues),out-of-area(a single Blue publishing outside its home states, with no local plan on that figure) andunattributed(the hospital's state could not be resolved, so no local plan can be named). Republications are left out of the default view and can be shown with one toggle; they are counted either way. - Genuine differences are kept. Only about a third of hospital × code pairs have every payer on the same figure. Republication is decided cell by cell, never payer by payer: BCBS Michigan can match Horizon on one code at a hospital and differ on the next.
On a payer profile this is the first panel: how much of the file the entity negotiated itself, how much it republishes, and how often other files restate its own negotiations. A Blue whose file is 99% republication is a thin source for that Blue's own contracting, and its score says so.
Known limitation. When two files from the same local Blue family publish one figure at a home-state hospital (for example a carrier's HMO and PPO files), the negotiation is credited to the first file in index order, and the other file shows it as a republication. Head-to-head comparisons between Blues exist only in their home states, because a distinct figure from a Blue outside its home state cannot be attributed to a negotiator.
Medicare relativity
The commercial-to-Medicare ratio for a figure is that figure divided by the CMS Medicare rate for the same code. The anchor is CMS's own national amount for the code, from the 2026 physician fee schedule (July release): the non-facility amount where CMS prices one, and the facility amount where it does not. A lab code the physician fee schedule does not pay takes its national limit from the 2026 clinical lab fee schedule (third quarter). Drugs, anesthesia and carrier-priced codes have no national amount in those files, and MS-DRG and revenue codes have no anchor here; a profile says so rather than substituting one. A hospital facility figure divided by a professional fee schedule anchor is a relative measure, not a claim that the two are the same service; we state it that way so payers can be compared on one scale.
On a payer profile, the ratio by code system is the median over every hospital × code cell that has an anchor. The ratio by code family (surgery, radiology, pathology and so on) is the same median within the CPT grouping, and the ratio on a code row is that code's median max-observed figure over its anchor.
Outliers
Some filings are wrong: a percentage typed as dollars, a per-day figure in a per-service column, a placeholder such as 999,999.99. A figure that fails the test below is left out of what we serve rather than shown with a flag. We never edit a figure, and the source files still hold every one we leave out.
- Against the market. A figure is compared with the median for its code on its own side of the market: hospital medians, payer quotes or provider quotes. A hospital figure is also compared with the payer side's median, and a payer quote with the hospital side's. It is left out when it is ten times a median or more, or a tenth of it or less, against every one of those medians that has at least five figures behind it, so a figure that is ordinary on either side is kept.
- Against Medicare. When no median has five figures behind it, the reference is the code's Medicare rate: fifty times Medicare or more, or a twentieth of it or less.
- On its own. A figure of zero or less, or a single service at $5 million or more ($20 million for a DRG), is left out whatever the market shows.
A hospital whose median for a code fails is left out of that code, and a failing low or high leaves that end of its range blank. A payer or provider quote that fails is left out on its own. Searches, rate tables, the percentiles on a code benchmark, the code lists on hospital profiles, export files, the API and the MCP server all work from what remains. A provider's fee schedule has no single market to test against, so there we leave out only figures that are absurd on their face: zero or less, at or over the $5 million cap ($20 million for a DRG), or an all-nines placeholder of $99,999 or more.
Where the test does not apply. Payer profiles and the hospital and payer scores are computed when they are built, and this test is not part of that build. A payer profile's own check is the Plausibility part of its data-quality score, described under Scores.
Percentiles
One method everywhere. Every percentile in Soro Data is linear interpolation between order statistics, the definition statisticians call R-7 and spreadsheets call PERCENTILE.INC. That covers the market benchmarks and their tiles, the geographic markets page, contract analysis, the hospital profile distributions and price position, the payer per-code 25th and 75th percentiles, the reimbursement index in rate history and the simulator curves. Sort the population in ascending order as x0 … xn−1, take the rank r = p/100 × (n−1), and the percentile is x⌊r⌋ + (r − ⌊r⌋) × (x⌈r⌉ − x⌊r⌋). For n = 1 every percentile is that one value. By this rule the 50th percentile is the median, and for an even count it is the mean of the two middle values. The same population gives the same 25th percentile everywhere: a code's 25th percentile in the contract workspace is the figure the markets page shows.
For a code benchmark, the population is one value per reporting hospital (its median). For a payer's per-code figures, the population is the payer's max-observed figure per hospital. The one figure not computed this way is a payer's system-level rate distribution (the histogram of every max-observed figure in a code system), which is read from a log-spaced histogram with 400 bins and is accurate to about ±3%; it is labeled as such.
Position against the market uses cells where at least two insurers negotiated a distinct figure at the same hospital and code. For each such cell, the payer's ratio is its figure over the median of every distinct figure at that hospital for that code. "Lowest" and "highest" are the shares of those cells where the payer's figure is the minimum or the maximum.
Geography
A hospital's state is the state of the facility record it matches in our directory (CMS provider data, matched by NPI and then by name). A hospital that matches no record is "unknown" and is never attributed to a local plan. A payer's market is a state: the state-level median of the payer's ratio to the hospital median over the cells described above, shown only where at least 30 cells exist. A median more than 5× or under 0.2× is flagged as a unit warning rather than hidden, because it almost always means one file in that market published a percent-of-charge or per-diem figure in the dollar field. County, metropolitan-area and ZIP definitions belong to the geographic benchmarks and are documented with them where that module is available.
Scores
Payer data-quality score (0 to 100)
- Freshness (25 points). The median age of the dated source files: 25 points within 45 days, 20 within 90, 12 within 180 and 5 beyond; 10 when no date can be read from the file names.
- Coverage (20 points). Hospitals in the file compared with the largest file in our data (12 points), plus codes the entity negotiated itself compared with 20,000 (8 points).
- Attribution (20 points). The share of the file's cells that are the entity's own negotiation.
- Originality (15 points). One minus the share of its own negotiations that other files also restate.
- Plausibility (20 points). One minus ten times the share of its quotes that are implausible: under $1, over $5 million, or ten times off the hospital's own median on a cell with at least three distinct quotes.
Letter grades: A at 85 or more, B at 70, C at 55, D at 40 and E below 40. The profile shows the reason behind each part, so the grade can be checked. The attribution reason also shows how many of the rows credited to the entity could not be attributed to a negotiating plan (out-of-area or unattributed basis), and what share of the credited rows they are.
Hospital scores (0 to 100, letters A to E)
A hospital profile carries six scores: five components and their weighted blend. The hospital page shows three of them (the overall score, price position and rate stability), each with the sentence that explains it.
- Price position (weight 35%). Across the codes the hospital shares with other profiled hospitals, we divide its median negotiated rate by the national median of hospital medians for the same code (the state median when the national comparison is too thin). The median of those per-code ratios is the hospital's median index. An index of 0.6× or lower scores 100, 1.0× scores 60 and 1.6× or higher scores 0:
100 − (index − 0.6) × 100, kept between 0 and 100. The comparison set is the profiled hospitals, not all of our data, and the explanation gives the share of codes priced above and below the comparison median. - Disclosure completeness (20%). Half of it is the share of the CMS-specified shoppable services (45 CFR 180.60 Table 3) the file prices with a negotiated dollar amount; 30% is the number of codes disclosed, on a log scale that reaches 1 at 10,000 codes; and 20% is the share of the four code systems (CPT, HCPCS, MS-DRG, revenue) present.
- File quality (20%). Starts at 100. A file that failed a gate scores 0 outright; otherwise we deduct 20 for each gate warning, 15 when the file is older than the freshness window, 10 when the source could not be re-verified, 15 when the file predates CMS schema v2.0, 10 when no NPI is declared, 10 for an implausible maximum rate (over $5M), 15 when most rows carry an estimated amount rather than a negotiated dollar, and 10 when the file's own date is past the stale threshold.
- Payer coverage (15%). The number of payers named times the breadth of codes disclosed, ranked as a percentile among the profiled hospitals in the same state (nationally when fewer than five are profiled there).
- Rate stability (10%). Needs two observations of the hospital's file: the share of codes observed at least twice whose rate moved by less than 5% between the last two observations. Until a second observation exists, it is "not yet measurable" and is left out.
- Overall. The weighted blend of the five. A component that cannot be measured yet is left out, the remaining weights are rescaled, and the explanation says which components were blended.
Letter grades for every hospital score: A at 85 or more, B at 70, C at 55, D at 40 and E below 40.
A state compliance report keeps three different "stale"s apart: freshness is the file's own date against the 400-day warn and 730-day stale windows (current / warn / stale / unknown), links is the HTTP re-check of the source URL (ok / broken / unreachable / unchecked), and driftStale is the tracker's count of sources whose file changed since the drift baseline. Disclosure completeness (40% shoppable coverage + 30% MS-DRG breadth + 15% payer names + 15% NPI) is measured only for hospitals with a hospital-first pack; a hospital the corpus knows only through the state browse index has no coverage check and is reported as not measured (null, with the reason) rather than scored, and state averages are taken over the measured hospitals only.
Contract analysis
Each contract rate is compared with the chosen percentile (R-7, as above) of the market for its code. Gap = target − rate. We publish two gap percentages, each named for its denominator: gapPctOfTarget = gap ÷ target (the shortfall as a share of the market target) and gapPctOfRate = gap ÷ contract rate (the increase the contract would need). Opportunity = gap × annual volume, where a volume is on file.
The market depends on the document. A professional fee schedule (one that names a provider) is compared with the provider-group rates the payers' own price files list for each code, nationally, with outliers left out; a code is used when the files hold at least five such rates and at least 90% of them are professional. A facility contract is compared with the distribution of hospital medians for each code, nationally. Neither is split by state or specialty, because the payers' files do not say where a group practises or what its specialty is.
Provider rates and profiles
Every provider rate comes from the payers' own Transparency in Coverage (TiC) in-network files. A payer's file lists a rate against a provider group, named by its tax ID and the NPIs billing under it, with a billing class (professional or facility) and an arrangement (negotiated or fee schedule). We show the highest negotiated dollar each payer's files list for a group, code and class, as max observed. A payer whose files do not name the group is shown as not listed, which is not the same as out of network.
A provider profile has the same sections for every NPI, each from one public or payer source: NPPES for who the NPI belongs to and its NUCC taxonomy; CMS's clinician directory for Medicare enrollment and hospital affiliations; the payers' price files for in-network rates and their allowed-amount files for out-of-network payments; and CMS Medicare Part B for patients, services and allowed amounts. When no payer lists a clinician, the profile may show the practice the clinician bills through, saying how we know: reported to Medicare, a colleague in the same Medicare group, or an address match, which is labeled as inferred. No third-party fee-schedule sample feeds a provider rate or profile.
What each plan sees
Every limit is enforced on the server; the page only decides how a held-back figure looks. A page above your plan shows a card naming the plan that includes it. For a visitor who is not signed in, the server returns coverage, counts, ranks, restatement structure and figures rounded to two significant figures, but no exact dollar amount. A free account adds Free search: the low, median and high rate for one code at one hospital, up to 25 lookups a day. Rate Exports adds hospital, payer and provider rates as CSV files with every dollar filled in, and removes the daily limit on Free search; the analytics pages stay closed. Market Analytics and higher plans see every figure exactly, including Medicare rates (public CMS data) and the percent of Medicare. Taxpayer identification numbers (TINs) appear only on Market Analytics and higher plans, and bulk exports never include them.
Glossary
Every term used in Soro Data, in one place.
- All-payer median
- For one code, the median of every distinct quote across every payer file at every hospital; the reference a payer's per-code median is compared against ("vs all payers").
- Artifact
- The single JSON file our pipeline builds from an insurer's source files (for example
tic-cigna.json), holding the payer name, the list of source URLs, the build time and one entry per hospital. - Attribution
- Which plan negotiated a quote. A plan outside the Blue Cross Blue Shield system is credited with its own quotes; a Blue quote is credited to the plan whose home state is the hospital's state.
- Band
- A ratio rounded to two significant figures (1.374 becomes 1.4), shown with a tilde on plans below Market Analytics.
- Basis
- Why a quote is attributed the way it is: negotiated, negotiated and restated by other Blues, out of area, or unattributed. See BlueCard.
- BlueCard
- The Blue Cross Blue Shield program under which a member treated outside the home plan's state is paid at the local Blue's negotiated rate. It is the reason one negotiation appears in many insurer files.
- Blue family
- Every entity that is a Blue Cross Blue Shield licensee, across parents. A filter on the payer-rates page.
- CCN
- CMS certification number, the six-character ID of a Medicare-certified facility.
- Cell
- One (payer file, hospital, code) triple. Cells are what a file contains; quotes are what we count.
- Code family
- The CPT section a code belongs to (Surgery, Radiology Procedures, Pathology and Laboratory, and so on), used to group Medicare relativity.
- Code system
- CPT (procedures), HCPCS (supplies, drugs, services), MS-DRG (inpatient stays), REV (revenue codes, the UB-04 line categories).
- Content hash
- SHA-256 over every (hospital, code, cents) triple in an artifact. Two artifacts with one hash are exact duplicates.
- Contract type
- On the facility directory, how a payer's group of rates is expressed: dollar, percentage of charges, per diem, case rate or fee-for-service.
- Coverage
- How many hospitals, states and codes a figure or a file spans. Always counted in quotes, never cells.
- Cross-check (verified)
- A row where the hospital's posted file and the payer's posted file independently report figures within 10%. Marked with a badge; there is no "not verified" state.
- Discounted cash price
- The hospital's posted price for a patient paying without insurance, read from the hospital's MRF.
- Drift
- A change in a tracked source file since the last check: a new ETag, length or last-updated date.
- Duplicate (exact)
- A payer file whose content hash equals an earlier file's. It contributes nothing to any count and is listed on the profile of the entity it duplicates.
- Entity
- One payer file, with any exact duplicates of it merged in.
- Family (parent)
- The corporate parent behind a set of entities: HCSC, Highmark, Elevance, UnitedHealth Group, Regence and so on. A filter on the payer-rates page.
- Fee schedule
- A provider group's negotiated rates for one payer, from that payer's Transparency in Coverage files: every code the files list against the group's tax ID.
- Freshness
- How old the source files are, read from the publication date in their names; the first part of the data-quality score.
- Gate
- A check a hospital file must pass before its rows enter our data. A refused file is recorded with the gate it failed.
- Gross charge
- The hospital's undiscounted list price for a service, the base that percent-of-charge contracts multiply.
- Head to head
- Between two payers: the cells where both negotiated a distinct figure at the same hospital and code, the share where each is higher, and the median of their ratio.
- Home state
- The state(s) a Blue plan is the licensee for. Decides BlueCard attribution.
- Hospital MRF
- The machine-readable standard-charges file a hospital publishes under 45 CFR 180.
- Max observed
- The maximum qualifying negotiated dollar on file for one code at one facility in one payer file. Facility (institutional) and professional figures are held separately, and the statistics on a payer profile use the facility figures only. The payer-side figure; never called a rate.
- Medicare rate
- CMS's national amount for a CPT or HCPCS code: the physician fee schedule amount, or the clinical lab fee schedule limit for a lab code. Public CMS data, shown with Market Analytics.
- Medicare relativity
- A figure divided by the Medicare rate for the same code; "2.6×" means 260% of Medicare.
- Median
- The middle value of a population; with an even count, the mean of the two middle values (the 50th percentile under R-7). The one exception is the per-hospital, per-code median in our hospital-level datasets, which takes the upper of the two middle rows. See Percentiles.
- Min / median / max
- On the hospital side, the lowest, middle and highest payer-specific dollar rate for one code at one hospital.
- Near-copy
- A payer file within 0.1% of another on hospitals and cells. Kept and flagged, because its differences are real.
- Network / product
- The plan, network or product a source file belongs to, read from the file name (HMO, PPO, individual and small group, ASO and so on). "Not disclosed" when the name carries only a plan ID.
- NPI
- National Provider Identifier, the ten-digit ID of a provider or facility. Public NPPES data.
- Originality
- The share of an entity's own negotiations that no other file restates; the fourth part of the data-quality score.
- Out of area
- A basis: a single Blue publishing a figure outside its home states with no local plan on that figure.
- Outlier
- A figure that fails the test in the Outliers section: far outside the market or the Medicare rate for its code, $5 million or more for a single service ($20 million for a DRG), or zero or less. It is left out rather than flagged, and never edited; the source file keeps it. See Outliers for where the test applies.
- Payer average
- Retired on October 27, 2026. Code benchmarks used to show a national average per payer family from a third-party data set. Each payer's rates for a code, from its own price files, are on Payer rates.
- Percent of charge
- A contract expressed as a percentage of gross charges rather than a dollar. Shown as a percentage; any dollar derived from it is labeled an estimate.
- Percentile
- R-7 linear interpolation between order statistics (PERCENTILE.INC): rank = p/100 × (n−1), interpolated between the two nearest sorted values. The one method used for every percentile in Soro Data. See the Percentiles section.
- Arrangement (provider rate)
- How a payer's file states a provider rate: negotiated (a contracted dollar) or fee schedule (a schedule amount). Shown next to the billing class, professional or facility.
- Gap % (contract)
- Gap as a percent of the market target, and gap as a percent of the contract rate. Both are published; the column says which.
- Rate floor ($1)
- A posted negotiated figure under one dollar is a placeholder, not a price; it is left out of every hospital-side count, minimum, median and maximum, and counted in the dataset as dropped.
- Plausibility
- The share of quotes that are not implausible (under $1, over $5M, or 10× off the hospital median); the fifth part of the data-quality score.
- Position
- Where a payer's figure sits among the distinct figures at the same hospital and code: lowest, below median, above median, highest, and the ratio to the hospital median.
- Preview window
- The fixed rows of a table on which a plan below Market Analytics would see exact dollars: always the first rows of the unfiltered set, so no filter, search or sort can move them. The window is currently zero rows, so exact dollars come with Market Analytics.
- Provenance
- For a source file: URL, host, size, SHA-256, fetch time, HTTP ETag and last-modified, parser, and gate result.
- Quote
- One distinct (hospital, code, dollar). The unit every coverage count uses.
- Rate group
- On the facility directory, one payer's set of rates at one hospital in one setting and code type, with its min, max and average.
- Republished
- A cell in a payer's file whose figure another plan negotiated. The republished share is the entity's cells minus its own quotes, over its cells.
- Restatement
- The same quote appearing in more than one payer file. "Also published by" counts the other files; "restated by others" is the share of an entity's own quotes that other files carry.
- Retrieval timestamp
- When our pipeline fetched a source file (fetchedAt), distinct from the date the publisher put in the file name (published on).
- Service line
- A named working set of high-volume codes (orthopedics, cardiology, imaging and so on) used by the simulator and the exports.
- Setting
- Inpatient or outpatient, as the file states it.
- A basis: the local Blue's negotiated figure, restated by one or more other Blues.
- Source receipt
- The re-read of a published figure from its source file, kept beside it so a spot check can be reproduced.
- Taxonomy (specialty)
- The NUCC provider taxonomy code and label from NPPES (for example 207R00000X, Internal Medicine).
- Transparency in Coverage (TiC)
- The federal rule (85 FR 72158) under which insurers publish in-network negotiated rates and out-of-network allowed amounts.
- TIN
- Taxpayer Identification Number of a provider organization. Shown only on Market Analytics and higher plans.
- Tier
- The level of access applied to a request: a visitor who is not signed in, a signed-in account below Market Analytics, or Market Analytics and higher. The server decides it for every request.
- Unattributed
- A basis: the hospital's state could not be resolved, so no local plan can be named as negotiator.
- Unit warning
- A market whose median ratio is over 5× or under 0.2×, which almost always means one file published a percent or per-diem figure in the dollar field.
- Value score (hospital)
- The overall hospital score: a weighted blend of price position (35%), disclosure completeness (20%), file quality (20%), payer coverage (15%) and rate stability (10%), with letters A to E. Each component is explained in the Scores section.
- vs all payers
- A payer's per-code median over the all-payer median for that code.