# MA pbp section b2 snf

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

Section B2: Skilled nursing facility cost-share. Coverage: All years.

**Grain.** One row per Medicare Advantage plan-segment per benefit year per CMS quarterly PBP release. The minimal verified key is contract_id x plan_id x segment_id x report_year x quarter = 201,488 distinct = full row count (0 duplicate groups, max 1 row/group). Each (report_year, quarter) is a distinct CMS quarterly re-publication of that plan's SNF benefit design; older years (2001-2017) have only quarter=1, newer years carry up to 4 quarterly snapshots of the same plan-year.

**How to use it.** Get the current (latest-quarter) 2026 in-network SNF per-day copay for days 21-100 per MA plan: SELECT contract_id, plan_id, segment_id, pbp_b2_copay_mcs_bgnd_int2_t1 AS day_from, pbp_b2_copay_mcs_endd_int2_t1 AS day_to, pbp_b2_copay_mcs_amt_int2_t1 AS copay_per_day FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY contract_id,plan_id,segment_id,report_year ORDER BY quarter DESC) rn FROM pbp_section_b2_snf WHERE report_year=2026 AND pbp_a_ben_cov='1') WHERE rn=1 AND pbp_b2_copay_mcs_amt_int2_t1 IS NOT NULL. This answers 'what does each Medicare Advantage plan charge per day for a skilled nursing stay after the first 20 days', e.g. H0028 plan 007 = $218/day for days 21-100 ($0 for days 1-20).

