Risk Adjustment Data Marts

Risk adjustment analytics are exposed via flattened, query-friendly views derived from the underlying FHIR MeasureReport resources and the clinical data behind them. The views are published through the VBC Risk Snowflake listing and refresh once a day. See Accessing the VBC Risk listing below for how to add it to your Snowflake account, and Migrating from the public preview schema at the end of this page if you query the ZUS_VBC_INSIGHTS_PUBLIC_PREVIEW schema today.

Every view has a builder_id where the row belongs to a builder, so a parent account can tell its sub-builders apart. Rows are filtered to the builders your account is allowed to see.

Accessing the VBC Risk listing

The views are delivered as a Snowflake private listing named VBC Risk, separate from the FHIR Core listing that carries your relational FHIR data. It is granted per Snowflake account on request, so it does not appear until Zus adds your account.

Before you start

  • Your organization needs its own Snowflake account on the Business Critical edition with a signed BAA with Snowflake. If you reach Zus data another way, such as a Zus-hosted reader account, ask your account manager about VBC Risk availability.
  • Ask your Zus account manager to add your account to the listing. Send the same details used for the FHIR Core listing: Snowflake region, account locator, organization name, and account name. The Access via Snowflake (private listing) page shows where to find them.
  • Accepting a listing requires ACCOUNTADMIN or a role that can accept shares and create databases from listings.

Accepting the listing

  1. In Snowsight, open Data Products and then Private Sharing (labelled Data Sharing > External Sharing in some accounts).
  2. Find the VBC Risk listing from Zus Health and click Get.
  3. Choose a database name. The examples on this page use VBC_RISK.
  4. Grant the database to the roles that will query it:
GRANT IMPORTED PRIVILEGES ON DATABASE VBC_RISK TO ROLE <role_name>;

In some regions the first acceptance takes about ten minutes while Snowflake starts replication.

Using the views

All eight views are in the PUBLIC schema of the database you created. Column descriptions are stored as Snowflake comments, so the data dictionary is available in Snowsight and with DESCRIBE VIEW.

SHOW VIEWS IN SCHEMA VBC_RISK.PUBLIC;
DESCRIBE VIEW VBC_RISK.PUBLIC.RISK_GAP;

SELECT builder_id, gap_type, COUNT(*) AS gaps
FROM VBC_RISK.PUBLIC.RISK_GAP
WHERE reporting_year = 2026
  AND gap_status = 'open-gap'
  AND NOT is_acute
  AND superseded_by_risk_gap_id IS NULL
GROUP BY builder_id, gap_type;

A few things to know:

  • Rows are filtered for you. Every view returns only the builders your Snowflake account is entitled to, so there is no builder filter to apply unless you want a subset. A builder added to your account appears after the next daily refresh.
  • The views refresh once a day. They are rebuilt from the Zus platform each morning US time. A listing is a live reference, not a copy, so you see each refresh as soon as it completes with no re-acceptance.
  • The views are the contract. Zus keeps the names and columns stable and may add columns without notice. Select columns by name rather than SELECT * in anything that depends on column order.

The listing contains eight views:

VIEWONE ROW PER
risk_gapRisk gap
risk_gap_statusStatus change on a risk gap
risk_gap_hierarchySuperseded risk gap
risk_gap_diagnosis_codeICD-10 code on a risk gap
risk_gap_evidenceFHIR resource cited by a risk gap
patient_raf_scorePatient, builder and measurement period
patient_detailPatient, builder and reporting year
payer_risk_gapPayer-reported risk gap

Risk Gap Views

risk_gap

One row per CMS-HCC v28 individual risk gap (MeasureReport), with its current status, HCC reference data, supersession, evidence counts, payer closure, latest encounter diagnoses and user review activity. Count gaps here, never off a join to risk_gap_evidence.

Identity and classification

