# MA pbp section b6 home health

`medicare_silver.pbp_section_b6_home_health` · Medicare Advantage, Part D, Medicaid · status partial

Section B6: Home health cost-share. Coverage: All years.

**Grain.** One row per Medicare Advantage plan segment per CMS quarterly PBP snapshot of a plan year — i.e. one row per (contract_id, plan_id, segment_id, report_year, quarter). Verified unique: 201,488 distinct = 201,488 total rows. report_year is the year the benefits are in effect (= year(observed_period) = year(effective_period_start)); quarter is which CMS quarterly release of that plan year the row came from. Because 2018+ plan-years are re-published up to 4 times a year, the SAME plan-year benefit appears once per published quarter — so the table is NOT one-row-per-plan-per-year; you must pick a quarter (or dedup on it) to get plan-year grain.

**How to use it.** To benchmark Medicare Advantage home-health cost-sharing for the latest plan year, pin to one snapshot per plan and read the master flags + mc amounts. Example: SELECT contract_id, plan_id, segment_id, pbp_a_plan_type, pbp_b6_auth_yn, pbp_b6_copay_yn, pbp_b6_copay_mc_amt_min, pbp_b6_copay_mc_amt_max, pbp_b6_coins_yn, pbp_b6_coins_pct_mc FROM medicare_silver.pbp_section_b6_home_health WHERE report_year = 2026 AND quarter = 1 — answers 'which MA plans require prior auth for home health, and what copay/coinsurance do they charge?' To trend over time, GROUP BY report_year using a single quarter per year (e.g. quarter = 1, or MAX(quarter)) to avoid quarterly double-counting.