**Traps.**
- COST-SHARING COLUMN FAMILIES SHIFT BY ERA (the #1 trap). Legacy flat columns (pbp_b2_copay_120_amts, pbp_b2_copay_21100_amts, pbp_b2_coins_pct_120/21100, pbp_b_2_ded_amt) are populated ONLY in 2001. Aggregate Medicare-covered-stay columns (pbp_b2_copay_mcs_amt, pbp_b2_coins_mcs_pct, pbp_b2_copay_nmcs_amt) cover 2002-2015. Per-interval/per-tier columns (pbp_b2_copay_mcs_amt_int{1,2,3}_t{1,2,3}, pbp_b2_coins_mcs_pct_int*_t*) cover 2016-2026. Querying SNF copay for a recent year using the flat _120/_21100/_mcs_amt columns returns ALL NULL -- you must use the int*_t* interval columns for 2016+.
- NO is_current column. The same plan-year can have up to 4 retained quarterly snapshots (17,470 plan-years have all 4 quarters). To get one current row per plan, dedup with ROW_NUMBER() OVER (PARTITION BY contract_id,plan_id,segment_id,report_year ORDER BY quarter DESC) -- or by cms_vintage_sequence DESC. quarter and cms_vintage_sequence track release recency but are NOT identical (e.g. 2021 Q1=vintage 4).
- bid_id LOOKS like a key but is NOT: it is NULL in 8,316 rows and is otherwise just the concat contract_id_plan_id_segment_id. Use the five component grain columns, not bid_id. The profiler's reported 16-column grain (incl pbp_b2_maxplan_* and version) is a SUPERSET -- those benefit/version columns are mostly NULL and not needed; the true minimal key is contract_id x plan_id x segment_id x report_year x quarter.
- 'version' is a per-plan BID version number (0-27), not a table/snapshot version -- many version values coexist inside one (report_year, quarter) release. Similarly pbp_b2_hosp_ben_period is a benefit-period CODE ('1'-'4'), NOT a date despite 'period' in its name, and observed_period/effective_period_start are just Jan-1-of-report_year (annual, redundant with report_year).
- Two parse runs live in asserted_at (2026-05-16 parse_revision=1 = all years; 2026-05-20 parse_revision=2 = re-parse of 2018-2024). The re-parse REPLACED rows so the grain stays unique, but filtering on parse_revision/asserted_at would silently drop years. Coverage is also irregular: not every year has 4 quarters (2020 no Q3, 2021 Q1-only, 2024 no Q2). Filter pbp_a_ben_cov='1' to keep only plans that actually offer SNF (4,373 rows are '2'=not offered).

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS Medicare Advantage/Part D contract ID (e.g. 'H0028'). 1,972 distinct. Part of the grain. Joins to plan-level CMS tables on contract. |
| plan_id | string | Plan ID within the contract (e.g. '001','008'), zero-padded 3-char string. 656 distinct values (reused across contracts). Part of the grain. |
| segment_id | string | Plan segment ID (e.g. '0','1','2') for plans that vary benefits by service-area segment. 27 distinct; '0' for non-segmented plans. Part of the grain. |
| version | double | Per-row plan bid version counter, 0-27. This is the plan's PBP submission/bid version, NOT a snapshot version of the table; many different version values coexist within one (report_year, quarter) release. Exactly 1 value per grain row, so not needed in the key. |
| report_year | double | Benefit/contract year the SNF design applies to (double 2001.0-2026.0, 26 distinct). Part of the grain. Equals year of effective_period_start. |
| quarter | double | CMS quarterly PBP release within the contract year (1-4). Part of the grain - the same plan-year appears as separate rows for each quarterly re-release CMS published. Only quarter=1 exists for 2001-2017; 2018+ has multiple quarters but coverage is irregular (2020 missing Q3, 2021 Q1-only, 2024 missing Q2). |
| bid_id | string | Composite 'contract_id_plan_id_segment_id' (e.g. 'H0028_008_1'). NULL in 8,316 rows (mostly older years) so it is NOT a safe key; redundant with the three component columns when present. |
| orgtype | string | CMS organization-type code (string). '01'=dominant (177,737, local CCP/HMO-PPO), then '08','04','11','06','05','02'. Identifies the MA organization structure. |
| pbp_a_ben_cov | string | Benefit-offered flag carried from PBP section A: '1'=SNF benefit offered (196,773), '2'=not offered (4,373), NULL=342. Filter to '1' for plans that actually cover SNF. |
| pbp_a_plan_type | string | CMS plan-type code (string): '01'=HMO (101,510), '04'=Local PPO (55,909), '02'=HMO-POS (20,097), '20'=PFFS, '09'=Regional PPO, '31'=MSA, etc. From section A. |
| pbp_b2_ad_cost_vary_low_tier | string |  |
| pbp_b2_ad_cost_vary_tier_num | string |  |
| pbp_b2_ad_cost_vary_tiers_yn | string |  |
| pbp_b2_auth | string |  |
| pbp_b2_auth_bonly | string |  |
| pbp_b2_auth_pos | string |  |
| pbp_b2_auth_pos_bonly | string |  |
| pbp_b2_auth_yn | string |  |
| pbp_b2_auth_yn_bonly | string |  |
| pbp_b2_bende_al_ad_prior_bonly | double |  |
| pbp_b2_bende_nmday_prior_bonly | string |  |
| pbp_b2_bendec_pr_al_ad_cs | string |  |
| pbp_b2_bendec_yesno | string |  |
| pbp_b2_bendec_yesno_bonly | string |  |
| pbp_b2_bendes_snf_per_bonly | string |  |
| pbp_b2_bendesc_ad | double |  |
| pbp_b2_bendesc_ad_nmcs | string |  |
| pbp_b2_bendesc_al_ad | double |  |
| pbp_b2_bendesc_al_ad_prior | double |  |
| pbp_b2_bendesc_al_ad_prior_b | double |  |
| pbp_b2_bendesc_amo_ad | string |  |
| pbp_b2_bendesc_amo_al | string |  |
| pbp_b2_bendesc_amo_bonly | string |  |
| pbp_b2_bendesc_amo_nmcs | string |  |
| pbp_b2_bendesc_amo_pr | string |  |
| pbp_b2_bendesc_hostay_bonly_yn | string |  |
| pbp_b2_bendesc_pr_hosp_num | string |  |
| pbp_b2_bendesc_pr_hosp_yn | string |  |
| pbp_b2_bendesc_snf_per_bonly | string |  |
| pbp_b2_bendesc_snf_per_bonly_d | string |  |
| pbp_b2_bendesc_snf_unlm_bonly | string |  |
| pbp_b2_bendesc_snfcare_amo_b | string |  |
| pbp_b2_bendesc_yn | string |  |
| pbp_b2_bendesc_yn_bonly | string |  |
| pbp_b2_benedesc_lim_ad | string |  |
| pbp_b2_coins_ad_bgnd_int1_t1 | double |  |
| pbp_b2_coins_ad_bgnd_int1_t2 | double |  |
| pbp_b2_coins_ad_bgnd_int1_t3 | double |  |
| pbp_b2_coins_ad_bgnd_int2_t1 | double |  |
| pbp_b2_coins_ad_bgnd_int2_t2 | double |  |
| pbp_b2_coins_ad_bgnd_int2_t3 | double |  |
| pbp_b2_coins_ad_bgnd_int3_t1 | double |  |
| pbp_b2_coins_ad_bgnd_int3_t2 | double |  |
| pbp_b2_coins_ad_bgnd_int3_t3 | double |  |
| pbp_b2_coins_ad_bgnd_intrvl1 | double |  |
| pbp_b2_coins_ad_bgnd_intrvl2 | double |  |
| pbp_b2_coins_ad_bgnd_intrvl3 | double |  |
| pbp_b2_coins_ad_endd_int1_t1 | double |  |
| pbp_b2_coins_ad_endd_int1_t2 | double |  |
| pbp_b2_coins_ad_endd_int1_t3 | double |  |
| pbp_b2_coins_ad_endd_int2_t1 | double |  |
| pbp_b2_coins_ad_endd_int2_t2 | double |  |
| pbp_b2_coins_ad_endd_int2_t3 | double |  |
| pbp_b2_coins_ad_endd_int3_t1 | double |  |
| pbp_b2_coins_ad_endd_int3_t2 | double |  |
| pbp_b2_coins_ad_endd_int3_t3 | double |  |
| pbp_b2_coins_ad_endd_intrvl1 | double |  |
| pbp_b2_coins_ad_endd_intrvl2 | double |  |
| pbp_b2_coins_ad_endd_intrvl3 | double |  |
| pbp_b2_coins_ad_intrvl_num | string |  |
| pbp_b2_coins_ad_intrvl_num_t1 | string |  |
| pbp_b2_coins_ad_intrvl_num_t2 | string |  |
| pbp_b2_coins_ad_intrvl_num_t3 | string |  |
| pbp_b2_coins_ad_pct_int1_t1 | double |  |
| pbp_b2_coins_ad_pct_int1_t2 | double |  |
| pbp_b2_coins_ad_pct_int1_t3 | double |  |
| pbp_b2_coins_ad_pct_int2_t1 | double |  |
| pbp_b2_coins_ad_pct_int2_t2 | double |  |
| pbp_b2_coins_ad_pct_int2_t3 | double |  |
| pbp_b2_coins_ad_pct_int3_t1 | double |  |
| pbp_b2_coins_ad_pct_int3_t2 | double |  |
| pbp_b2_coins_ad_pct_int3_t3 | double |  |
| pbp_b2_coins_ad_pct_intrvl1 | double |  |
| pbp_b2_coins_ad_pct_intrvl2 | double |  |
| pbp_b2_coins_ad_pct_intrvl3 | double |  |
| pbp_b2_coins_cov_120 | string |  |
| pbp_b2_coins_cov_21100 | string |  |
| pbp_b2_coins_cov_ad | string |  |
| pbp_b2_coins_cov_bonly | string |  |
| pbp_b2_coins_cov_cs | string |  |
| pbp_b2_coins_cov_pos | string |  |
| pbp_b2_coins_cov_pos_bonly | string |  |
| pbp_b2_coins_cov_ps | string |  |
| pbp_b2_coins_mcs_bgnd_int1_t1 | double |  |
| pbp_b2_coins_mcs_bgnd_int1_t2 | double |  |
| pbp_b2_coins_mcs_bgnd_int1_t3 | double |  |
| pbp_b2_coins_mcs_bgnd_int2_t1 | double |  |
| pbp_b2_coins_mcs_bgnd_int2_t2 | double |  |
| pbp_b2_coins_mcs_bgnd_int2_t3 | double |  |
| pbp_b2_coins_mcs_bgnd_int3_t1 | double |  |
| pbp_b2_coins_mcs_bgnd_int3_t2 | double |  |
| pbp_b2_coins_mcs_bgnd_int3_t3 | double |  |
| pbp_b2_coins_mcs_bgnd_intrvl1 | double |  |
| pbp_b2_coins_mcs_bgnd_intrvl2 | double |  |
| pbp_b2_coins_mcs_bgnd_intrvl3 | double |  |
| pbp_b2_coins_mcs_endd_int1_t1 | double |  |
| pbp_b2_coins_mcs_endd_int1_t2 | double |  |
| pbp_b2_coins_mcs_endd_int1_t3 | double |  |
| pbp_b2_coins_mcs_endd_int2_t1 | double |  |
| pbp_b2_coins_mcs_endd_int2_t2 | double |  |
| pbp_b2_coins_mcs_endd_int2_t3 | double |  |
| pbp_b2_coins_mcs_endd_int3_t1 | double |  |
| pbp_b2_coins_mcs_endd_int3_t2 | double |  |
| pbp_b2_coins_mcs_endd_int3_t3 | double |  |
| pbp_b2_coins_mcs_endd_intrvl1 | double |  |
| pbp_b2_coins_mcs_endd_intrvl2 | double |  |
| pbp_b2_coins_mcs_endd_intrvl3 | double |  |
| pbp_b2_coins_mcs_int_num_t1 | string |  |
| pbp_b2_coins_mcs_int_num_t2 | string |  |
| pbp_b2_coins_mcs_int_num_t3 | string |  |
| pbp_b2_coins_mcs_intrvl_num | string |  |
| pbp_b2_coins_mcs_pct | double |  |
| pbp_b2_coins_mcs_pct_int1_t1 | double |  |
| pbp_b2_coins_mcs_pct_int1_t2 | double |  |
| pbp_b2_coins_mcs_pct_int1_t3 | double |  |
| pbp_b2_coins_mcs_pct_int2_t1 | double |  |
| pbp_b2_coins_mcs_pct_int2_t2 | double |  |
| pbp_b2_coins_mcs_pct_int2_t3 | double |  |
| pbp_b2_coins_mcs_pct_int3_t1 | double |  |
| pbp_b2_coins_mcs_pct_int3_t2 | double |  |
| pbp_b2_coins_mcs_pct_int3_t3 | double |  |
| pbp_b2_coins_mcs_pct_intrvl1 | double |  |
| pbp_b2_coins_mcs_pct_intrvl2 | double |  |
| pbp_b2_coins_mcs_pct_intrvl3 | double |  |
| pbp_b2_coins_mcs_pct_t1 | double |  |
| pbp_b2_coins_mcs_pct_t2 | double |  |
| pbp_b2_coins_mcs_pct_t3 | double |  |
| pbp_b2_coins_nmcs_bgnd_intrvl1 | double |  |
| pbp_b2_coins_nmcs_bgnd_intrvl2 | double |  |
| pbp_b2_coins_nmcs_bgnd_intrvl3 | double |  |
| pbp_b2_coins_nmcs_cov | string |  |
| pbp_b2_coins_nmcs_endd_intrvl1 | double |  |
| pbp_b2_coins_nmcs_endd_intrvl2 | double |  |
| pbp_b2_coins_nmcs_endd_intrvl3 | double |  |
| pbp_b2_coins_nmcs_intrvl_num | string |  |
| pbp_b2_coins_nmcs_pct | double |  |
| pbp_b2_coins_nmcs_pct_intrvl1 | double |  |
| pbp_b2_coins_nmcs_pct_intrvl2 | double |  |
| pbp_b2_coins_nmcs_pct_intrvl3 | double |  |
| pbp_b2_coins_nmcs_struc_yn | string |  |
| pbp_b2_coins_pct_120 | double |  |
| pbp_b2_coins_pct_21100 | double |  |
| pbp_b2_coins_pct_ad | double |  |
| pbp_b2_coins_pct_bonly | double |  |
| pbp_b2_coins_pct_cs | double |  |
| pbp_b2_coins_pct_pos | double |  |
| pbp_b2_coins_pct_pos_bonly | double |  |
| pbp_b2_coins_pct_ps | double |  |
| pbp_b2_coins_ps_bgnd1_bonly | double |  |
| pbp_b2_coins_ps_bgnd2_bonly | double |  |
| pbp_b2_coins_ps_bgnd3_bonly | double |  |
| pbp_b2_coins_ps_endd1_bonly | double |  |
| pbp_b2_coins_ps_endd2_bonly | double |  |
| pbp_b2_coins_ps_endd3_bonly | double |  |
| pbp_b2_coins_ps_num_bonly | string |  |
| pbp_b2_coins_ps_pct1_bonly | double |  |
| pbp_b2_coins_ps_pct2_bonly | double |  |
| pbp_b2_coins_ps_pct3_bonly | double |  |
| pbp_b2_coins_yesno | string |  |
| pbp_b2_coins_yesno_bonly | string |  |
| pbp_b2_coins_yesno_pos | string |  |
| pbp_b2_coins_yesno_pos_bonly | string |  |
| pbp_b2_coins_yn | string |  |
| pbp_b2_coins_yn_bonly | string |  |
| pbp_b2_copay_120_amts | double |  |
| pbp_b2_copay_21100_amts | double |  |
| pbp_b2_copay_ad_amt_int1_t1 | double |  |
| pbp_b2_copay_ad_amt_int1_t2 | double |  |
| pbp_b2_copay_ad_amt_int1_t3 | double |  |
| pbp_b2_copay_ad_amt_int2_t1 | double |  |
| pbp_b2_copay_ad_amt_int2_t2 | double |  |
| pbp_b2_copay_ad_amt_int2_t3 | double |  |
| pbp_b2_copay_ad_amt_int3_t1 | double |  |
| pbp_b2_copay_ad_amt_int3_t2 | double |  |
| pbp_b2_copay_ad_amt_int3_t3 | double |  |
| pbp_b2_copay_ad_amt_intrvl1 | double |  |
| pbp_b2_copay_ad_amt_intrvl2 | double |  |
| pbp_b2_copay_ad_amt_intrvl3 | double |  |
| pbp_b2_copay_ad_amts | double |  |
| pbp_b2_copay_ad_bgnd_int1_t1 | double |  |
| pbp_b2_copay_ad_bgnd_int1_t2 | double |  |
| pbp_b2_copay_ad_bgnd_int1_t3 | double |  |
| pbp_b2_copay_ad_bgnd_int2_t1 | double |  |
| pbp_b2_copay_ad_bgnd_int2_t2 | double |  |
| pbp_b2_copay_ad_bgnd_int2_t3 | double |  |
| pbp_b2_copay_ad_bgnd_int3_t1 | double |  |
| pbp_b2_copay_ad_bgnd_int3_t2 | double |  |
| pbp_b2_copay_ad_bgnd_int3_t3 | double |  |
| pbp_b2_copay_ad_bgnd_intrvl1 | double |  |
| pbp_b2_copay_ad_bgnd_intrvl2 | double |  |
| pbp_b2_copay_ad_bgnd_intrvl3 | double |  |
| pbp_b2_copay_ad_endd_int1_t1 | double |  |
| pbp_b2_copay_ad_endd_int1_t2 | double |  |
| pbp_b2_copay_ad_endd_int1_t3 | double |  |
| pbp_b2_copay_ad_endd_int2_t1 | double |  |
| pbp_b2_copay_ad_endd_int2_t2 | double |  |
| pbp_b2_copay_ad_endd_int2_t3 | double |  |
| pbp_b2_copay_ad_endd_int3_t1 | double |  |
| pbp_b2_copay_ad_endd_int3_t2 | double |  |
| pbp_b2_copay_ad_endd_int3_t3 | double |  |
| pbp_b2_copay_ad_endd_intrvl1 | double |  |
| pbp_b2_copay_ad_endd_intrvl2 | double |  |
| pbp_b2_copay_ad_endd_intrvl3 | double |  |
| pbp_b2_copay_ad_intrvl_num | string |  |
| pbp_b2_copay_ad_intrvl_num_t1 | string |  |
| pbp_b2_copay_ad_intrvl_num_t2 | string |  |
| pbp_b2_copay_ad_intrvl_num_t3 | string |  |
| pbp_b2_copay_amtd_pos | double |  |
| pbp_b2_copay_amtd_pos_bonly | double |  |
| pbp_b2_copay_amts_pos | double |  |
| pbp_b2_copay_amts_pos_bonly | double |  |
| pbp_b2_copay_mcs_amt | double |  |
| pbp_b2_copay_mcs_amt_int1_t1 | double |  |
| pbp_b2_copay_mcs_amt_int1_t2 | double |  |
| pbp_b2_copay_mcs_amt_int1_t3 | double |  |
| pbp_b2_copay_mcs_amt_int2_t1 | double |  |
| pbp_b2_copay_mcs_amt_int2_t2 | double |  |
| pbp_b2_copay_mcs_amt_int2_t3 | double |  |
| pbp_b2_copay_mcs_amt_int3_t1 | double |  |
| pbp_b2_copay_mcs_amt_int3_t2 | double |  |
| pbp_b2_copay_mcs_amt_int3_t3 | double |  |
| pbp_b2_copay_mcs_amt_intrvl1 | double |  |
| pbp_b2_copay_mcs_amt_intrvl2 | double |  |
| pbp_b2_copay_mcs_amt_intrvl3 | double |  |
| pbp_b2_copay_mcs_amt_t1 | double |  |
| pbp_b2_copay_mcs_amt_t2 | double |  |
| pbp_b2_copay_mcs_amt_t3 | double |  |
| pbp_b2_copay_mcs_bgnd_int1_t1 | double |  |
| pbp_b2_copay_mcs_bgnd_int1_t2 | double |  |
| pbp_b2_copay_mcs_bgnd_int1_t3 | double |  |
| pbp_b2_copay_mcs_bgnd_int2_t1 | double |  |
| pbp_b2_copay_mcs_bgnd_int2_t2 | double |  |
| pbp_b2_copay_mcs_bgnd_int2_t3 | double |  |
| pbp_b2_copay_mcs_bgnd_int3_t1 | double |  |
| pbp_b2_copay_mcs_bgnd_int3_t2 | double |  |
| pbp_b2_copay_mcs_bgnd_int3_t3 | double |  |
| pbp_b2_copay_mcs_bgnd_intrvl1 | double |  |
| pbp_b2_copay_mcs_bgnd_intrvl2 | double |  |
| pbp_b2_copay_mcs_bgnd_intrvl3 | double |  |
| pbp_b2_copay_mcs_endd_int1_t1 | double |  |
| pbp_b2_copay_mcs_endd_int1_t2 | double |  |
| pbp_b2_copay_mcs_endd_int1_t3 | double |  |
| pbp_b2_copay_mcs_endd_int2_t1 | double |  |
| pbp_b2_copay_mcs_endd_int2_t2 | double |  |
| pbp_b2_copay_mcs_endd_int2_t3 | double |  |
| pbp_b2_copay_mcs_endd_int3_t1 | double |  |
| pbp_b2_copay_mcs_endd_int3_t2 | double |  |
| pbp_b2_copay_mcs_endd_int3_t3 | double |  |
| pbp_b2_copay_mcs_endd_intrvl1 | double |  |
| pbp_b2_copay_mcs_endd_intrvl2 | double |  |
| pbp_b2_copay_mcs_endd_intrvl3 | double |  |
| pbp_b2_copay_mcs_int_num_t1 | string |  |
| pbp_b2_copay_mcs_int_num_t2 | string |  |
| pbp_b2_copay_mcs_int_num_t3 | string |  |
| pbp_b2_copay_mcs_intrvl_num | string |  |
| pbp_b2_copay_nmcs_amt | double |  |
| pbp_b2_copay_nmcs_amt_intrvl1 | double |  |
| pbp_b2_copay_nmcs_amt_intrvl2 | double |  |
| pbp_b2_copay_nmcs_amt_intrvl3 | double |  |
| pbp_b2_copay_nmcs_bgnd_intrvl1 | double |  |
| pbp_b2_copay_nmcs_bgnd_intrvl2 | double |  |
| pbp_b2_copay_nmcs_bgnd_intrvl3 | double |  |
| pbp_b2_copay_nmcs_endd_intrvl1 | double |  |
| pbp_b2_copay_nmcs_endd_intrvl2 | double |  |
| pbp_b2_copay_nmcs_endd_intrvl3 | double |  |
| pbp_b2_copay_nmcs_intrvl_num | string |  |
| pbp_b2_copay_nmcs_struc_yn | string |  |
| pbp_b2_copay_nmed_amts | double |  |
| pbp_b2_copay_pd_amts_bonly | double |  |
| pbp_b2_copay_ps_amt1_bonly | double |  |
| pbp_b2_copay_ps_amt2_bonly | double |  |
| pbp_b2_copay_ps_amt3_bonly | double |  |
| pbp_b2_copay_ps_amt_bonly | double |  |
| pbp_b2_copay_ps_amts | double |  |
| pbp_b2_copay_ps_amts_bonly | double |  |
| pbp_b2_copay_ps_bgnd1_bonly | double |  |
| pbp_b2_copay_ps_bgnd2_bonly | double |  |
| pbp_b2_copay_ps_bgnd3_bonly | double |  |
| pbp_b2_copay_ps_endd1_bonly | double |  |
| pbp_b2_copay_ps_endd2_bonly | double |  |
| pbp_b2_copay_ps_endd3_bonly | double |  |
| pbp_b2_copay_ps_num_bonly | string |  |
| pbp_b2_copay_yesno | string |  |
| pbp_b2_copay_yesno_bonly | string |  |
| pbp_b2_copay_yesno_pos | string |  |
| pbp_b2_copay_yesno_pos_bonly | string |  |
| pbp_b2_copay_yn | string |  |
| pbp_b2_copay_yn_bonly | string |  |
| pbp_b2_cost_discharge_yn | string |  |
| pbp_b2_cost_vary_low_tier | string |  |
| pbp_b2_cost_vary_tier_num | string |  |
| pbp_b2_cost_vary_tiers_yn | string |  |
| pbp_b2_ded_amt | double |  |
| pbp_b2_ded_amt_bonly | double |  |
| pbp_b2_ded_amt_pos | double |  |
| pbp_b2_ded_amt_pos_bonly | double |  |
| pbp_b2_ded_amt_t1 | double |  |
| pbp_b2_ded_amt_t2 | double |  |
| pbp_b2_ded_amt_t3 | double |  |
| pbp_b2_ded_yesno_pos | string |  |
| pbp_b2_ded_yesno_pos_bonly | string |  |
| pbp_b2_ded_yn | string |  |
| pbp_b2_ded_yn_bonly | string |  |
| pbp_b2_esrd_copay_amt | double |  |
| pbp_b2_esrd_maxenr_amt | double |  |
| pbp_b2_hosp_ben_period | string |  |
| pbp_b2_hosp_ben_period_oth | string |  |
| pbp_b2_maxenr_amt | double |  |
| pbp_b2_maxenr_amt_bonly | double |  |
| pbp_b2_maxenr_amt_pos | double |  |
| pbp_b2_maxenr_amt_pos_bonly | double |  |
| pbp_b2_maxenr_per | string |  |
| pbp_b2_maxenr_per_bonly | string |  |
| pbp_b2_maxenr_per_bonly_d | string |  |
| pbp_b2_maxenr_per_d | string |  |
| pbp_b2_maxenr_yesno | string |  |
| pbp_b2_maxenr_yesno_bonly | string |  |
| pbp_b2_maxenr_yn | string |  |
| pbp_b2_maxenr_yn_bonly | string |  |
| pbp_b2_maxenr_yn_pos | string |  |
| pbp_b2_maxenr_yn_pos_bonly | string |  |
| pbp_b2_maxplan_amt_bonly | double |  |
| pbp_b2_maxplan_cov_bonly | string |  |
| pbp_b2_maxplan_per_bonly | string |  |
| pbp_b2_maxplan_per_bonly_d | string |  |
| pbp_b2_maxplan_yesno_bonly | string |  |
| pbp_b2_maxplan_yesno_pos | string |  |
| pbp_b2_maxplan_yesno_pos_bonly | string |  |
| pbp_b2_maxplan_yn_bonly | string |  |
| pbp_b2_maxpln_amt_pos | double |  |
| pbp_b2_maxpln_amt_pos_bonly | double |  |
| pbp_b2_maxpln_cov_pos | string |  |
| pbp_b2_maxpln_cov_pos_bonly | string |  |
| pbp_b2_maxpln_per_pos | string |  |
| pbp_b2_maxpln_per_pos_bonly | string |  |
| pbp_b2_mc_coins_cstshr_yn_t1 | string |  |
| pbp_b2_mc_coins_cstshr_yn_t2 | string |  |
| pbp_b2_mc_coins_cstshr_yn_t3 | string |  |
| pbp_b2_mc_copay_cstshr_yn_t1 | string |  |
| pbp_b2_mc_copay_cstshr_yn_t2 | string |  |
| pbp_b2_mc_copay_cstshr_yn_t3 | string |  |
| pbp_b2_mdcr_coins_cstshrs_yn | string |  |
| pbp_b2_mdcr_copay_cstshrs_yn | string |  |
| pbp_b2_notes | string |  |
| pbp_b2_pffs_copay_amt | double |  |
| pbp_b2_pffs_maxenr_amt | double |  |
| pbp_b2_refer_yn | string |  |
| pbp_b2_refer_yn_bonly | string |  |
| pbp_b_2_ded_amt | double |  |
| pbp_b_2_ded_amt_bonly | double |  |
| pbp_b_2_ded_yesno | string |  |
| pbp_b_2_ded_yesno_bonly | string |  |
| observed_period | date | Snapshot/observation period = Jan 1 of report_year (annual, 26 distinct). Equals effective_period_start in this table; redundant with report_year. |
| asserted_at | date |  |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int | Monotonic CMS release-ordering integer (1-4) within a year. Correlates with quarter (Q1->1...Q4->4) but NOT identical (2021 Q1=4, 2022 Q1=2). Useful as a 'latest snapshot' tiebreaker per plan-year alongside quarter. |
| parse_revision | int |  |
| parser_artifact_hash | string |  |
| source_url | string |  |
| sha256_content_hash | string |  |
| pbp_b_2_ded_amt / pbp_b_2_ded_yesno (and _bonly) |  | LEGACY flat SNF deductible amount / yes-no flag. Populated essentially only in 2001 (2 rows); all-NULL for modern years. Note the underscore: pbp_b_2_ (extra underscore) is the legacy field; pbp_b2_ded_* is the newer tiered field. |
| pbp_b2_copay_120_amts / pbp_b2_copay_21100_amts |  | LEGACY flat per-day copay for SNF days 1-20 ('120') and days 21-100 ('21100'). Populated only in 2001 (508 rows). All-NULL 2002+. The original Medicare SNF day-band structure. |
| pbp_b2_coins_pct_120 / pbp_b2_coins_pct_21100 |  | LEGACY flat SNF coinsurance percent for days 1-20 / 21-100. Populated only ~2001. All-NULL for modern years. |
| pbp_b2_copay_mcs_amt / pbp_b2_coins_mcs_pct (and _nmcs_) |  | MID-ERA (2002-2015) aggregate Medicare-Covered-Stay copay amount / coinsurance percent; _nmcs_ = Non-Medicare-Covered-Stay. All-NULL in 2016+ (superseded by interval columns). mcs = Medicare-covered SNF stay, nmcs = extra non-Medicare-covered days the plan offers. |
| pbp_b2_copay_mcs_amt_int{1,2,3}_t{1,2,3} / pbp_b2_coins_mcs_pct_int*_t* |  | CURRENT-ERA (2016-2026) per-day SNF cost-sharing. int = day-range interval (int1=days 1-20 typically $0; int2=days 21-100 e.g. $218/day), t = network/cost tier (t1=primary in-network; t2/t3 for tiered-SNF plans). A plan uses copay OR coins, not both. bgnd/endd_int*_t* give begin/end day of each interval; *_int_num_t* gives number of intervals. Main cost-data payload for recent years. |
| pbp_b2_coins_cov_* / pbp_b2_copay_*_amts / pbp_b2_*_yesno / pbp_b2_*_yn |  | Cost-share applicability flags and aggregate amounts. *_yesno / *_yn = whether copay or coinsurance applies ('1'=yes,'2'=no, often NULL in modern years where interval columns carry detail). Suffixes scope variants: bonly=benefit-only, pos=point-of-service/out-of-network, ps=per-stay, cs=cost-share, ad=additional-days. |
| pbp_b2_auth / pbp_b2_auth_yn (and _pos, _bonly) |  | Prior-authorization required for SNF: pbp_b2_auth_yn '1'=yes (6,611 in 2026), '2'=no (240), NULL=569. _pos variants = for out-of-network/POS. |
| pbp_b2_maxenr_amt / _yn / _per (and _bonly, _pos, _esrd, _pffs) |  | SNF-section maximum-enrollee out-of-pocket cap: _yn '2'=No cap applied (the norm, 21,534 in 2024), '1'=Yes (rare, carries _amt e.g. $4,144 and _per period code). Mostly NULL/'No'. esrd/pffs/maxplan variants are sub-population caps. |
| pbp_b2_maxplan_amt_bonly / _cov_bonly / _per_bonly / _yn_bonly / _yesno_pos* |  | Plan-level SNF benefit maximum (benefit-only). Sparse. NOTE: the profiler wrongly listed these 9 maxplan_* columns as part of the grain key - they are benefit attributes, not keys (mostly NULL), and are NOT needed for uniqueness. |
| pbp_b2_bendesc_* / pbp_b2_bende_* / pbp_b2_benedesc_* |  | Benefit-description fields: number of extra/additional SNF days, prior-hospital-stay requirement (pbp_b2_bendesc_pr_hosp_yn / _num), unlimited-days flag (pbp_b2_bendesc_snf_unlm_bonly), SNF-period definitions. Mostly coded strings or day counts; many sparse. |
| pbp_b2_hosp_ben_period / _oth |  | SNF benefit-period definition CODE (string '1'/'2'/'3'/'4'), NOT a date despite 'period' in the name. '1' dominant (108,271). Defines how the SNF benefit period is structured (per-stay vs per-benefit-period etc.). |
| pbp_b2_ad_cost_vary_* / pbp_b2_coins_mcs_struc_yn / *_intrvl_num |  | Structural descriptors: whether additional-day cost varies by tier (ad_cost_vary_tiers_yn, _tier_num, _low_tier), whether a multi-interval coinsurance structure is used (_struc_yn), and interval-count fields (_intrvl_num, _int_num_t*). |
| effective_period_start / effective_period_end |  | Benefit year window derived from report_year: start = Jan 1 of report_year, end = Dec 31 (e.g. 2026-01-01 / 2026-12-31). Annual. 26 distinct starts. Profiler's primary time column. |
| asserted_at / parse_revision |  | Vlada ingestion provenance: two parse runs exist - asserted_at='2026-05-16'/parse_revision=1 covers all 24 years (2001-2026); '2026-05-20'/parse_revision=2 is a re-parse of 2018-2024. The re-parse REPLACED rows (grain has 0 dupes), it did not duplicate. Not a business-version of the benefit. |
| parser_artifact_hash / source_url / sha256_content_hash |  | Vlada provenance/lineage: hash of the parser artifact, the source PBP file URL it was parsed from, and the SHA-256 of the source file content. For audit/provenance, not analytics. |

Tools that read it: get_pbp_benefit

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