FIELDNOTES
idRisk gap identifier (the MeasureReport resource ID).
patient_id, upidPatient resource ID and Universal Patient Identifier.
builder_idThe builder that owns the gap.
code_hcc, hcc_versionHCC code and model version, typically "28".
hcc_descriptionCMS label for code_hcc, for example "Diabetes with Chronic Complications".
hcc_coefficientCoefficient for code_hcc in the community non-dual aged segment. For ranking only; do not sum.
is_acuteTRUE if code_hcc is on the Zus acute list.
gap_typerecapture, suspect, or net-new.
gap_statusCurrent status: open-gap, closed-gap, expected-to-close-1st-party, expected-to-close-3rd-party, accepted-for-review, dismissed, or pending.
confidence_level1 to 5 (5 = highest confidence). Typically 5 for rules-based or payer gaps, 1 to 5 for AI-generated suspects.
superseded_by_risk_gap_idThe gap for a higher HCC in the CMS-HCC hierarchy on the same patient and period, if one exists.
period_start, reporting_yearStart date of the calendar-year measurement period, and that year as an integer.
summaryGap-level narrative summary derived from all available evidence. Note that the format of these summaries may change and should not be relied upon for data ingestion.
summary_sourceHow the summary was generated: template (assembled from structured evidence) or ai (LLM-generated).

Evidence

FIELDNOTES
evidence_countEvaluated evidence: the resources that identified the gap. More does not necessarily mean a better suspect.
related_resource_countContext resources shown with the gap but not used to identify it.
payer_evidence_countEvaluated evidence that is a Claim, ExplanationOfBenefit or MeasureReport: your own payer data.
first_party_clinical_evidence_countEvaluated clinical evidence owned by builder_id.
third_party_clinical_evidence_countEvaluated clinical evidence owned by another builder.
closed_from_payer_data_atWhen Zus first closed the gap on receiving payer data (a claim file, risk-eligible diagnoses, or a payer gap file). Null if payer data hasn't closed it. Later status changes don't overwrite it.

Latest encounter diagnoses

The latest encounter diagnosis (a Condition with LOINC category 29308-4) in the gap's evaluated evidence, split by who owns it. First-party means your builder owns the Condition; third-party means another builder does.

FIELDNOTES
latest_first_party_encounter_diagnosis_recorded_atRecorded date of the latest first-party encounter diagnosis. Null when none supports the gap.
latest_first_party_encounter_diagnosis_condition_idIts Condition resource ID.
latest_third_party_encounter_diagnosis_recorded_atRecorded date of the latest third-party encounter diagnosis. Null when none supports the gap.
latest_third_party_encounter_diagnosis_providerRecorder, else asserter, of that diagnosis: the linked Practitioner's given and family name. Null when the Condition links no Practitioner resource.
latest_third_party_encounter_diagnosis_organizationManaging organization of the Patient that diagnosis belongs to, usually the organization the data came from.
latest_third_party_encounter_diagnosis_condition_idIts Condition resource ID.

Review activity

FIELDNOTES
first_viewed_at, last_viewed_atFirst and last time a user opened the gap's detail in the Zus app. Null if never opened.
accepted_at, accepted_byFirst time a user set the status to accepted-for-review, and that user's email.
acceptance_reason, acceptance_noteSubstatus and note on that acceptance, for example sent-to-provider-for-review. Optional in the app, so often null.
dismissed_at, dismissed_byFirst time a user set the status to dismissed, and that user's email.
dismissal_reason, dismissal_noteSubstatus and note on that dismissal, for example resolved, acute-in-nature, or inaccurate-or-insufficient-evidence. Optional in the app, so often null.

Timestamps

FIELDNOTES
created_atWhen the risk gap was first calculated.
last_updated_atWhen the MeasureReport resource was last updated.
TYPICAL USE CASEDESCRIPTION
Population listingList all current-year gaps for a population.
SegmentationSegment by gap type, status, or evidence source.
PrioritizationRank open gaps by hcc_coefficient and confidence_level.
Reviewer throughputMeasure how quickly gaps are viewed, accepted, or dismissed.
TrendsTrend monitoring by period.

risk_gap_status

One row per status update event per risk gap (full history). The most recent value is also on risk_gap.gap_status.