**Traps.**
- NOT one-row-per-plan-per-year. quarter is part of the grain: 2001-2017 publish Q1 only, but 2018+ publish up to 4 quarterly snapshots of the SAME plan-year (e.g. 2023 has Q1-Q4). Naively counting rows or joining without pinning quarter double/quadruple-counts recent plan-years. For a per-plan-year view, filter to one quarter (e.g. MAX(quarter) per report_year) or to quarter=1.
- There is NO is_current column and no within-grain dedup is needed — each (contract,plan,segment,report_year,quarter) has exactly one row / one cms_vintage_sequence (verified 0 multi-vintage groups). cms_vintage_sequence (1-4) and parse_revision are provenance/ingest-batch markers, NOT version flags to filter on; asserted_at (only 2026-05-16 / 2026-05-20) is the lake LOAD date, not a benefit date.
- bid_id LOOKS like a primary key but is not: it is the derived concat contract_id_plan_id_segment_id and is NULL for 8,316 early-year rows, so DISTINCT bid_id (23,191) under-counts the real plan population (26,631 contract+plan+segment combos). Use the three ID columns, not bid_id.
- _yn flags follow CMS convention '1'=Yes, '2'=No, and NULL = not collected in that year's PBP version (PBP schema changed over 25 years) — NULL does not mean 'No'. The flag gates its amount columns: copay/coins/deductible dollar+percent fields are only populated when the matching *_yn='1'. Deductible is essentially always '2'/No (Original-Medicare home health has no deductible; only 3 rows carry an amount).
- Most measure columns are extremely sparse and benefit-specific. The entire pbp_b6_mm_* sub-block (additional / Non-Medicare-Covered in-home support services) is NULL in ~200,350 of 201,488 rows (mm_nmc_yn set in just 1,138). Many _pos (point-of-service/out-of-network) columns are vestigial (e.g. pbp_b6_copay_amtv_pos is 100% NULL). Suffixes encode home-health sub-categories: mc=Medicare-covered (the main one), hs/rc/cc=other sub-services; pull the mc and the *_yn columns for the core cost-sharing story.
- Sibling-table caveat: this is ONLY PBP Section B-6 (home health). Other pbp_section_b* tables hold other benefit categories (B-1 inpatient, B-7 professional, etc.) at the SAME plan grain — do not assume a plan's home-health cost-share generalizes. report_year/observed_period/effective_period_start are all the same year (redundant); effective_period_end is always Dec 31 of that year.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS Medicare Advantage/Part C contract ID (e.g. H0028). Prefix encodes program: H=local MA/MA-PD (1,933 contracts), R=regional PPO (37), E=employer/EGWP (2). All rows are MA contracts. Part of the grain key. |
| plan_id | string | 3-char plan benefit package ID within the contract (e.g. '001','007'). 656 distinct values. A contract sells many plans. Part of the grain key. |
| segment_id | string | Plan segment (service-area sub-division). '0' = non-segmented plan (181,424 rows, the norm); '1'-'27' = segmented plans; empty-string '' for 5,074 early-year rows (never NULL). Part of the grain key — needed because the same contract+plan can have multiple segments. |
| version | double | CMS bid/PBP submission version number for that plan-year (double, 0-27). Resets each report_year (e.g. 2023 plans show v3, 2024 v6). Identifies which iteration of the plan's bid the snapshot reflects; NOT a lake-side dedup version and NOT part of the minimal grain. |
| report_year | double | Plan/benefit year the row describes (double, 2001-2026). Equals year(observed_period)=year(effective_period_start)=year(effective_period_end) exactly. Part of the grain key (stands in for observed_period). This is the year the benefits are IN EFFECT, not when filed. |
| quarter | double | CMS PBP quarterly release the snapshot came from (double, 1-4). Part of the grain key. CRITICAL: 2001-2017 have Q1 only; 2018+ have up to 4 quarterly re-publications of the SAME plan year. A given plan-year appears once per published quarter. |
| bid_id | string | Derived plan key = contract_id//'_'//plan_id//'_'//segment_id (verified: equals that concat in 100% of non-null rows). NULL for 8,316 early-year rows. Redundant with the three ID columns; do NOT use as a standalone key (its nulls make it non-unique). |
| orgtype | string | CMS organization type code (string): '01'=Local CCP/HMO-PPO (177,737, plurality), '08'=Regional PPO, '04'=PFFS, '11'=MSA, '06'=1876 Cost, '05'=PDP-ish, etc. Describes the MA organization structure. |
| pbp_a_ben_cov | string | Section A benefit-coverage indicator (string): '1'=plan covers Original Medicare benefits (196,773), '2'=does not (4,373), NULL (342). Carried from PBP Section A. |
| pbp_a_plan_type | string | CMS plan-type code (string): '01'=HMO (101,510), '04'=Local PPO (55,909), '02'=HMOPOS (20,097), '20'=Regional PPO, '09'=PFFS, '31'=MSA, '18'=Cost, '48'=Special. Carried from PBP Section A; classifies the plan product. |
| pbp_b6_auth | string |  |
| pbp_b6_auth_pos | string |  |
| pbp_b6_auth_yn | string |  |
| pbp_b6_bendec_hh | string |  |
| pbp_b6_bendec_yesno | string |  |
| pbp_b6_bendesc_amo | string |  |
| pbp_b6_bendesc_amo_hs | string |  |
| pbp_b6_bendesc_amo_rc | string |  |
| pbp_b6_bendesc_amohs | string |  |
| pbp_b6_bendesc_amorc | string |  |
| pbp_b6_bendesc_hh | string |  |
| pbp_b6_bendesc_yn | string |  |
| pbp_b6_coins_cov_cc | string |  |
| pbp_b6_coins_cov_hs | string |  |
| pbp_b6_coins_cov_mc | string |  |
| pbp_b6_coins_cov_pos | string |  |
| pbp_b6_coins_cov_rc | string |  |
| pbp_b6_coins_pct_cc | double |  |
| pbp_b6_coins_pct_cc_max | double |  |
| pbp_b6_coins_pct_cc_min | double |  |
| pbp_b6_coins_pct_ccmax | double |  |
| pbp_b6_coins_pct_hs | double |  |
| pbp_b6_coins_pct_hs_max | double |  |
| pbp_b6_coins_pct_hs_min | double |  |
| pbp_b6_coins_pct_hsmax | double |  |
| pbp_b6_coins_pct_max_pos | double |  |
| pbp_b6_coins_pct_mc | double |  |
| pbp_b6_coins_pct_mc_max | double |  |
| pbp_b6_coins_pct_mc_min | double |  |
| pbp_b6_coins_pct_mcmax | double |  |
| pbp_b6_coins_pct_pos | double |  |
| pbp_b6_coins_pct_rc | double |  |
| pbp_b6_coins_pct_rc_max | double |  |
| pbp_b6_coins_pct_rc_min | double |  |
| pbp_b6_coins_pct_rcmax | double |  |
| pbp_b6_coins_yesno | string |  |
| pbp_b6_coins_yesno_pos | string |  |
| pbp_b6_coins_yn | string |  |
| pbp_b6_copay_amtv_pos | double |  |
| pbp_b6_copay_cc_amt | double |  |
| pbp_b6_copay_cc_amt_max | double |  |
| pbp_b6_copay_cc_amt_min | double |  |
| pbp_b6_copay_cc_amtmax | double |  |
| pbp_b6_copay_hs_amt | double |  |
| pbp_b6_copay_hs_amt_max | double |  |
| pbp_b6_copay_hs_amt_min | double |  |
| pbp_b6_copay_hs_amtmax | double |  |
| pbp_b6_copay_max_amtv_pos | double |  |
| pbp_b6_copay_mc_amt_max | double |  |
| pbp_b6_copay_mc_amt_min | double |  |
| pbp_b6_copay_mcamt | double |  |
| pbp_b6_copay_mcamtmax | double |  |
| pbp_b6_copay_rc_amt | double |  |
| pbp_b6_copay_rc_amt_max | double |  |
| pbp_b6_copay_rc_amt_min | double |  |
| pbp_b6_copay_rc_amtmax | double |  |
| pbp_b6_copay_yesno | string |  |
| pbp_b6_copay_yesno_pos | string |  |
| pbp_b6_copay_yn | string |  |
| pbp_b6_ded_amt | double |  |
| pbp_b6_ded_amt_pos | double |  |
| pbp_b6_ded_yesno_pos | string |  |
| pbp_b6_ded_yn | string |  |
| pbp_b6_maxenr_amt | double |  |
| pbp_b6_maxenr_amt_pos | double |  |
| pbp_b6_maxenr_per | string |  |
| pbp_b6_maxenr_per_d | string |  |
| pbp_b6_maxenr_yesno | string |  |
| pbp_b6_maxenr_yn | string |  |
| pbp_b6_maxenr_yn_pos | string |  |
| pbp_b6_maxplan_yesno_pos | string |  |
| pbp_b6_maxpln_amt_pos | double |  |
| pbp_b6_maxpln_cov_pos | string |  |
| pbp_b6_maxpln_per_pos | string |  |
| pbp_b6_mm_addl_service_other1 | string |  |
| pbp_b6_mm_addl_service_other2 | string |  |
| pbp_b6_mm_auth | string |  |
| pbp_b6_mm_auth_yn | string |  |
| pbp_b6_mm_coins_addl_max | double |  |
| pbp_b6_mm_coins_addl_min | double |  |
| pbp_b6_mm_coins_other1_max | double |  |
| pbp_b6_mm_coins_other1_min | double |  |
| pbp_b6_mm_coins_other2_max | double |  |
| pbp_b6_mm_coins_other2_min | double |  |
| pbp_b6_mm_coins_pcs_max | double |  |
| pbp_b6_mm_coins_pcs_min | double |  |
| pbp_b6_mm_coins_services | string |  |
| pbp_b6_mm_coins_yn | string |  |
| pbp_b6_mm_copay_addl_max | double |  |
| pbp_b6_mm_copay_addl_min | double |  |
| pbp_b6_mm_copay_other1_max | double |  |
| pbp_b6_mm_copay_other1_min | double |  |
| pbp_b6_mm_copay_other2_max | double |  |
| pbp_b6_mm_copay_other2_min | double |  |
| pbp_b6_mm_copay_pcs_max | double |  |
| pbp_b6_mm_copay_pcs_min | double |  |
| pbp_b6_mm_copay_services | string |  |
| pbp_b6_mm_copay_yn | string |  |
| pbp_b6_mm_lim_unit_type_ahc_d | string |  |
| pbp_b6_mm_lim_unit_type_oth1_d | string |  |
| pbp_b6_mm_lim_unit_type_oth2_d | string |  |
| pbp_b6_mm_limit_services | string |  |
| pbp_b6_mm_limit_unit_num_ahc | double |  |
| pbp_b6_mm_limit_unit_num_oth1 | double |  |
| pbp_b6_mm_limit_unit_num_oth2 | double |  |
| pbp_b6_mm_limit_unit_num_pc | double |  |
| pbp_b6_mm_limit_unit_per_ahc | string |  |
| pbp_b6_mm_limit_unit_per_ahc_d | string |  |
| pbp_b6_mm_limit_unit_per_oth1 | string |  |
| pbp_b6_mm_limit_unit_per_oth2 | string |  |
| pbp_b6_mm_limit_unit_per_pc | string |  |
| pbp_b6_mm_limit_unit_per_pc_d | string |  |
| pbp_b6_mm_limit_unit_type_ahc | string |  |
| pbp_b6_mm_limit_unit_type_oth1 | string |  |
| pbp_b6_mm_limit_unit_type_oth2 | string |  |
| pbp_b6_mm_limit_unit_type_pc | string |  |
| pbp_b6_mm_limit_unit_type_pc_d | string |  |
| pbp_b6_mm_limit_yn | string |  |
| pbp_b6_mm_limt_unit_per_oth1_d | string |  |
| pbp_b6_mm_limt_unit_per_oth2_d | string |  |
| pbp_b6_mm_maxplan_amt | double |  |
| pbp_b6_mm_maxplan_per | string |  |
| pbp_b6_mm_maxplan_per_d | string |  |
| pbp_b6_mm_maxplan_yn | string |  |
| pbp_b6_mm_nmc_yn | string |  |
| pbp_b6_mm_refer_yn | string |  |
| pbp_b6_mm_services | string |  |
| pbp_b6_mmp_waiver_srvc | string |  |
| pbp_b6_mmp_waiver_yn | string |  |
| pbp_b6_refer_yn | string |  |
| pbp_b_6_ded_amt | double |  |
| pbp_b_6_ded_yesno | string |  |
| observed_period | date |  |
| asserted_at | date |  |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int |  |
| parse_revision | int |  |
| parser_artifact_hash | string |  |
| source_url | string |  |
| sha256_content_hash | string |  |
| pbp_b6_auth_yn / pbp_b6_refer_yn |  | Whether prior authorization (auth) / referral (refer) is required for home health. CMS yes/no convention: '1'=Yes, '2'=No, NULL=not asked that PBP version. Auth: 120,706 Yes; Refer: 53,884 Yes. pbp_b6_auth/pbp_b6_auth_pos hold free-text/POS auth detail (mostly NULL). |
| pbp_b6_copay_yn / pbp_b6_coins_yn / pbp_b6_ded_yn |  | Master flags for whether the plan charges a copay / coinsurance / deductible on Medicare-covered home health. '1'=Yes, '2'=No, NULL=n/a. Copay Yes=79,803; Coins Yes=39,227; Deductible almost always '2'=No (only 3 rows Yes — Original-Medicare home health has no deductible). These gate the corresponding amount columns. |
| pbp_b6_copay_{mc,hs,rc,cc}_amt[_min/_max] / pbp_b6_copay_mcamt[max] |  | Home-health copay DOLLAR amounts by sub-category: mc=Medicare-covered home health (primary), hs/rc/cc=other home-health sub-services. _min/_max give the range; the bare/_mcamt is a point value. Observed range $0-$65 (mostly $0 — MA home health rarely charges). Populated only when copay_yn='1'. |
| pbp_b6_coins_pct_{mc,hs,rc,cc}[_min/_max] + pbp_b6_coins_cov_* |  | Home-health coinsurance PERCENT by sub-category (double, 0-35, median 0). coins_cov_* are coverage-descriptor codes (1-6) for what the coinsurance applies to. Populated only when coins_yn='1' (very sparse for mc: ~12 non-null). |
| pbp_b6_ded_amt / pbp_b_6_ded_amt / pbp_b6_ded_amt_pos |  | Home-health deductible dollar amount. Essentially always NULL (deductible_yn is overwhelmingly No); only 3 rows carry a value ($124). pbp_b_6_ded_amt / pbp_b_6_ded_yesno are legacy duplicate spellings (underscore-6) of the same concept, nearly all NULL. |
| pbp_b6_maxenr_* (amt, per, per_d, yn) / pbp_b6_maxpln_* / pbp_b6_maxplan_yesno_pos |  | Maximum enrollee out-of-pocket / maximum plan benefit caps on home health: yn flag ('2'=No in 191,273 rows — caps rare), amt=dollar cap, per/per_d=period the cap applies over (coded + decoded). _pos variants are for the POS/out-of-network side. Almost entirely No/NULL for this benefit. |
| pbp_b6_mm_* (services, nmc_yn, auth_yn, refer_yn, coins_*, copay_*, limit_*, maxplan_*) |  | The 'MM' sub-block = additional / Non-Medicare-Covered (NMC) in-home support & supplemental home-health services a plan may add. VERY sparse: ~200,350 of 201,488 rows NULL. mm_nmc_yn='1' in only 1,138 rows. mm_services is a 4-bit service-category bitmask ('0100','0111',...). mm_limit_* encode visit/unit limits (num + period + unit-type, with _d decoded text). Use only for the small set of plans offering expanded home health. |
| pbp_b6_*_pos suffix columns |  | Point-of-service / out-of-network cost-share variants (copay_amtv_pos, coins_*_pos, maxpln_*_pos, ded_*_pos, etc.). Largely vestigial here — e.g. pbp_b6_copay_amtv_pos is 100% NULL. Present for schema symmetry with POS-capable plan types. |
| observed_period (date) |  | The plan year as a date — always Jan 1 of report_year. Constant within a (report_year, quarter). Bitemporal 'valid-time' anchor; redundant with report_year. |
| effective_period_start / effective_period_end (date) |  | Benefit validity window: Jan 1 -> Dec 31 of report_year (effective_period_end is ALWAYS Dec 31, verified). Defines the plan year the cost-sharing is in force. |
| asserted_at (date) |  | Bitemporal 'transaction-time' — the date this row was loaded/asserted into the lake. Only 2 values (2026-05-16: 100,054 rows; 2026-05-20: 101,434). It is an INGEST date, NOT a benefit date; do not confuse with effective_period. |
| cms_vintage_sequence (int) |  | Sequence (1-4) of the CMS quarterly release within ingestion. Maps 1:1 to the quarterly source file batch (v1=Q1 load of 100,054, etc.). Each grain row has exactly ONE vintage (verified 0 multi-vintage groups) — so it is NOT a within-grain dedup/is_current marker. |
| parse_revision (int) |  | Version of the parser/pipeline that produced the row (1 or 2 observed). Provenance for reproducibility; not a business key. |
| parser_artifact_hash / source_url / sha256_content_hash |  | Provenance trio: parser_artifact_hash = code-artifact fingerprint; source_url = the exact CMS PBP zip (e.g. .../pbp-benefits-2022-quarter-2.zip, 40 distinct = 40 year-quarter files); sha256_content_hash = content hash of the source file. Enables full lineage back to the CMS download. |

Tools that read it: get_pbp_benefit

Query it: `query_substrate` with `SELECT ... FROM medicare_silver.pbp_section_b6_home_health WHERE ... LIMIT 100`; read `describe_data_source("medicare_silver.pbp_section_b6_home_health")` first.
