Medicare Advantage, Part D, Medicaid

PBP home health (cleaned view)

medicare_semantic.vw_pbp_home_health·live·semantic_view·annual
Rows
N/A
Columns
49
History
2001 (report_year=2001) to 2026 (report_year=2026)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A normalized, source-faithful view of the Medicare Advantage home-health benefit (PBP Section B6) for every MA/Part-C plan-benefit-package, derived from CMS's annual/quarterly PBP Public Use Files.
  2. 2One row states, for a given plan in a given filing snapshot, the member cost-share for in-network home health (copay and/or coinsurance flags), plus authorization/referral requirements and full provenance.
  3. 3It is a plan-benefit-design (consumer-facing cost-share) table, NOT a paid-claims or fee-schedule table.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per MA plan-benefit-package per PBP filing snapshot for the home-health benefit, i.e. one row per (contract_id, plan_id, segment_id, report_year, quarter).
  2. 2All 5 columns are load-bearing and minimal: dropping any one breaks uniqueness (drop_segment -> 191,793; drop_year -> 59,740; drop_quarter -> 114,175 distinct, vs total).
  3. 3Verified: COUNT(DISTINCT those 5) = 201,488 = row_count exactly. home_health_sub_benefit, network_type, benefit_category and version are all functionally dependent (version never splits a snapshot: 0 plan-year-quarters have >1 version) and add nothing to the key.

How to read it

  1. 1To get the current-year in-network home-health cost-share for every MA plan, deduping the redundant quarterly snapshots: SELECT contract_id, plan_id, segment_id, copay_amount, has_copay, has_coinsurance, auth_required, referral_required FROM medicare_semantic.vw_pbp_home_health WHERE report_year = 2026 (2026 has a single annual snapshot = 7,420 plan rows; of these 3,455 specify a copay - 3,447 of them $0 - and 1,295 use coinsurance).
  2. 2For multi-snapshot years (e.g.
  3. 32023) add a quarter filter such as AND quarter = 1, or wrap in ROW_NUMBER() OVER (PARTITION BY contract_id,plan_id,segment_id ORDER BY quarter DESC, version DESC) = 1, to avoid double-counting plans.
  4. 4Answers: 'what does each MA plan charge a member for home health, and does it require prior auth/referral, for a given year?'

Traps

  1. 1GRAIN TRAP - quarter is a re-release index, not a calendar quarter, and snapshots are REDUNDANT: for 2018-2020/2022-2024 a plan appears under 2-4 quarterly snapshots whose copay never drifts (0 of 38,598 multi-quarter plan-years differ). Querying without deduping inflates plan counts ~2x for those years. To get one row per plan-year, filter to one quarter (e.g. WHERE quarter = 1) or qualify by ROW_NUMBER over quarter DESC. There is NO is_current / latest flag — you must pick the snapshot yourself.
  2. 2COINSURANCE IS A DEAD END FOR NUMBERS: coinsurance_pct is 100% NULL even though has_coinsurance=TRUE on 39,227 rows. You can tell a plan USES coinsurance but you cannot get the percent from this table. Likewise benefit_amount and its entire annualized/pmpm/period family are 100% NULL (home health carries no $-allowance), as are all limit_* columns.
  3. 3COPAY COVERAGE IS PARTIAL AND $0-DOMINATED: copay_amount is populated on only 79,807/201,488 rows (40%); 96% of those are $0 (home health is $0 under Original Medicare). A NULL copay does NOT mean $0 - it means either a coinsurance plan or cost-share-not-captured. Do not impute 0 for nulls.
  4. 4MANY 'POLICY' COLUMNS ARE DEGENERATE/MISLEADING IN THIS VIEW: numeric_amount_observability ('offered_without_numeric_amounts'), null_amount_reason, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status ('not_checked'), confidence_tier ('source_faithful'), offered_status, benefit_category, network_type, home_health_sub_benefit, source_pbp_section, source_silver_table, lmi_authorities each have exactly ONE value across all rows. In particular numeric_amount_observability='offered_without_numeric_amounts' is self-contradictory here (40% have copay numbers) - it describes the benefit_amount family, not copay. Never filter on these expecting variety.
  5. 5NULLS ENCODE VINTAGE, NOT ABSENCE: auth_required is ~100% NULL for report_year 2001-2017 then populated 2018+; has_copay/has_coinsurance are NULL on 10,175 older rows. A NULL flag means 'CMS PBP of that year did not capture this field', not 'no auth / no cost-share'. Cohort your analysis by report_year. Also consumer_document_reconciliation_status='not_checked' everywhere: these are raw PBP design values, NOT validated against published Summary-of-Benefits/EOC docs.
  6. 6NOT A PAID-CLAIMS / FEE-SCHEDULE TABLE: this is MA plan BENEFIT-DESIGN member cost-share (copays/coinsurance flags) from CMS PBP filings - it is not what Medicare or the plan PAYS providers and is not a fee schedule. For provider-paid home-health amounts use the Medicare fee-schedule / claims sources, not this view.