FIELDNOTES
risk_gap_idLink to risk_gap.id.
created_at, created_byWhen the status was created, and by whom: a user's email when made by a person, otherwise an identifier for the Zus system responsible.
statusopen-gap, closed-gap, accepted-for-review, dismissed, or pending
sourceWhat produced the update: zus-rules, zus-ai, payer-gap, claim-file, risk-diagnoses, or user-update.
note (optional)Free-text note.
substatus_one, substatus_two, substatus_three (optional)Additional categorization codes, for example resolved or acute-in-nature.
TYPICAL USE CASEDESCRIPTION
Audit trailAudit trail of review workflows.
Operational metricsMeasuring time-to-close or time-to-review.
Status evolutionUnderstanding how gaps evolve (e.g., open → accepted → closed).
AttributionWhich systems and users are changing gap status.

risk_gap_hierarchy

Represents superseding relationships between gaps based on HCC hierarchy. Each superseded gap links to the nearest superseding gap for the same patient and period, so a chain of three gaps appears as two links. The same link is also on risk_gap.superseded_by_risk_gap_id.

FIELDNOTES
risk_gap_idThe superseded gap.
superseded_by_risk_gap_idThe superseding gap.
TYPICAL USE CASEDESCRIPTION
Top-level filteringFilter to top-level gaps only.
Accurate countsAvoid double-counting related HCCs in reporting.

risk_gap_diagnosis_code

Normalized mapping of ICD-10 codes to risk gaps (one row per ICD-10 per gap).

FIELDNOTES
risk_gap_idLink to risk_gap.id.
code_icd_10ICD-10 diagnosis code, for example E11.9.
TYPICAL USE CASEDESCRIPTION
DrilldownDrilldown from HCC gap → supporting ICD-10s.
ComparisonsCompare coding patterns across providers.

risk_gap_evidence

Normalized mapping from risk gaps to evidence resources. Clinical evidence (evaluated) means a Zus process used the resource to identify the gap, such as a Condition or Claim showing a previous diagnosis. Related resources (related) are context expected to be useful when evaluating the gap, such as a recent A1c for a diabetes gap, and may support or refute it.

FIELDNOTES
risk_gap_idLink to risk_gap.id.
resource_type, resource_idThe referenced FHIR resource. resource_type is lowercased, for example condition or documentreference.
typeevaluated for directly supporting evidence or related for related resources providing context.
has_first_party_sourceTRUE if your builder owns this resource (or, for a lens Condition or MedicationStatement, one of the raw resources it aggregates), FALSE if not.
summaryOne-line narrative summary for this evidence reference. Note that the format of these summaries may change and should not be relied upon for data ingestion.
last_updatedWhen the risk gap was last updated.
TYPICAL USE CASEDESCRIPTION
Reviewer experiencesBuild reviewer experiences (evidence panels).
AnalyticsAnalytics on evidence completeness and on first-party versus third-party support.

Linking back to FHIR

You can construct a direct FHIR reference from resource_type and resource_id:

https://api.zusapi.com/fhir/{resource_type}/{resource_id}

The latest_*_encounter_diagnosis_condition_id columns on risk_gap resolve the same way, at /fhir/Condition/{id}.

RAF Score Views

patient_raf_score

One row per patient, builder, and measurement period, calculated by the risk gap calculator and published from the resulting RAF Score MeasureReport. All three scores use the CMS-HCC v28 community model (CNA) with the patient's demographic factors and differ only in which gaps' HCCs they count.

FIELDNOTES
idID of the RAF Score MeasureReport resource.
patient_id, upidPatient resource ID and Universal Patient Identifier.
builder_idThe builder that owns the score.
raf_score_modelThe RAF model used to calculate the scores.
actual_raf_scoreRAF score from HCCs closed via payer data: claims, risk diagnoses, or payer risk gaps.
expected_raf_scoreRAF score from HCCs that are closed or expected to close: closed gaps plus gaps with an encounter diagnosis recorded in the period that payer data hasn't confirmed yet.
potential_raf_scoreRAF score if every gap that hasn't been dismissed were closed.
period_startStart date for the calendar-year period.
created_atWhen the score was calculated.
last_updatedWhen the MeasureReport resource was last updated.
TYPICAL USE CASEDESCRIPTION
Population overviewAggregate RAF opportunity across a patient panel.
Gap prioritizationIdentify patients with the largest potential_raf_score - actual_raf_score.
Trend trackingMonitor score changes over time.

Patient Views

patient_detail

One row per patient, builder, and reporting year, for every patient with a risk gap or RAF score that year. The data flags, suspecting run, and appointments are per person, matched on upid. Gap counts and RAF are not here: join risk_gap and patient_raf_score.

