<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: VBC Risk Analytics</title>
    <description>The latest articles on DEV Community by VBC Risk Analytics (@vbc_risk_analytics).</description>
    <link>https://dev.to/vbc_risk_analytics</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3862747%2F76a5f1ff-1c8f-4dbe-97a6-e1e8dcf4a599.png</url>
      <title>DEV Community: VBC Risk Analytics</title>
      <link>https://dev.to/vbc_risk_analytics</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vbc_risk_analytics"/>
    <language>en</language>
    <item>
      <title>HCC V28 Explained: What Actually Changed from V24</title>
      <dc:creator>VBC Risk Analytics</dc:creator>
      <pubDate>Tue, 09 Jun 2026 14:56:35 +0000</pubDate>
      <link>https://dev.to/vbc_risk_analytics/hcc-v28-explained-what-actually-changed-from-v24-4g1h</link>
      <guid>https://dev.to/vbc_risk_analytics/hcc-v28-explained-what-actually-changed-from-v24-4g1h</guid>
      <description>&lt;p&gt;If you maintain anything that touches risk adjustment, the CMS-HCC model version is effectively a breaking dependency upgrade — and the industry is mid-migration from V24 to V28. Here's the changelog view.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The HCC map was &lt;strong&gt;reorganized and renumbered&lt;/strong&gt; — V24 HCC numbers do not line up with V28.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;count of payment HCCs changed&lt;/strong&gt; and a number of categories were &lt;strong&gt;constrained or removed&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coefficients were re-estimated&lt;/strong&gt;, so the same member can produce a different RAF under V28 vs V24.&lt;/li&gt;
&lt;li&gt;CMS is &lt;strong&gt;phasing V28 in over multiple payment years&lt;/strong&gt; — both models are live simultaneously during the blend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this breaks in practice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hard-coded HCC numbers.&lt;/strong&gt; Any mapping table keyed on V24 HCC IDs is wrong under V28. Treat the model version as an explicit input through your whole pipeline, not a constant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend comparisons.&lt;/strong&gt; Year-over-year RAF deltas during the phase-in are partly &lt;em&gt;model artifact&lt;/em&gt;, not real population change. If you don't separate "blend shift" from "true shift," your dashboards lie.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditions that used to pay.&lt;/strong&gt; Some diagnoses that mapped to a paying category under V24 don't under V28. Documentation behavior that was fine before can quietly under-capture now.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The migration checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Load &lt;strong&gt;both&lt;/strong&gt; coefficient sets; compute V24 and V28 in parallel during the blend years.&lt;/li&gt;
&lt;li&gt;Recompute historical members under V28 to get a clean apples-to-apples baseline.&lt;/li&gt;
&lt;li&gt;Flag members whose RAF moves materially between models — those are where documentation and care-gap workflows need attention. If you want a structured look at &lt;a href="https://www.rafscorecalculator.com/compare-raf-score-version-24-vs-version-28?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rsc-lb-2026&amp;amp;utm_content=p05" rel="noopener noreferrer"&gt;how V24 and V28 compare&lt;/a&gt; before you build the diff logic, that breakdown is a useful reference.&lt;/li&gt;
&lt;li&gt;Re-verify phase-in percentages and category counts against the &lt;strong&gt;current CMS Rate Announcement&lt;/strong&gt; for the actual payment year — don't trust last year's numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A side-by-side of the category remap and the phase-in schedule, plus a tool that computes a member under both models, is here: &lt;a href="https://www.rafscorecalculator.com/hcc-v28?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rsc-lb-2026&amp;amp;utm_content=p05" rel="noopener noreferrer"&gt;HCC V28&lt;/a&gt;. It's the fastest way to see, concretely, how a real member shifts under the V28 model before you trust your own implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's worth getting right
&lt;/h2&gt;

