Medicare Advantage, Part D, Medicaid

MA pbp section b2 snf

medicare_silver.pbp_section_b2_snf·partial·silver·annual·Medicare Advantage Plan Benefit Packages (PBP)
Rows
N/A
Columns
386
History
2001 (report_year=2001 / effective_period_start 2001-01-01) to 2026 (report_year=2026 / effective_period_start 2026-01-01)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1CMS Medicare Advantage Plan Benefit Package (PBP) Section B-2: the Skilled Nursing Facility (SNF) inpatient benefit design for every MA / MA-PD plan-segment.
  2. 2It records, per plan per benefit year, what an SNF stay costs the enrollee (per-day copays by day-band, coinsurance %, deductibles, prior-auth, day limits, OOP caps) -- the cost-sharing terms a Medicare Advantage member faces for a skilled nursing facility stay.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per Medicare Advantage plan-segment per benefit year per CMS quarterly PBP release.
  2. 2The 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).
  3. 3Each (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 read it

  1. 1Get 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.
  2. 2This answers 'what does each Medicare Advantage plan charge per day for a skilled nursing stay after the first 20 days', e.g.
  3. 3H0028 plan 007 = $218/day for days 21-100 ($0 for days 1-20).

Traps

  1. 1COST-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+.
  2. 2NO 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).
  3. 3bid_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.
  4. 4'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).
  5. 5Two 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).

Columns (386)