FIELDNOTES
patient_id, upidPatient resource ID and Universal Patient Identifier. One builder can hold several Patient resources for the same person; they share a upid.
builder_idThe builder that owns the patient.
reporting_yearCMS measurement year as an integer, for example 2026.
suspecting_last_run_atWhen the latest AI suspecting job that processed the reporting year finished for the patient. Null if none.
has_first_party_dataTRUE if your builder owns at least one DocumentReference, Condition, medication resource, or Encounter for the patient, in any year.
has_third_party_dataTRUE if another builder has a Patient resource for the same person.
has_payer_dataTRUE if your builder has at least one payer risk gap or claim for the patient, in any year.
last_appointment_start_timeStart of the most recent appointment before refreshed_at, excluding cancelled, no-show, and entered-in-error appointments. Null if none or no appointment feed.
next_appointment_start_timeStart of the earliest appointment at or after refreshed_at, with the same exclusions. Null usually means no appointment feed, not no visit.
refreshed_atWhen the row was built. The appointment columns are relative to it.
TYPICAL USE CASEDESCRIPTION
CoverageWhich patients have first-party, third-party, or payer data behind their gaps.
Suspecting monitoringConfirm AI suspecting has run for a panel.
OutreachPrioritize patients with an upcoming appointment and open gaps.

Payer Risk Gap Views

payer_risk_gap

Payer-provided evidence of a risk gap. Payers return risk adjustment data describing which diagnoses and encounters are eligible as risk gaps. Customers standardize that data as CSV and provide it to Zus, which matches it to a patient, deduplicates it, and stores it as a MeasureReport.

FIELDNOTES
idID of the Payer Risk Gap MeasureReport resource.
patient_id, upidPatient resource ID (resolved by Zus from the identifier in the file) and Universal Patient Identifier.
builder_idThe builder that owns the payer risk gap.
code_hcc, code_hcc_versionHCC code reported by the payer and its model version, typically V28.
code_icd_10The contributing ICD-10-CM code, normalized to include the decimal.
payer_reported_statusThe status according to the payer file: open or closed. Does not always match the resulting gap's status.
payer_reported_recapture_flagTRUE if the payer determined the gap was recaptured, FALSE if not, null when the payer didn't report it.
last_claim_dateThe date the ICD-10 code last appeared on a claim, or the customer's closest approximation.
reasonHuman-readable description of the evidence behind the payer gap.
gap_sourceThe ingestion path that produced this record, for example payer-risk-gap-csv-file.
period_startStart date for the calendar-year period.
created_atWhen the payer risk gap was created.
last_updatedWhen the MeasureReport resource was last updated.
TYPICAL USE CASEDESCRIPTION
Risk Gap Source TrackingIdentify payer gap data provided to create certain risk_gap entries.
Import trackingSuccessfully imported Payer Risk Gap CSVs create Payer Risk Gaps which ultimately reach the payer_risk_gap view. This allows you to check if a CSV completed successfully.

Migrating from the public preview schema

Before the VBC Risk listing, risk views were published in the ZUS_VBC_INSIGHTS_PUBLIC_PREVIEW schema alongside the relational FHIR data. The preview schema stays in place for a migration period after the listing is generally available, and Zus will announce its retirement date in advance. Plan to move queries over before then.

The listing is not a rename. Views were dropped, renamed, and widened, and a few columns changed type. The sections below cover what to change.

What moved where

