Medicare Advantage, Part D, Medicaid
PBP home health (cleaned view)
medicare_semantic.vw_pbp_home_health·live·semantic_view·annualRows
N/A
Columns
49
History
2001 (report_year=2001) to 2026 (report_year=2026)
Card
yesgrain, traps, filters
Typed tools
1
What it is
- 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.
- 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.
- 3It is a plan-benefit-design (consumer-facing cost-share) table, NOT a paid-claims or fee-schedule table.
Grain
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquarter |
|
How to read it
- 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).
- 2For multi-snapshot years (e.g.
- 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.
- 4Answers: 'what does each MA plan charge a member for home health, and does it require prior auth/referral, for a given year?'
Traps
- 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.
- 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.
- 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.
- 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.
- 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.
- 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)
| Column | Type | Meaning |
|---|---|---|
contract_id | string | CMS 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_id | string | Plan ID within the contract (3-char, e.g. '001','801'). 656 distinct values. Part of the grain key. NOT unique by itself. |
segment_id | string | Plan segment ID (e.g. '0'; 27 distinct). Distinguishes service-area segments of the same plan. Required for uniqueness — without it 9,695 rows collapse. |
version | double | PBP 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_year | double | Contract/benefit year the plan design applies to (2001-2026). This is the TRUE time axis of the table; periodicity is annual. |
quarter | double | PBP 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_category | string | Constant 'home_health' for all 201,488 rows. Degenerate in this view. |
cost_share_string | string | Human-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_amount | double | In-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_pct | double | 100% 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_text | string | Free-text benefit limit. 100% NULL in this view. |
auth_required | boolean | Boolean: 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_required | boolean | Boolean: referral required. Better populated than auth (NULL only 12,531). TRUE 53,884, FALSE 134,573 where known. |
network_type | varchar(10) | Constant 'in_network' for all rows. This view carries only the in-network cost-share; out-of-network is not represented. |
max_oop_applies | boolean | Boolean intended to flag max-OOP applicability. 100% NULL in this view — uninformative. |
limit_quantity | double | Numeric benefit limit quantity. 100% NULL in this view. |
limit_unit | string | Unit of the limit (e.g. visits). 100% NULL in this view. |
limit_period_code | string | Coded limit period. 100% NULL. (Was offered as a candidate key column by the profiler but is entirely null — a non-key.) |
limit_period_label | string | Human label for the limit period. 100% NULL in this view. |
limit_quantity_per_year | double | Annualized limit quantity. 100% NULL in this view. |
benefit_amount | double | Plan-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_kind | string | Kind/semantics of benefit_amount. 100% NULL here. |
benefit_amount_period_code | string | Coded 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_label | string | Human period label for benefit_amount. 100% NULL here. |
benefit_amount_annualized | double | Benefit allowance annualized. 100% NULL here. |
benefit_amount_pmpm | double | Benefit allowance per-member-per-month. 100% NULL here. |
normalization_status | string | Status of $-amount normalization. 100% NULL in this view (no numeric benefit amounts to normalize). |
normalization_basis | string | Basis used for normalization. 100% NULL here. |
aggregation_policy | string | How multiple amounts were aggregated. 100% NULL here. |
offered_status | varchar(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_observability | varchar(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_reason | varchar(30) | Constant 'unknown_requires_crosswalk' for all rows — the stated reason benefit_amount is null (needs an external crosswalk). Degenerate (single value). |
annualization_policy | varchar(17) | Constant 'not_numeric' for all rows (no $-amount to annualize). Degenerate. |
combined_limit_policy | varchar(29) | Constant 'none_detected' for all rows. Degenerate. |
consumer_document_reconciliation_status | varchar(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_tier | varchar(23) | Constant 'source_faithful' for all rows — values are faithful to the source PBP file (not derived/imputed). Degenerate. |
coinsurance_pct_max | double | |
copay_amount_max | double | Upper 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_min | double | Lower 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_coinsurance | boolean | Boolean: coinsurance applies. TRUE 39,227. But the % itself is always NULL (see coinsurance_pct) — this is a presence flag only. |
has_copay | boolean | Boolean: 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_deductible | boolean | Boolean: benefit subject to a deductible. TRUE for only 3 rows in the whole table — effectively always FALSE. |
has_max_enrollee_oop | boolean | Boolean: benefit counts toward the plan max-OOP. TRUE for only 16 rows — effectively always FALSE/uninformative here. |
home_health_sub_benefit | string | Sub-benefit label, constant 'home_health' for all rows. Degenerate here (the view does not split home health into visit sub-types). |
source_pbp_section | varchar(2) | Constant 'B6' — the CMS PBP form section for home health. Confirms provenance. |
source_silver_table | varchar(42) | Constant 'medicare_silver.pbp_section_b6_home_health' — the upstream silver table this view normalizes. |
lmi_authorities | string | Constant 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_url | string | CMS 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_hash | string | SHA-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")
| Item | Value |
|---|---|
| Typed tools that read it | get_pbp_benefit |
| Identity key | contract_id,plan_id,segment_id |
| Join | how_to_join(source_fqn="medicare_semantic.vw_pbp_home_health") |
| Raw door | Athena (read-only via query_substrate): medicare_semantic.vw_pbp_home_health |
| Note | Cleaned 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