Columns (49)

ColumnTypeMeaning
contract_idstringCMS MA contract ID (e.g. H0046, E5088). 1,972 distinct. Part of the grain key. 'H' = local MA/MA-PD, 'E'/'R' = employer/regional plans.
plan_idstringPlan ID within the contract (3-char, e.g. '001','801'). 656 distinct values. Part of the grain key. NOT unique by itself.
segment_idstringPlan segment ID (e.g. '0'; 27 distinct). Distinguishes service-area segments of the same plan. Required for uniqueness — without it 9,695 rows collapse.
versiondoublePBP file submission/version number for that snapshot (1-27). 0 for vintages 2001-2006 where CMS did not record a version. Functionally dependent on the grain (one value per snapshot row); MAX(version) is the final restatement but it is NOT needed for uniqueness.
report_yeardoubleContract/benefit year the plan design applies to (2001-2026). This is the TRUE time axis of the table; periodicity is annual.
quarterdoublePBP PUF quarterly RE-RELEASE index within report_year (1-4), NOT a calendar quarter of service. Most years = quarter 1 only; CMS published multiple quarterly snapshots for 2018-2020, 2022-2024. Load-bearing for row uniqueness but see gotcha: snapshots are redundant (copay never drifts across quarters), so it inflates plan counts ~2x for those years.
benefit_categorystringConstant 'home_health' for all 201,488 rows. Degenerate in this view.
cost_share_stringstringHuman-readable cost-share, e.g. '$0 copay', '$10.0 copay'. NULL for 121,681 rows (60%) where no copay figure was captured (coinsurance plans + cost-share-unspecified rows). When present it mirrors copay_amount exactly.
copay_amountdoubleIn-network home-health copay in dollars. Populated for only 79,807 rows (40%); the rest NULL. Heavily dominated by $0 (76,559 of 79,807 = 96%) because home health is $0 under Original Medicare and most MA plans mirror that; nonzero values 1-65. avg ~$0.69.
coinsurance_pctdouble100% NULL across the entire table. CRITICAL: even the 39,227 rows flagged has_coinsurance=TRUE have NO percent here — the actual coinsurance rate is NOT recoverable from this view.
limit_textstringFree-text benefit limit. 100% NULL in this view.
auth_requiredbooleanBoolean: prior authorization required. NULL for 49,700 rows — and the NULLs are almost entirely vintages 2001-2017 (those years are ~100% NULL); 2018+ is mostly populated. So NULL means 'field not captured in that PBP vintage', not 'no auth'. Where populated: TRUE 120,706, FALSE 19,082.
referral_requiredbooleanBoolean: referral required. Better populated than auth (NULL only 12,531). TRUE 53,884, FALSE 134,573 where known.
network_typevarchar(10)Constant 'in_network' for all rows. This view carries only the in-network cost-share; out-of-network is not represented.
max_oop_appliesbooleanBoolean intended to flag max-OOP applicability. 100% NULL in this view — uninformative.
limit_quantitydoubleNumeric benefit limit quantity. 100% NULL in this view.
limit_unitstringUnit of the limit (e.g. visits). 100% NULL in this view.
limit_period_codestringCoded limit period. 100% NULL. (Was offered as a candidate key column by the profiler but is entirely null — a non-key.)
limit_period_labelstringHuman label for the limit period. 100% NULL in this view.
limit_quantity_per_yeardoubleAnnualized limit quantity. 100% NULL in this view.
benefit_amountdoublePlan-provided benefit dollar allowance. 100% NULL in this view (home health has no $-allowance, unlike OTC/dental sibling views that share this schema).
benefit_amount_kindstringKind/semantics of benefit_amount. 100% NULL here.
benefit_amount_period_codestringCoded period for benefit_amount. 100% NULL. (Profiler listed it as a candidate key column, but it is entirely null — not a real key.)
benefit_amount_period_labelstringHuman period label for benefit_amount. 100% NULL here.
benefit_amount_annualizeddoubleBenefit allowance annualized. 100% NULL here.
benefit_amount_pmpmdoubleBenefit allowance per-member-per-month. 100% NULL here.
normalization_statusstringStatus of $-amount normalization. 100% NULL in this view (no numeric benefit amounts to normalize).
normalization_basisstringBasis used for normalization. 100% NULL here.
aggregation_policystringHow multiple amounts were aggregated. 100% NULL here.
offered_statusvarchar(15)Constant 'offered' for all rows — every row is a plan that offers home health (the view does not carry 'not_offered' rows).
numeric_amount_observabilityvarchar(31)Constant 'offered_without_numeric_amounts' for ALL rows. MISLEADING: it refers to the benefit_amount ($-allowance) family (all null), NOT copay — 40% of rows DO have a numeric copay_amount. Treat as a degenerate/contradictory label in this view.
null_amount_reasonvarchar(30)Constant 'unknown_requires_crosswalk' for all rows — the stated reason benefit_amount is null (needs an external crosswalk). Degenerate (single value).
annualization_policyvarchar(17)Constant 'not_numeric' for all rows (no $-amount to annualize). Degenerate.
combined_limit_policyvarchar(29)Constant 'none_detected' for all rows. Degenerate.
consumer_document_reconciliation_statusvarchar(11)Constant 'not_checked' for all rows — these values have NOT been reconciled against consumer-facing plan docs (SB/EOC). Degenerate but a real caveat: this is raw PBP, unverified vs. published documents.
confidence_tiervarchar(23)Constant 'source_faithful' for all rows — values are faithful to the source PBP file (not derived/imputed). Degenerate.
coinsurance_pct_maxdouble
copay_amount_maxdoubleUpper bound of copay range (e.g. up to $20). Populated only where copay exists (79,807); avg ~0.98, so most plans have a single-value (min=max) copay.
copay_amount_mindoubleLower bound of copay when a range is present; equals copay_amount in the simple case. Populated only where copay_amount is (79,807). avg ~0.69.
has_coinsurancebooleanBoolean: coinsurance applies. TRUE 39,227. But the % itself is always NULL (see coinsurance_pct) — this is a presence flag only.
has_copaybooleanBoolean: a copay is specified. TRUE 79,803 / FALSE 111,510 / NULL 10,175 (older vintages where flags weren't derived). Aligns with copay_amount being non-null (only 4 anomalous mismatches).
has_deductiblebooleanBoolean: benefit subject to a deductible. TRUE for only 3 rows in the whole table — effectively always FALSE.
has_max_enrollee_oopbooleanBoolean: benefit counts toward the plan max-OOP. TRUE for only 16 rows — effectively always FALSE/uninformative here.
home_health_sub_benefitstringSub-benefit label, constant 'home_health' for all rows. Degenerate here (the view does not split home health into visit sub-types).
source_pbp_sectionvarchar(2)Constant 'B6' — the CMS PBP form section for home health. Confirms provenance.
source_silver_tablevarchar(42)Constant 'medicare_silver.pbp_section_b6_home_health' — the upstream silver table this view normalizes.
lmi_authoritiesstringConstant single value (pipe-delimited URLs to the CY2026 LMI MA-benefits reference PDFs: Service Category Descriptions + Part C Bid Review Memorandum). A static documentation pointer, identical on every row.
source_urlstringCMS download URL for the originating PBP PUF zip (e.g. .../pbp-benefits-2026.zip, or .../pbp-benefits-2024-quarter-1.zip for quarterly years). 40 distinct values = 40 source files (one per report_year, or per year-quarter for 2018-2020/2022-2024). 1:1 with sha256_content_hash.
sha256_content_hashstringSHA-256 of the source file content for provenance/integrity. 40 distinct values, 1:1 with source_url (one hash per source PBP file release).

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_home_health")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_home_health WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id,plan_id,segment_id
Joinhow_to_join(source_fqn="medicare_semantic.vw_pbp_home_health")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_home_health
NoteCleaned PBP reasoning surface (categories/home_health/contract.yaml); raw is pbp_section_*.

This page as markdown: /docs-md/data/medicare_semantic_vw_pbp_home_health.md · every page in one file: /llms-full.txt