PREVIEW VIEWLISTING VIEWWHAT CHANGED
risk_gaprisk_gapEvery preview column is kept with the same name. 27 columns were added: HCC reference data, evidence counts, payer closure, latest encounter diagnoses, review activity, and reporting_year.
risk_gap_status_updaterisk_gap_statusRenamed. Same columns.
risk_gap_hierarchyrisk_gap_hierarchyUnchanged. The same link is also on risk_gap.superseded_by_risk_gap_id.
risk_gap_diagnosis_coderisk_gap_diagnosis_codeKeeps risk_gap_id and code_icd_10. Drops sources, recorded_date, has_first_party_source, and has_third_party_source. See replacements below.
risk_gap_evidencerisk_gap_evidenceDrops has_third_party_source. Everything else is kept.
risk_gap_sourcenoneRemoved. See replacements below.
risk_gap_archivenoneNot published. Deleted gaps are no longer visible.
raf_scorepatient_raf_scoreRenamed. Adds builder_id, drops measure. The three scores keep their names.
raf_score_v28, raf_score_v24noneRemoved. These were estimates recomputed from HCC factor tables, not the calculator's scores. See replacements below.
payer_risk_gappayer_risk_gapDrops measure. payer_reported_recapture_flag is now BOOLEAN instead of the strings '1' and '0'.
nonepatient_detailNew. One row per patient, builder, and reporting year with data coverage flags, suspecting run time, and appointments.
HIERARCHY_V28, DIAGNOSIS_FACTORS_V28, ICD10_HCC_MAPPING, SUSPECT_CONDITION_HCC, ALL_AI_SOURCED_CONDITIONSnoneReference and working tables that were visible in the preview schema are not part of the listing. risk_gap carries hcc_description, hcc_coefficient, and is_acute for the common lookups.

Replacements for dropped columns and views

  • Source attribution (risk_gap_source, and sources on risk_gap_diagnosis_code). Use risk_gap_status, whose source column records which system produced each status change: zus-rules, zus-ai, payer-gap, claim-file, risk-diagnoses, or user-update. The earliest status row for a gap is the system that created it. For "did payer data close this gap", use risk_gap.closed_from_payer_data_at directly.
  • First-party versus third-party evidence (has_third_party_source on risk_gap_evidence and risk_gap_diagnosis_code). risk_gap_evidence.has_first_party_source is kept and now resolves ownership from the resource itself, including the raw resources behind a lens summary. Third-party is has_first_party_source = FALSE; NULL means the owner could not be resolved. For counts, risk_gap carries first_party_clinical_evidence_count, third_party_clinical_evidence_count, and payer_evidence_count, so most queries no longer need the evidence view at all.
  • Encounter diagnosis dates (recorded_date on risk_gap_diagnosis_code). risk_gap carries latest_first_party_encounter_diagnosis_recorded_at and latest_third_party_encounter_diagnosis_recorded_at, each with the Condition ID behind it, and the third-party row also names the provider and organization. These are per gap rather than per ICD-10 code.
  • RAF estimates (raf_score_v28, raf_score_v24). Use patient_raf_score, which is the calculator's own score. potential_raf_score - actual_raf_score replaces raf_gap. There is no v24 equivalent; the listing is CMS-HCC v28 only. For HCC counts, count distinct code_hcc on risk_gap with the status filter you need.
  • Deleted gaps (risk_gap_archive). Not available. A gap that disappears from risk_gap between refreshes was removed by recalculation.

Query changes

  • Qualified names. ODS_EXPORTS.ZUS_VBC_INSIGHTS_PUBLIC_PREVIEW.RISK_GAP becomes <your database>.PUBLIC.RISK_GAP.
  • Top-level gaps. The preview required an anti-join to risk_gap_hierarchy. Use superseded_by_risk_gap_id IS NULL on risk_gap instead.
  • Year filtering. period_start is still a string, but reporting_year is an integer, so WHERE reporting_year = 2026 replaces WHERE period_start = '2026-01-01'.
  • Recapture flag. Compare payer_reported_recapture_flag to TRUE and FALSE, not to '1' and '0'.

Before, on the preview:

SELECT g.id, g.code_hcc, g.gap_status
FROM ODS_EXPORTS.ZUS_VBC_INSIGHTS_PUBLIC_PREVIEW.RISK_GAP g
WHERE g.period_start = '2026-01-01'
  AND g.gap_status = 'open-gap'
  AND NOT EXISTS (
    SELECT 1 FROM ODS_EXPORTS.ZUS_VBC_INSIGHTS_PUBLIC_PREVIEW.RISK_GAP_HIERARCHY h
    WHERE h.risk_gap_id = g.id
  );

After, on the listing:

SELECT id, code_hcc, hcc_description, gap_status
FROM VBC_RISK.PUBLIC.RISK_GAP
WHERE reporting_year = 2026
  AND gap_status = 'open-gap'
  AND superseded_by_risk_gap_id IS NULL;

Did this page help you?