&lt;p&gt;This isn't a cosmetic version bump. RAF drives Medicare Advantage funding; a quietly wrong model version means systematically wrong risk scores for real patients. Accuracy under the correct model — not score inflation — is the entire point.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not coding, billing, or clinical advice. CMS-HCC specifications change by payment year — confirm against the current CMS Rate Announcement.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Written by Chin Ramamoorthi&lt;/strong&gt; — CEO, VBC Risk Analytics. He has 20+ years across provider- and payer-side healthcare IT, including leading V24-to-V28 transition work on both the payer and provider side.&lt;br&gt;
&lt;strong&gt;Reviewed by the VBC Risk Analytics Risk Adjustment &amp;amp; Coding Team.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Last updated:&lt;/strong&gt; June 2026&lt;/p&gt;

</description>
      <category>hccv28</category>
      <category>riskadjustment</category>
      <category>medicareadvantage</category>
      <category>healthcareit</category>
    </item>
    <item>
      <title>Building an HCC Gap Analysis Pipeline (a developer's view of risk capture)</title>
      <dc:creator>VBC Risk Analytics</dc:creator>
      <pubDate>Mon, 08 Jun 2026 08:18:40 +0000</pubDate>
      <link>https://dev.to/vbc_risk_analytics/building-an-hcc-gap-analysis-pipeline-a-developers-view-of-risk-capture-8ak</link>
      <guid>https://dev.to/vbc_risk_analytics/building-an-hcc-gap-analysis-pipeline-a-developers-view-of-risk-capture-8ak</guid>
      <description>&lt;p&gt;If you write software for a Medicare Advantage plan, "HCC gap analysis" eventually lands on your desk as a data problem disguised as a clinical one. The clinical team says "we're leaving risk on the table." What they need from you is a pipeline that finds, ranks, and tracks the gaps. Here's how I think about building one.&lt;br&gt;
﻿&lt;br&gt;
&lt;strong&gt;The mental model&lt;/strong&gt;&lt;br&gt;
﻿&lt;br&gt;
Start with definitions, because the acronyms compound fast:&lt;br&gt;
﻿&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HCC&lt;/strong&gt; — Hierarchical Condition Category. The risk bucket a diagnosis rolls up into.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAF&lt;/strong&gt; — Risk Adjustment Factor. The score built from demographics plus HCC coefficients (CMS-HCC V28 is the current model).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A "gap"&lt;/strong&gt; — a condition that is clinically supported somewhere in the data but is &lt;em&gt;not&lt;/em&gt; captured as a coded, current-year HCC.
﻿
Gap analysis is fundamentally a set-difference problem: &lt;code&gt;suspected_hccs - documented_hccs&lt;/code&gt;, weighted by the RAF impact of each missing HCC.
﻿
&lt;strong&gt;Step 1: Build the two sets&lt;/strong&gt;
﻿
&lt;strong&gt;Documented HCCs&lt;/strong&gt; come from this year's confirmed claims/encounters, mapped through the current ICD-10 → HCC crosswalk. If you don't want to maintain your own crosswalk, the &lt;code&gt;/getHCCCrosswalk&lt;/code&gt; sibling endpoint resolves ICD-10-CM codes to HCCs under a pinned model.
﻿
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;documented&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;map_icd_to_hcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMS-HCC-V28 Continuing Enrollee&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;current_year_diagnoses&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_confirmed&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;﻿&lt;br&gt;
&lt;strong&gt;Suspected HCCs&lt;/strong&gt; come from weaker signals: prior-year HCCs that didn't recur, relevant labs, medications that imply a condition, and problem-list entries that never made it to a claim.&lt;br&gt;
﻿&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;suspected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;suspected&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="n"&gt;prior_year_hccs&lt;/span&gt;            &lt;span class="c1"&gt;# chronic conditions rarely resolve
&lt;/span&gt;&lt;span class="n"&gt;suspected&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="nf"&gt;hccs_from_medications&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# e.g., insulin -&amp;gt; diabetes family
&lt;/span&gt;&lt;span class="n"&gt;suspected&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="nf"&gt;hccs_from_labs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# e.g., eGFR -&amp;gt; CKD staging
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;﻿&lt;br&gt;
To turn a candidate condition set into a RAF impact, score it through the API. The endpoint is itemized, so you get a per-HCC coefficient back rather than a single opaque number:&lt;br&gt;
﻿&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://restapi.npidataservices.com/raf/api/v1/getScore &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"ApiKey: &lt;/span&gt;&lt;span class="nv"&gt;$RAF_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"accept: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "CMS-HCC-V28 Continuing Enrollee",
    "factor": "Community NonDual Aged",
    "age": 66,
    "gender": "MALE",
    "HCC_Codes": ["E119", "C61", "N1832", "I509", "J449"]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;﻿&lt;br&gt;
Note the auth: a custom &lt;code&gt;ApiKey:&lt;/code&gt; header, &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;Authorization: Bearer&lt;/code&gt; (a Bearer header returns &lt;code&gt;401&lt;/code&gt;). ICD-10-CM codes go in &lt;strong&gt;without dots&lt;/strong&gt; (&lt;code&gt;E11.9&lt;/code&gt; -&amp;gt; &lt;code&gt;E119&lt;/code&gt;).&lt;br&gt;
﻿&lt;br&gt;
&lt;strong&gt;Step 2: Compute the gap and weight it&lt;/strong&gt;&lt;br&gt;
﻿&lt;br&gt;
A raw list of missing HCCs is noise. Engineers add value by ranking. The natural weight is the RAF coefficient — how much each closed gap would actually move the score.&lt;br&gt;
﻿&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;gaps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;suspected&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;documented&lt;/span&gt;
&lt;span class="n"&gt;ranked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hcc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;raf_delta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;coefficient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMS-HCC-V28 Continuing Enrollee&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;gaps&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;raf_delta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;﻿&lt;br&gt;
Now your clinical team gets a worklist sorted by impact instead of an undifferentiated dump. If you want the conceptual grounding for how those coefficients add up into a member's score, this RAF explainer is a solid reference — you can &lt;a href="https://www.vbcriskanalytics.com/raf-score?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=vbc-web-lb-2026&amp;amp;utm_content=p007" rel="noopener noreferrer"&gt;read more here&lt;/a&gt;.&lt;br&gt;
﻿&lt;br&gt;
&lt;strong&gt;Step 3: Close the loop with provenance&lt;/strong&gt;&lt;br&gt;
﻿&lt;br&gt;
A gap you can't explain is a gap nobody will act on. For every suggested HCC, attach the evidence:&lt;br&gt;
﻿&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"member_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SYNTH-00417"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"suspected_hcc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HCC38"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"raf_delta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"metformin (synthetic)"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prior_hcc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;﻿&lt;br&gt;
Provenance is also what protects you later. A gap closed with documentation behind it survives a RADV (Risk Adjustment Data Validation) audit; a gap "closed" by guessing does not. Build the evidence trail from day one.&lt;/p&gt;

&lt;p&gt;﻿&lt;strong&gt;Step 4: Treat it as a recurring job, not a project&lt;/strong&gt;&lt;br&gt;
﻿&lt;br&gt;
Gaps reopen. Members get new labs, conditions resolve, the model changes. Schedule the pipeline (monthly is common), snapshot the open/closed state, and track closure rate over time as your real KPI.&lt;br&gt;
﻿&lt;br&gt;
&lt;strong&gt;A few engineering gotchas﻿&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use synthetic fixtures.&lt;/strong&gt; Never test against live member data. Generate illustrative members that exercise each HCC family.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin the model version.&lt;/strong&gt; A gap computed under V28 must be reproducible later; don't let the crosswalk float.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotency.&lt;/strong&gt; Re-running the pipeline shouldn't duplicate open gaps — key on &lt;code&gt;(member, hcc, year)&lt;/code&gt;.
﻿
&lt;strong&gt;Wrapping up&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HCC gap analysis isn't glamorous, but it's one of the highest-leverage pipelines you can build on the risk-adjustment side: it directly connects documentation quality to a plan's revenue accuracy and audit posture. If you want the broader, less code-heavy treatment of finding and closing these gaps, the full &lt;a href="https://www.vbcriskanalytics.com/blogs/hcc-gap-analysis?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=vbc-web-lb-2026&amp;amp;utm_content=p007" rel="noopener noreferrer"&gt;HCC gap analysis guide&lt;/a&gt; covers the program side that complements the pipeline above.&lt;br&gt;
﻿&lt;br&gt;
&lt;em&gt;VBC Risk Analytics. Educational only — not coding, billing, or clinical advice; verify against the current CMS Rate Announcement. Synthetic data only.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vbc</category>
      <category>hcc</category>
      <category>backend</category>
      <category>healthtech</category>
    </item>
    <item>
      <title>Healthcare Risk Adjustment Tools from VBC Risk Analytics</title>
      <dc:creator>VBC Risk Analytics</dc:creator>
      <pubDate>Tue, 21 Apr 2026 15:51:40 +0000</pubDate>
      <link>https://dev.to/vbc_risk_analytics/building-healthcare-risk-adjustment-tools-an-introduction-to-vbc-risk-analytics-50n6</link>
      <guid>https://dev.to/vbc_risk_analytics/building-healthcare-risk-adjustment-tools-an-introduction-to-vbc-risk-analytics-50n6</guid>
      <description>&lt;p&gt;Healthcare data engineering is hard. Healthcare &lt;em&gt;risk adjustment&lt;/em&gt; data engineering is a category of hard that deserves its own word.&lt;/p&gt;

&lt;p&gt;If you've ever worked in health IT, you know the stack: EHR extracts that arrive in twelve different formats, ICD-10 codes that map to HCC categories under rules that change every model year, RAF scores that determine how much a health plan gets paid for every enrolled member, and CMS audits that can claw back millions if the documentation doesn't hold up.&lt;/p&gt;

&lt;p&gt;At VBC Risk Analytics, we've spent years building API-first tools in this space. This introductory post covers what risk adjustment actually is, why it's technically interesting, and what we're building — with the hope of connecting with developers, data engineers, and health IT professionals who work in this domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Risk Adjustment and Why Does It Matter?
&lt;/h2&gt;

&lt;p&gt;Risk adjustment is the process Medicare uses to ensure that health plans are paid fairly based on the health status of their enrolled members. Sicker members cost more to care for, so a plan that enrolls a predominantly sick population gets higher payments to offset those costs. A plan that enrolls predominantly healthy members gets lower payments.&lt;/p&gt;

&lt;p&gt;The mechanism that drives this is the &lt;strong&gt;Hierarchical Condition Category (HCC)&lt;/strong&gt; model — specifically, the CMS-HCC model maintained by the Centers for Medicare and Medicaid Services. Every Medicare Advantage member gets a &lt;strong&gt;Risk Adjustment Factor (RAF) score&lt;/strong&gt; that reflects their predicted cost relative to the average Medicare beneficiary.&lt;/p&gt;

&lt;p&gt;A RAF score of 1.0 means the member is expected to cost exactly as much as the average. A score of 1.5 means 50% more than average. A score of 0.7 means 30% less.&lt;/p&gt;

&lt;p&gt;The score is built by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Taking the member's demographic data (age, sex, Medicaid eligibility, etc.)&lt;/li&gt;
&lt;li&gt;Mapping their ICD-10 diagnosis codes to HCC categories&lt;/li&gt;
&lt;li&gt;Applying interaction factors for certain combinations of conditions&lt;/li&gt;
&lt;li&gt;Summing the coefficients from the CMS-HCC model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a health plan with 100,000 Medicare Advantage members, even small errors in this calculation — missed diagnoses, mapping mistakes, documentation gaps — compound into significant over- or underpayment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Complexity
&lt;/h2&gt;

&lt;p&gt;This sounds straightforward until you get into the actual implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ICD-10-to-HCC mapping&lt;/strong&gt; is not a simple lookup table. There are approximately 70,000 ICD-10-CM codes and 86 HCC categories in the CMS-HCC V28 model. Not all codes map to HCCs. Some codes map to multiple HCCs. The "hierarchical" part of HCC means that more severe conditions in a disease hierarchy suppress less severe ones — so if a patient has both HCC 18 (Diabetes with chronic complications) and HCC 19 (Diabetes without complication), only HCC 18 counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model coefficients&lt;/strong&gt; change with each model version. CMS transitioned from V24 to V28 over 2024-2026, blending the two models at different percentages each year. Code that was correct for V24 produces wrong answers for V28 if you don't update the coefficient tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The demographic adjusters&lt;/strong&gt; depend on whether a member is community-dwelling or institutionalized, whether they have Medicaid, and whether they're in their initial enrollment period. Getting these wrong affects every member, not just the complex ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RADV audits&lt;/strong&gt; add another layer. The Risk Adjustment Data Validation audit process has CMS selecting a sample of medical records and verifying that each HCC in the RAF score is supported by adequate documentation. Plans that fail RADV audits repay the overpayment — plus potential extrapolation penalties.&lt;/p&gt;

&lt;h2&gt;
  
  
  What VBC Risk Analytics Builds
&lt;/h2&gt;

&lt;p&gt;Our platform at &lt;a href="https://www.vbcriskanalytics.com" rel="noopener noreferrer"&gt;VBC Risk Analytics&lt;/a&gt; addresses the risk adjustment workflow end-to-end. A few things we've built:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAF Score API&lt;/strong&gt;: A REST endpoint that takes a member's demographics and ICD-10 codes and returns a fully calculated RAF score with HCC mapping details, model version, and coefficient breakdown. Handles V24, V28, and the blended transition percentages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ICD-10 Data Lookup API&lt;/strong&gt;: Fast lookup for ICD-10-CM codes — descriptions, HCC mappings, validity flags, hierarchy relationships. Useful for coding workflow tools, eligibility systems, and CDI applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RADV Audit Scrubber&lt;/strong&gt;: Before a RADV audit happens, this tool reviews the documentation supporting each HCC against CMS audit criteria. It flags potential documentation deficiencies so they can be addressed before CMS asks for the medical records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPI Lookup API&lt;/strong&gt;: Provider verification via the National Plan and Provider Enumeration System (NPPES), useful for linking clinical data to provider records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why API-First?
&lt;/h2&gt;

&lt;p&gt;Most risk adjustment software is built as monolithic platforms — you buy the whole system or you buy nothing. We took an API-first approach because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Most health plans and provider groups already have analytics infrastructure. They need specific capabilities, not replacement systems.&lt;/li&gt;
&lt;li&gt;Health IT developers building EHR integrations, population health tools, and care management platforms need programmatic access to risk adjustment data.&lt;/li&gt;
&lt;li&gt;APIs are testable, versionable, and composable in ways that dashboard-only tools aren't.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're building something in the health IT space and you need RAF scoring, ICD-10 lookup, or provider verification, check out the &lt;a href="https://www.vbcriskanalytics.com/healthcare-apis" rel="noopener noreferrer"&gt;healthcare APIs at VBC Risk Analytics&lt;/a&gt;. We have documentation and sandbox access available.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;In future posts on Dev.to, I'll be going deeper on specific technical topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ICD-10-to-HCC mapping algorithm — how it actually works under the hood&lt;/li&gt;
&lt;li&gt;CMS-HCC V28 changes and what broke in existing implementations&lt;/li&gt;
&lt;li&gt;RADV audit data modeling — structuring your documentation review pipeline&lt;/li&gt;
&lt;li&gt;Building a risk stratification system from claims data&lt;/li&gt;
&lt;li&gt;NPI verification edge cases and the mess that is provider data quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work in health IT or healthcare data engineering, I'd love to connect. Drop a comment below or reach out through &lt;a href="https://www.vbcriskanalytics.com" rel="noopener noreferrer"&gt;VBC Risk Analytics&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>healthit</category>
      <category>healthcare</category>
      <category>dataengineering</category>
      <category>api</category>
    </item>
    <item>
      <title>Building Healthcare Risk Adjustment Tools: An Introduction to VBC Risk Analytics</title>
      <dc:creator>VBC Risk Analytics</dc:creator>
      <pubDate>Wed, 15 Apr 2026 11:32:48 +0000</pubDate>
      <link>https://dev.to/vbc_risk_analytics/building-healthcare-risk-adjustment-tools-an-introduction-to-vbc-risk-analytics-2n41</link>
      <guid>https://dev.to/vbc_risk_analytics/building-healthcare-risk-adjustment-tools-an-introduction-to-vbc-risk-analytics-2n41</guid>
      <description>&lt;p&gt;Healthcare data engineering is hard. Healthcare &lt;em&gt;risk adjustment&lt;/em&gt; data engineering is a category of hard that deserves its own word.&lt;/p&gt;

&lt;p&gt;If you've ever worked in health IT, you know the stack: EHR extracts that arrive in twelve different formats, ICD-10 codes that map to HCC categories under rules that change every model year, RAF scores that determine how much a health plan gets paid for every enrolled member, and CMS audits that can claw back millions if the documentation doesn't hold up.&lt;/p&gt;

&lt;p&gt;At VBC Risk Analytics, we've spent years building API-first tools in this space. This introductory post covers what risk adjustment actually is, why it's technically interesting, and what we're building — with the hope of connecting with developers, data engineers, and health IT professionals who work in this domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Risk Adjustment and Why Does It Matter?
&lt;/h2&gt;

&lt;p&gt;Risk adjustment is the process Medicare uses to ensure that health plans are paid fairly based on the health status of their enrolled members. Sicker members cost more to care for, so a plan that enrolls a predominantly sick population gets higher payments to offset those costs. A plan that enrolls predominantly healthy members gets lower payments.&lt;/p&gt;

&lt;p&gt;The mechanism that drives this is the &lt;strong&gt;Hierarchical Condition Category (HCC)&lt;/strong&gt; model — specifically, the CMS-HCC model maintained by the Centers for Medicare and Medicaid Services. Every Medicare Advantage member gets a &lt;strong&gt;Risk Adjustment Factor (RAF) score&lt;/strong&gt; that reflects their predicted cost relative to the average Medicare beneficiary.&lt;/p&gt;

&lt;p&gt;A RAF score of 1.0 means the member is expected to cost exactly as much as the average. A score of 1.5 means 50% more than average. A score of 0.7 means 30% less.&lt;/p&gt;

&lt;p&gt;The score is built by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Taking the member's demographic data (age, sex, Medicaid eligibility, etc.)&lt;/li&gt;
&lt;li&gt;Mapping their ICD-10 diagnosis codes to HCC categories&lt;/li&gt;
&lt;li&gt;Applying interaction factors for certain combinations of conditions&lt;/li&gt;
&lt;li&gt;Summing the coefficients from the CMS-HCC model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a health plan with 100,000 Medicare Advantage members, even small errors in this calculation — missed diagnoses, mapping mistakes, documentation gaps — compound into significant over- or underpayment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Complexity
&lt;/h2&gt;

&lt;p&gt;This sounds straightforward until you get into the actual implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ICD-10-to-HCC mapping&lt;/strong&gt; is not a simple lookup table. There are approximately 70,000 ICD-10-CM codes and 86 HCC categories in the CMS-HCC V28 model. Not all codes map to HCCs. Some codes map to multiple HCCs. The "hierarchical" part of HCC means that more severe conditions in a disease hierarchy suppress less severe ones — so if a patient has both HCC 18 (Diabetes with chronic complications) and HCC 19 (Diabetes without complication), only HCC 18 counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model coefficients&lt;/strong&gt; change with each model version. CMS transitioned from V24 to V28 over 2024-2026, blending the two models at different percentages each year. Code that was correct for V24 produces wrong answers for V28 if you don't update the coefficient tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The demographic adjusters&lt;/strong&gt; depend on whether a member is community-dwelling or institutionalized, whether they have Medicaid, and whether they're in their initial enrollment period. Getting these wrong affects every member, not just the complex ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RADV audits&lt;/strong&gt; add another layer. The Risk Adjustment Data Validation audit process has CMS selecting a sample of medical records and verifying that each HCC in the RAF score is supported by adequate documentation. Plans that fail RADV audits repay the overpayment — plus potential extrapolation penalties.&lt;/p&gt;

&lt;h2&gt;
  
  
  What VBC Risk Analytics Builds
&lt;/h2&gt;

&lt;p&gt;Our platform at &lt;a href="https://www.vbcriskanalytics.com" rel="noopener noreferrer"&gt;VBC Risk Analytics&lt;/a&gt; addresses the risk adjustment workflow end-to-end. A few things we've built:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAF Score API&lt;/strong&gt;: A REST endpoint that takes a member's demographics and ICD-10 codes and returns a fully calculated RAF score with HCC mapping details, model version, and coefficient breakdown. Handles V24, V28, and the blended transition percentages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ICD-10 Data Lookup API&lt;/strong&gt;: Fast lookup for ICD-10-CM codes — descriptions, HCC mappings, validity flags, hierarchy relationships. Useful for coding workflow tools, eligibility systems, and CDI applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RADV Audit Scrubber&lt;/strong&gt;: Before a RADV audit happens, this tool reviews the documentation supporting each HCC against CMS audit criteria. It flags potential documentation deficiencies so they can be addressed before CMS asks for the medical records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPI Lookup API&lt;/strong&gt;: Provider verification via the National Plan and Provider Enumeration System (NPPES), useful for linking clinical data to provider records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why API-First?
&lt;/h2&gt;

&lt;p&gt;Most risk adjustment software is built as monolithic platforms — you buy the whole system or you buy nothing. We took an API-first approach because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Most health plans and provider groups already have analytics infrastructure. They need specific capabilities, not replacement systems.&lt;/li&gt;
&lt;li&gt;Health IT developers building EHR integrations, population health tools, and care management platforms need programmatic access to risk adjustment data.&lt;/li&gt;
&lt;li&gt;APIs are testable, versionable, and composable in ways that dashboard-only tools aren't.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're building something in the health IT space and you need RAF scoring, ICD-10 lookup, or provider verification, check out the &lt;a href="https://www.vbcriskanalytics.com/healthcare-apis" rel="noopener noreferrer"&gt;healthcare APIs at VBC Risk Analytics&lt;/a&gt;. We have documentation and sandbox access available.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;In future posts on Dev.to, I'll be going deeper on specific technical topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ICD-10-to-HCC mapping algorithm — how it actually works under the hood&lt;/li&gt;
&lt;li&gt;CMS-HCC V28 changes and what broke in existing implementations&lt;/li&gt;
&lt;li&gt;RADV audit data modeling — structuring your documentation review pipeline&lt;/li&gt;
&lt;li&gt;Building a risk stratification system from claims data&lt;/li&gt;
&lt;li&gt;NPI verification edge cases and the mess that is provider data quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work in health IT or healthcare data engineering, I'd love to connect. Drop a comment below or reach out through &lt;a href="https://www.vbcriskanalytics.com" rel="noopener noreferrer"&gt;VBC Risk Analytics&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>healthit</category>
      <category>healthcare</category>
      <category>api</category>
      <category>python</category>
    </item>
  </channel>
</rss>