ColumnTypeMeaning
contract_idstringCMS 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_idstringPlan ID within the contract (e.g. '001','008'), zero-padded 3-char string. 656 distinct values (reused across contracts). Part of the grain.
segment_idstringPlan 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.
versiondoublePer-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_yeardoubleBenefit/contract year the SNF design applies to (double 2001.0-2026.0, 26 distinct). Part of the grain. Equals year of effective_period_start.
quarterdoubleCMS 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_idstringComposite '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.
orgtypestringCMS 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_covstringBenefit-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_typestringCMS 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_tierstring
pbp_b2_ad_cost_vary_tier_numstring
pbp_b2_ad_cost_vary_tiers_ynstring
pbp_b2_authstring
pbp_b2_auth_bonlystring
pbp_b2_auth_posstring
pbp_b2_auth_pos_bonlystring
pbp_b2_auth_ynstring
pbp_b2_auth_yn_bonlystring
pbp_b2_bende_al_ad_prior_bonlydouble
pbp_b2_bende_nmday_prior_bonlystring
pbp_b2_bendec_pr_al_ad_csstring
pbp_b2_bendec_yesnostring
pbp_b2_bendec_yesno_bonlystring
pbp_b2_bendes_snf_per_bonlystring
pbp_b2_bendesc_addouble
pbp_b2_bendesc_ad_nmcsstring
pbp_b2_bendesc_al_addouble
pbp_b2_bendesc_al_ad_priordouble
pbp_b2_bendesc_al_ad_prior_bdouble
pbp_b2_bendesc_amo_adstring
pbp_b2_bendesc_amo_alstring
pbp_b2_bendesc_amo_bonlystring
pbp_b2_bendesc_amo_nmcsstring
pbp_b2_bendesc_amo_prstring
pbp_b2_bendesc_hostay_bonly_ynstring
pbp_b2_bendesc_pr_hosp_numstring
pbp_b2_bendesc_pr_hosp_ynstring
pbp_b2_bendesc_snf_per_bonlystring
pbp_b2_bendesc_snf_per_bonly_dstring
pbp_b2_bendesc_snf_unlm_bonlystring
pbp_b2_bendesc_snfcare_amo_bstring
pbp_b2_bendesc_ynstring
pbp_b2_bendesc_yn_bonlystring
pbp_b2_benedesc_lim_adstring
pbp_b2_coins_ad_bgnd_int1_t1double
pbp_b2_coins_ad_bgnd_int1_t2double
pbp_b2_coins_ad_bgnd_int1_t3double
pbp_b2_coins_ad_bgnd_int2_t1double
pbp_b2_coins_ad_bgnd_int2_t2double
pbp_b2_coins_ad_bgnd_int2_t3double
pbp_b2_coins_ad_bgnd_int3_t1double
pbp_b2_coins_ad_bgnd_int3_t2double
pbp_b2_coins_ad_bgnd_int3_t3double
pbp_b2_coins_ad_bgnd_intrvl1double
pbp_b2_coins_ad_bgnd_intrvl2double
pbp_b2_coins_ad_bgnd_intrvl3double
pbp_b2_coins_ad_endd_int1_t1double
pbp_b2_coins_ad_endd_int1_t2double
pbp_b2_coins_ad_endd_int1_t3double
pbp_b2_coins_ad_endd_int2_t1double
pbp_b2_coins_ad_endd_int2_t2double
pbp_b2_coins_ad_endd_int2_t3double
pbp_b2_coins_ad_endd_int3_t1double
pbp_b2_coins_ad_endd_int3_t2double
pbp_b2_coins_ad_endd_int3_t3double
pbp_b2_coins_ad_endd_intrvl1double
pbp_b2_coins_ad_endd_intrvl2double
pbp_b2_coins_ad_endd_intrvl3double
pbp_b2_coins_ad_intrvl_numstring
pbp_b2_coins_ad_intrvl_num_t1string
pbp_b2_coins_ad_intrvl_num_t2string
pbp_b2_coins_ad_intrvl_num_t3string
pbp_b2_coins_ad_pct_int1_t1double
pbp_b2_coins_ad_pct_int1_t2double
pbp_b2_coins_ad_pct_int1_t3double
pbp_b2_coins_ad_pct_int2_t1double
pbp_b2_coins_ad_pct_int2_t2double
pbp_b2_coins_ad_pct_int2_t3double
pbp_b2_coins_ad_pct_int3_t1double
pbp_b2_coins_ad_pct_int3_t2double
pbp_b2_coins_ad_pct_int3_t3double
pbp_b2_coins_ad_pct_intrvl1double
pbp_b2_coins_ad_pct_intrvl2double
pbp_b2_coins_ad_pct_intrvl3double
pbp_b2_coins_cov_120string
pbp_b2_coins_cov_21100string
pbp_b2_coins_cov_adstring
pbp_b2_coins_cov_bonlystring
pbp_b2_coins_cov_csstring
pbp_b2_coins_cov_posstring
pbp_b2_coins_cov_pos_bonlystring
pbp_b2_coins_cov_psstring
pbp_b2_coins_mcs_bgnd_int1_t1double
pbp_b2_coins_mcs_bgnd_int1_t2double
pbp_b2_coins_mcs_bgnd_int1_t3double
pbp_b2_coins_mcs_bgnd_int2_t1double
pbp_b2_coins_mcs_bgnd_int2_t2double
pbp_b2_coins_mcs_bgnd_int2_t3double
pbp_b2_coins_mcs_bgnd_int3_t1double
pbp_b2_coins_mcs_bgnd_int3_t2double
pbp_b2_coins_mcs_bgnd_int3_t3double
pbp_b2_coins_mcs_bgnd_intrvl1double
pbp_b2_coins_mcs_bgnd_intrvl2double
pbp_b2_coins_mcs_bgnd_intrvl3double
pbp_b2_coins_mcs_endd_int1_t1double
pbp_b2_coins_mcs_endd_int1_t2double
pbp_b2_coins_mcs_endd_int1_t3double
pbp_b2_coins_mcs_endd_int2_t1double
pbp_b2_coins_mcs_endd_int2_t2double
pbp_b2_coins_mcs_endd_int2_t3double
pbp_b2_coins_mcs_endd_int3_t1double
pbp_b2_coins_mcs_endd_int3_t2double
pbp_b2_coins_mcs_endd_int3_t3double
pbp_b2_coins_mcs_endd_intrvl1double
pbp_b2_coins_mcs_endd_intrvl2double
pbp_b2_coins_mcs_endd_intrvl3double
pbp_b2_coins_mcs_int_num_t1string
pbp_b2_coins_mcs_int_num_t2string
pbp_b2_coins_mcs_int_num_t3string
pbp_b2_coins_mcs_intrvl_numstring
pbp_b2_coins_mcs_pctdouble
pbp_b2_coins_mcs_pct_int1_t1double
pbp_b2_coins_mcs_pct_int1_t2double
pbp_b2_coins_mcs_pct_int1_t3double
pbp_b2_coins_mcs_pct_int2_t1double
pbp_b2_coins_mcs_pct_int2_t2double
pbp_b2_coins_mcs_pct_int2_t3double
pbp_b2_coins_mcs_pct_int3_t1double
pbp_b2_coins_mcs_pct_int3_t2double
pbp_b2_coins_mcs_pct_int3_t3double
pbp_b2_coins_mcs_pct_intrvl1double
pbp_b2_coins_mcs_pct_intrvl2double
pbp_b2_coins_mcs_pct_intrvl3double
pbp_b2_coins_mcs_pct_t1double
pbp_b2_coins_mcs_pct_t2double
pbp_b2_coins_mcs_pct_t3double
pbp_b2_coins_nmcs_bgnd_intrvl1double
pbp_b2_coins_nmcs_bgnd_intrvl2double
pbp_b2_coins_nmcs_bgnd_intrvl3double
pbp_b2_coins_nmcs_covstring
pbp_b2_coins_nmcs_endd_intrvl1double
pbp_b2_coins_nmcs_endd_intrvl2double
pbp_b2_coins_nmcs_endd_intrvl3double
pbp_b2_coins_nmcs_intrvl_numstring
pbp_b2_coins_nmcs_pctdouble
pbp_b2_coins_nmcs_pct_intrvl1double
pbp_b2_coins_nmcs_pct_intrvl2double
pbp_b2_coins_nmcs_pct_intrvl3double
pbp_b2_coins_nmcs_struc_ynstring
pbp_b2_coins_pct_120double
pbp_b2_coins_pct_21100double
pbp_b2_coins_pct_addouble
pbp_b2_coins_pct_bonlydouble
pbp_b2_coins_pct_csdouble
pbp_b2_coins_pct_posdouble
pbp_b2_coins_pct_pos_bonlydouble
pbp_b2_coins_pct_psdouble
pbp_b2_coins_ps_bgnd1_bonlydouble
pbp_b2_coins_ps_bgnd2_bonlydouble
pbp_b2_coins_ps_bgnd3_bonlydouble
pbp_b2_coins_ps_endd1_bonlydouble
pbp_b2_coins_ps_endd2_bonlydouble
pbp_b2_coins_ps_endd3_bonlydouble
pbp_b2_coins_ps_num_bonlystring
pbp_b2_coins_ps_pct1_bonlydouble
pbp_b2_coins_ps_pct2_bonlydouble
pbp_b2_coins_ps_pct3_bonlydouble
pbp_b2_coins_yesnostring
pbp_b2_coins_yesno_bonlystring
pbp_b2_coins_yesno_posstring
pbp_b2_coins_yesno_pos_bonlystring
pbp_b2_coins_ynstring
pbp_b2_coins_yn_bonlystring
pbp_b2_copay_120_amtsdouble
pbp_b2_copay_21100_amtsdouble
pbp_b2_copay_ad_amt_int1_t1double
pbp_b2_copay_ad_amt_int1_t2double
pbp_b2_copay_ad_amt_int1_t3double
pbp_b2_copay_ad_amt_int2_t1double
pbp_b2_copay_ad_amt_int2_t2double
pbp_b2_copay_ad_amt_int2_t3double
pbp_b2_copay_ad_amt_int3_t1double
pbp_b2_copay_ad_amt_int3_t2double
pbp_b2_copay_ad_amt_int3_t3double
pbp_b2_copay_ad_amt_intrvl1double
pbp_b2_copay_ad_amt_intrvl2double
pbp_b2_copay_ad_amt_intrvl3double
pbp_b2_copay_ad_amtsdouble
pbp_b2_copay_ad_bgnd_int1_t1double
pbp_b2_copay_ad_bgnd_int1_t2double
pbp_b2_copay_ad_bgnd_int1_t3double
pbp_b2_copay_ad_bgnd_int2_t1double
pbp_b2_copay_ad_bgnd_int2_t2double
pbp_b2_copay_ad_bgnd_int2_t3double
pbp_b2_copay_ad_bgnd_int3_t1double
pbp_b2_copay_ad_bgnd_int3_t2double
pbp_b2_copay_ad_bgnd_int3_t3double
pbp_b2_copay_ad_bgnd_intrvl1double
pbp_b2_copay_ad_bgnd_intrvl2double
pbp_b2_copay_ad_bgnd_intrvl3double
pbp_b2_copay_ad_endd_int1_t1double
pbp_b2_copay_ad_endd_int1_t2double
pbp_b2_copay_ad_endd_int1_t3double
pbp_b2_copay_ad_endd_int2_t1double
pbp_b2_copay_ad_endd_int2_t2double
pbp_b2_copay_ad_endd_int2_t3double
pbp_b2_copay_ad_endd_int3_t1double
pbp_b2_copay_ad_endd_int3_t2double
pbp_b2_copay_ad_endd_int3_t3double
pbp_b2_copay_ad_endd_intrvl1double
pbp_b2_copay_ad_endd_intrvl2double
pbp_b2_copay_ad_endd_intrvl3double
pbp_b2_copay_ad_intrvl_numstring
pbp_b2_copay_ad_intrvl_num_t1string
pbp_b2_copay_ad_intrvl_num_t2string
pbp_b2_copay_ad_intrvl_num_t3string
pbp_b2_copay_amtd_posdouble
pbp_b2_copay_amtd_pos_bonlydouble
pbp_b2_copay_amts_posdouble
pbp_b2_copay_amts_pos_bonlydouble
pbp_b2_copay_mcs_amtdouble
pbp_b2_copay_mcs_amt_int1_t1double
pbp_b2_copay_mcs_amt_int1_t2double
pbp_b2_copay_mcs_amt_int1_t3double
pbp_b2_copay_mcs_amt_int2_t1double
pbp_b2_copay_mcs_amt_int2_t2double
pbp_b2_copay_mcs_amt_int2_t3double
pbp_b2_copay_mcs_amt_int3_t1double
pbp_b2_copay_mcs_amt_int3_t2double
pbp_b2_copay_mcs_amt_int3_t3double
pbp_b2_copay_mcs_amt_intrvl1double
pbp_b2_copay_mcs_amt_intrvl2double
pbp_b2_copay_mcs_amt_intrvl3double
pbp_b2_copay_mcs_amt_t1double
pbp_b2_copay_mcs_amt_t2double
pbp_b2_copay_mcs_amt_t3double
pbp_b2_copay_mcs_bgnd_int1_t1double
pbp_b2_copay_mcs_bgnd_int1_t2double
pbp_b2_copay_mcs_bgnd_int1_t3double
pbp_b2_copay_mcs_bgnd_int2_t1double
pbp_b2_copay_mcs_bgnd_int2_t2double
pbp_b2_copay_mcs_bgnd_int2_t3double
pbp_b2_copay_mcs_bgnd_int3_t1double
pbp_b2_copay_mcs_bgnd_int3_t2double
pbp_b2_copay_mcs_bgnd_int3_t3double
pbp_b2_copay_mcs_bgnd_intrvl1double
pbp_b2_copay_mcs_bgnd_intrvl2double
pbp_b2_copay_mcs_bgnd_intrvl3double
pbp_b2_copay_mcs_endd_int1_t1double
pbp_b2_copay_mcs_endd_int1_t2double
pbp_b2_copay_mcs_endd_int1_t3double
pbp_b2_copay_mcs_endd_int2_t1double
pbp_b2_copay_mcs_endd_int2_t2double
pbp_b2_copay_mcs_endd_int2_t3double
pbp_b2_copay_mcs_endd_int3_t1double
pbp_b2_copay_mcs_endd_int3_t2double
pbp_b2_copay_mcs_endd_int3_t3double
pbp_b2_copay_mcs_endd_intrvl1double
pbp_b2_copay_mcs_endd_intrvl2double
pbp_b2_copay_mcs_endd_intrvl3double
pbp_b2_copay_mcs_int_num_t1string
pbp_b2_copay_mcs_int_num_t2string
pbp_b2_copay_mcs_int_num_t3string
pbp_b2_copay_mcs_intrvl_numstring
pbp_b2_copay_nmcs_amtdouble
pbp_b2_copay_nmcs_amt_intrvl1double
pbp_b2_copay_nmcs_amt_intrvl2double
pbp_b2_copay_nmcs_amt_intrvl3double
pbp_b2_copay_nmcs_bgnd_intrvl1double
pbp_b2_copay_nmcs_bgnd_intrvl2double
pbp_b2_copay_nmcs_bgnd_intrvl3double
pbp_b2_copay_nmcs_endd_intrvl1double
pbp_b2_copay_nmcs_endd_intrvl2double
pbp_b2_copay_nmcs_endd_intrvl3double
pbp_b2_copay_nmcs_intrvl_numstring
pbp_b2_copay_nmcs_struc_ynstring
pbp_b2_copay_nmed_amtsdouble
pbp_b2_copay_pd_amts_bonlydouble
pbp_b2_copay_ps_amt1_bonlydouble
pbp_b2_copay_ps_amt2_bonlydouble
pbp_b2_copay_ps_amt3_bonlydouble
pbp_b2_copay_ps_amt_bonlydouble
pbp_b2_copay_ps_amtsdouble
pbp_b2_copay_ps_amts_bonlydouble
pbp_b2_copay_ps_bgnd1_bonlydouble
pbp_b2_copay_ps_bgnd2_bonlydouble
pbp_b2_copay_ps_bgnd3_bonlydouble
pbp_b2_copay_ps_endd1_bonlydouble
pbp_b2_copay_ps_endd2_bonlydouble
pbp_b2_copay_ps_endd3_bonlydouble
pbp_b2_copay_ps_num_bonlystring
pbp_b2_copay_yesnostring
pbp_b2_copay_yesno_bonlystring
pbp_b2_copay_yesno_posstring
pbp_b2_copay_yesno_pos_bonlystring
pbp_b2_copay_ynstring
pbp_b2_copay_yn_bonlystring
pbp_b2_cost_discharge_ynstring
pbp_b2_cost_vary_low_tierstring
pbp_b2_cost_vary_tier_numstring
pbp_b2_cost_vary_tiers_ynstring
pbp_b2_ded_amtdouble
pbp_b2_ded_amt_bonlydouble
pbp_b2_ded_amt_posdouble
pbp_b2_ded_amt_pos_bonlydouble
pbp_b2_ded_amt_t1double
pbp_b2_ded_amt_t2double
pbp_b2_ded_amt_t3double
pbp_b2_ded_yesno_posstring
pbp_b2_ded_yesno_pos_bonlystring
pbp_b2_ded_ynstring
pbp_b2_ded_yn_bonlystring
pbp_b2_esrd_copay_amtdouble
pbp_b2_esrd_maxenr_amtdouble
pbp_b2_hosp_ben_periodstring
pbp_b2_hosp_ben_period_othstring
pbp_b2_maxenr_amtdouble
pbp_b2_maxenr_amt_bonlydouble
pbp_b2_maxenr_amt_posdouble
pbp_b2_maxenr_amt_pos_bonlydouble
pbp_b2_maxenr_perstring
pbp_b2_maxenr_per_bonlystring
pbp_b2_maxenr_per_bonly_dstring
pbp_b2_maxenr_per_dstring
pbp_b2_maxenr_yesnostring
pbp_b2_maxenr_yesno_bonlystring
pbp_b2_maxenr_ynstring
pbp_b2_maxenr_yn_bonlystring
pbp_b2_maxenr_yn_posstring
pbp_b2_maxenr_yn_pos_bonlystring
pbp_b2_maxplan_amt_bonlydouble
pbp_b2_maxplan_cov_bonlystring
pbp_b2_maxplan_per_bonlystring
pbp_b2_maxplan_per_bonly_dstring
pbp_b2_maxplan_yesno_bonlystring
pbp_b2_maxplan_yesno_posstring
pbp_b2_maxplan_yesno_pos_bonlystring
pbp_b2_maxplan_yn_bonlystring
pbp_b2_maxpln_amt_posdouble
pbp_b2_maxpln_amt_pos_bonlydouble
pbp_b2_maxpln_cov_posstring
pbp_b2_maxpln_cov_pos_bonlystring
pbp_b2_maxpln_per_posstring
pbp_b2_maxpln_per_pos_bonlystring
pbp_b2_mc_coins_cstshr_yn_t1string
pbp_b2_mc_coins_cstshr_yn_t2string
pbp_b2_mc_coins_cstshr_yn_t3string
pbp_b2_mc_copay_cstshr_yn_t1string
pbp_b2_mc_copay_cstshr_yn_t2string
pbp_b2_mc_copay_cstshr_yn_t3string
pbp_b2_mdcr_coins_cstshrs_ynstring
pbp_b2_mdcr_copay_cstshrs_ynstring
pbp_b2_notesstring
pbp_b2_pffs_copay_amtdouble
pbp_b2_pffs_maxenr_amtdouble
pbp_b2_refer_ynstring
pbp_b2_refer_yn_bonlystring
pbp_b_2_ded_amtdouble
pbp_b_2_ded_amt_bonlydouble
pbp_b_2_ded_yesnostring
pbp_b_2_ded_yesno_bonlystring
observed_perioddateSnapshot/observation period = Jan 1 of report_year (annual, 26 distinct). Equals effective_period_start in this table; redundant with report_year.
asserted_atdate
effective_period_startdate
effective_period_enddate
cms_vintage_sequenceintMonotonic 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_revisionint
parser_artifact_hashstring
source_urlstring
sha256_content_hashstring
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_amtsLEGACY 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_21100LEGACY 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_*_ynCost-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 / _othSNF 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_numStructural 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_endBenefit 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_revisionVlada 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_hashVlada 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.

Query it

describe_data_source(source_fqn="medicare_silver.pbp_section_b2_snf")     # the card, live
query_substrate(sql="SELECT * FROM medicare_silver.pbp_section_b2_snf 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
Joinhow_to_join(source_fqn="medicare_silver.pbp_section_b2_snf")
Raw doorAthena (read-only via query_substrate): medicare_silver.pbp_section_b2_snf
NoteGrain-governed; live in Glue / query_substrate. Source family pbp_benefits.

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