# MA pbp mrx

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

Part D Rx plan-level/group detail from mrx.txt. Coverage begins in 2006; insulin/IRA fields are added in later eras. Legacy repeated rows are retained at the source-native MRx group grain.

**Grain.** One row per Medicare plan-segment (a CMS 'bid': contract_id + plan_id + segment_id, captured as bid_id) per quarterly CMS PBP release (report_year + quarter + cms_vintage_sequence). The minimal verified unique key is (bid_id, report_year, quarter, cms_vintage_sequence) — equivalently (contract_id, plan_id, segment_id, report_year, quarter, cms_vintage_sequence) — which yields exactly 208,537 distinct combinations against 208,537 rows. Within a single release, bid_id alone is unique (e.g. 8,326 plans in the 2026 Q1 vintage-1 snapshot). This is the plan-level Section MRx (Part D Rx benefit) record, NOT one row per formulary tier.

**How to use it.** Pick ONE snapshot, then read plan-level Part D design. Example: SELECT bid_id, mrx_drug_ben_yn, mrx_benefit_type, mrx_alt_ded_amount FROM medicare_silver.pbp_mrx WHERE report_year=2026 AND quarter=1 AND cms_vintage_sequence=1 AND mrx_drug_ben_yn='1' — returns, for every 2026 Medicare plan that offers Part D, its benefit type (4=Enhanced Alternative) and Part D deductible (e.g. 615.0 = the CY2026 standard). To analyze actual generic/brand copays per formulary tier and pharmacy channel, join bid_id+snapshot to the sibling table medicare_silver.pbp_mrx_tier (this table does NOT carry usable tier copays). To trend a plan over years, group by report_year keeping one release per year (e.g. MIN(quarter)/MIN(cms_vintage_sequence)).

**Traps.**
- NOT a tier/copay table. This is the PLAN-LEVEL Part D record (~8K plans/year). The per-tier × per-pharmacy generic/brand copay & coinsurance amounts live in the SIBLING table pbp_mrx_tier (~27-33K rows = one per plan×tier). The mrx_gen_* copay matrix here is ~empty (mrx_gen_in_1m: 632 non-null of 208,537). NEVER read 'the plan's drug copay' from this table, and never sum tier copays here.
- Grain needs FOUR columns, not the obvious ones. Minimal verified key = (bid_id, report_year, quarter, cms_vintage_sequence) [= contract_id+plan_id+segment_id+report_year+quarter+cms_vintage_sequence], 208,537 distinct = 208,537 rows. Dropping cms_vintage_sequence creates 16,307 dup rows (2021 Q1 & 2022 Q1 were each loaded at two vintages from two CMS ZIPs); dropping quarter creates 8,336 dups. bid_id is unique only WITHIN one snapshot (8,326 in 2025 Q1).
- The profiler's reported grain is WRONG/superset — it leaned on mrx_grp_id, mrx_grp_type_id, mrx_v_bid_attestation, etc. mrx_grp_id and mrx_grp_type_id are 100% NULL across all 208,537 rows (this table is never exploded to benefit-group rows), so those columns spuriously appeared to 'add uniqueness.' Ignore them as keys.
- No is_current column and NO dedup applied — every quarterly CMS release is STACKED. There are 30 snapshots (report_year × quarter × cms_vintage_sequence). To get 'the current plan benefits' you MUST filter, e.g. report_year=2026 AND quarter=1 AND cms_vintage_sequence=1 (or pick MAX vintage per year). Querying without a snapshot filter double/triple-counts plans and mixes 16 years.
- Massive year-dependent column sparsity driven by documented PBP layout churn. Of 356 columns most are NULL for any given year: CY2022-Q2 moved 42 cols OUT of pbp_mrx into siblings (pbp_vbid, pbp_mrx_dmodel, pbp_mrx_ssm); CY2024 'New PBP' redesign reshaped Section D; CY2026 discontinued VBID and removed the coverage-gap (IRA). Examples observed: mrx_formulary_yn/mrx_basic_plan_yn/mrx_alt_drug_type 100% NULL in 2026; mrx_quantity_limits only 2010-2021; mrx_form_tier_model_5 only 2013-2016. Always check non-null coverage for your target year before trusting a column.
- Report year 2020 is entirely MISSING (data jumps 2019→2021). This is the documented CY2020 CMS filename quirk (the file shipped as 'pbp_mrx 2.txt' with the canonical 'pbp_mrx.txt' absent), so 2020 was not ingested. Don't treat the gap as data loss for other years.
- mrx_drug_ben_yn='2' (~12% of plans) means the plan offers NO Part D benefit — those rows are shells with all cost/deductible fields NULL (verified: 0 such rows have mrx_alt_ded_amount set). Filter to mrx_drug_ben_yn='1' before analyzing drug cost-share.
- Identifier columns are zero-padded strings, not numbers: plan_id='001', segment_id='0', pbp_a_plan_type='01', orgtype='08'. Join/compare as strings. version, report_year, quarter, mrx_*_amt are doubles. Missing values are true SQL NULL (no '.' or '' sentinel leakage — verified).

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS Medicare Advantage/Part D contract ID (e.g. H0016, H0022). String, 1,806 distinct. First component of bid_id. A contract holds many plans. |
| plan_id | string | 3-digit plan number within the contract (e.g. 001, 003, 007). String, 656 distinct values (reused across contracts). Second component of bid_id. |
| segment_id | string | Plan segment number, string '0'-'25'. '0' for unsegmented plans (the vast majority); >0 identifies geographic/benefit segments of a segmented plan. Third component of bid_id. Part of the grain. |
| version | double | CMS bid submission/refile version for that plan-year (double 1..12+). Plan metadata, NOT a snapshot/dedup key; most plans are v1-4, higher versions progressively rarer. Do not use to dedup. |
| report_year | double | Benefit/contract year the PBP describes (double, 2010-2026; 2020 is ABSENT). Part of the snapshot grain. Equals YEAR(effective_period_start). |
| quarter | double | CMS release quarter for that plan-year (double 1-4). PBP is re-released quarterly; quarter labels which release. Part of the grain. NOTE: 2010-2017 only have Q1; later years have multiple quarters. |
| bid_id | string | Concatenated plan identity contract_id_plan_id_segment_id (e.g. 'H0028_007_0'). The natural per-snapshot primary key; exactly = (contract_id//plan_id//segment_id). Unique within one CMS release. |
| max_rai_ann_partd_rew_amt_1rx | double |  |
| max_rai_ann_partd_rew_amt_2rx | double |  |
| max_rai_ann_partd_rew_amt_3rx | double |  |
| max_rai_frq_rew_incent_1rx | string |  |
| max_rai_frq_rew_incent_2rx | string |  |
| max_rai_frq_rew_incent_3rx | string |  |
| max_rai_partd_rew_inc_amt_1rx | double |  |
| max_rai_partd_rew_inc_amt_2rx | double |  |
| max_rai_partd_rew_inc_amt_3rx | double |  |
| mrx_ae_copay_lesser_yn | string |  |
| mrx_ae_cstshr_apply | string |  |
| mrx_ae_cstshr_grps | double |  |
| mrx_ae_oon_cstshr_struct | string |  |
| mrx_ae_ooptcs_apply | string |  |
| mrx_ae_ot_grps | double |  |
| mrx_alt_copay_lesser_yn | string |  |
| mrx_alt_cov_lmt_amt | double |  |
| mrx_alt_cov_lmt_yn | string |  |
| mrx_alt_cstshr_post_oopt | string |  |
| mrx_alt_cstshr_post_oopt_mmp | string |  |
| mrx_alt_ded_amount | double | Part D deductible dollar amount for the plan's (enhanced-alternative) design (double). Real & current: CY2026 standard = 615.0. Populated for ~half of drug-offering plans (others use $0 or tier-differential deductibles). One of the few cost fields reliably populated in this parent table. |
| mrx_alt_ded_charge | string |  |
| mrx_alt_ded_tier_cstshr_yn | string |  |
| mrx_alt_ded_type_yn | string |  |
| mrx_alt_drug_type | string |  |
| mrx_alt_excl_drugs_maxplan_yn | string |  |
| mrx_alt_excl_drugs_yn | string |  |
| mrx_alt_excl_max_plan_amt | double |  |
| mrx_alt_fulfill_desc | string |  |
| mrx_alt_gap_covg_brand | string |  |
| mrx_alt_gap_covg_gen | string |  |
| mrx_alt_gap_covg_tier | string |  |
| mrx_alt_gap_covg_yn | string |  |
| mrx_alt_gap_drug_type | string |  |
| mrx_alt_gen_coins_pct | double |  |
| mrx_alt_gen_copay_amt | double |  |
| mrx_alt_gen_cstshr_struct | string |  |
| mrx_alt_ira_covg_tier | string |  |
| mrx_alt_lim_amt | double |  |
| mrx_alt_max_enroll_mmp_amt | double |  |
| mrx_alt_max_enroll_mmp_yn | string |  |
| mrx_alt_no_ded_tier | string |  |
| mrx_alt_oon_cstshr_struct | string |  |
| mrx_alt_post_icl_yn | string |  |
| mrx_alt_pre_icl_cost_share | string |  |
| mrx_alt_pre_icl_cost_share_mmp | string |  |
| mrx_alt_pre_icl_exclud_only_yn | string |  |
| mrx_alt_pre_icl_lis_mmp_tiers | string |  |
| mrx_alt_pre_icl_lis_mmp_yn | string |  |
| mrx_alt_red_cost_sharing | string |  |
| mrx_alt_red_cost_sharing_items | string |  |
| mrx_auth_ynba | string |  |
| mrx_avg_exp_cost_share_attest | string |  |
| mrx_b_auth_yn | string |  |
| mrx_b_coins_amt_maacqcost | double |  |
| mrx_b_coins_awp_disc | double |  |
| mrx_b_coins_covbasis | string |  |
| mrx_b_coins_max_dispfee | double |  |
| mrx_b_coins_min_dispfee | double |  |
| mrx_b_coins_pct | double |  |
| mrx_b_coins_prp_disc | double |  |
| mrx_b_coins_yn | string |  |
| mrx_b_copay_max_amt | double |  |
| mrx_b_copay_min_amt | double |  |
| mrx_b_copay_yn | string |  |
| mrx_b_ded_amt | double |  |
| mrx_b_ded_yn | string |  |
| mrx_b_max_oop_amt | double |  |
| mrx_b_max_oop_per | string |  |
| mrx_b_max_oop_yn | string |  |
| mrx_ba_cov_lmt_amt | double |  |
| mrx_ba_cov_lmt_yn | string |  |
| mrx_ba_cstshr_apply | string |  |
| mrx_ba_cstshr_grps | double |  |
| mrx_ba_ded_amount | double |  |
| mrx_ba_ded_charge | string |  |
| mrx_ba_ooptcs_apply | string |  |
| mrx_ba_ot_grps | double |  |
| mrx_basic_plan_yn | string |  |
| mrx_basic_plan_zero_prem_yn | string |  |
| mrx_benefit_type | string | Part D benefit design type, string '1'-'4' (4=Enhanced Alternative dominant; 1=Defined Standard, 2=Actuarially Equivalent, 3=Basic Alternative) plus NULL (~2,500/yr, mostly the no-drug plans). Distinguishes basic vs enhanced coverage. |
| mrx_ceiling_price_yn | string |  |
| mrx_d_adher_goal | string |  |
| mrx_d_adher_goal_desc | string |  |
| mrx_d_elig_freq_other | string |  |
| mrx_d_eligcrit_chk | string |  |
| mrx_d_eligcrit_other | string |  |
| mrx_d_pmm_flex_chk | string |  |
| mrx_d_red_cs_lisb_detail | string |  |
| mrx_d_ri_amt | double |  |
| mrx_d_ri_elig_rdo | string |  |
| mrx_d_ri_max_amt | double |  |
| mrx_d_ri_type_chk | string |  |
| mrx_d_ri_type_other | string |  |
| mrx_demo_type | string |  |
| mrx_demo_yn | string |  |
| mrx_drug_ben_yn | string | KEY GATE: does the plan offer a Part D drug benefit? String '1'=yes (offers Rx, ~88%), '2'=no (~12%). drug_ben_yn='2' rows are shells with all cost fields NULL. |
| mrx_ea_cov_lmt_amt | double |  |
| mrx_ea_cov_lmt_yn | string |  |
| mrx_ea_cstshr_apply | string |  |
| mrx_ea_cstshr_group | double |  |
| mrx_ea_cstshr_group_sec | double |  |
| mrx_ea_cstshr_grps | double |  |
| mrx_ea_cstshr_post_oopt | string |  |
| mrx_ea_cstshr_post_oopt_sec | string |  |
| mrx_ea_ded_amount | double |  |
| mrx_ea_ded_charge | string |  |
| mrx_ea_oop_th_amt | double |  |
| mrx_ea_oop_th_amt_sec | double |  |
| mrx_ea_oop_th_yn | string |  |
| mrx_ea_oop_th_yn_sec | string |  |
| mrx_ea_sec_covlmt_icl_amt | double |  |
| mrx_ea_sec_covlmt_icl_yn | string |  |
| mrx_excluded_tiers_yn | string |  |
| mrx_first_fill | string |  |
| mrx_floor_price_yn | string |  |
| mrx_form_model_desc | string |  |
| mrx_form_model_type | string |  |
| mrx_form_tier_model_2 | string |  |
| mrx_form_tier_model_2_mmp | string |  |
| mrx_form_tier_model_3 | string |  |
| mrx_form_tier_model_3_mmp | string |  |
| mrx_form_tier_model_4 | string |  |
| mrx_form_tier_model_4_mmp | string |  |
| mrx_form_tier_model_5 | string |  |
| mrx_form_tier_model_5_mmp | string |  |
| mrx_form_tier_model_5_opt1 | string |  |
| mrx_form_tier_model_5_opt2 | string |  |
| mrx_form_tier_model_5_opt3 | string |  |
| mrx_form_tier_model_5_opt4 | string |  |
| mrx_form_tier_model_5_opt5 | string |  |
| mrx_form_tier_model_5_opt6 | string |  |
| mrx_form_tier_model_6 | string |  |
| mrx_form_tier_model_6_mmp | string |  |
| mrx_form_tier_model_6_opt1 | string |  |
| mrx_form_tier_model_6_opt2 | string |  |
| mrx_form_tier_model_6_opt3 | string |  |
| mrx_form_tier_model_6_opt4 | string |  |
| mrx_form_tier_model_6_opt5 | string |  |
| mrx_formulary_tiers_num | string |  |
| mrx_formulary_yn | string |  |
| mrx_free_gnrc_max_amt | double |  |
| mrx_free_gnrc_yn | string |  |
| mrx_gen_extd_first_fill | string |  |
| mrx_gen_in_1m | double |  |
| mrx_gen_in_2m | double |  |
| mrx_gen_in_3m | double |  |
| mrx_gen_innpp_1m | double |  |
| mrx_gen_innpp_2m | double |  |
| mrx_gen_innpp_3m | double |  |
| mrx_gen_innpp_os | double |  |
| mrx_gen_inp_1m | double |  |
| mrx_gen_inp_2m | double |  |
| mrx_gen_inp_3m | double |  |
| mrx_gen_inp_os | double |  |
| mrx_gen_inpp_1m | double |  |
| mrx_gen_inpp_2m | double |  |
| mrx_gen_inpp_3m | double |  |
| mrx_gen_inpp_os | double |  |
| mrx_gen_ira_ltcp_coins_1m | double |  |
| mrx_gen_ira_ltcp_copay_1m | double |  |
| mrx_gen_ira_mostd_coins_1m | double |  |
| mrx_gen_ira_mostd_coins_2m | double |  |
| mrx_gen_ira_mostd_coins_3m | double |  |
| mrx_gen_ira_mostd_copay_1m | double |  |
| mrx_gen_ira_mostd_copay_2m | double |  |
| mrx_gen_ira_mostd_copay_3m | double |  |
| mrx_gen_ira_oonp_coins_1m | double |  |
| mrx_gen_ira_oonp_coins_othnum | double |  |
| mrx_gen_ira_oonp_copay_1m | double |  |
| mrx_gen_ira_oonp_copay_othnum | double |  |
| mrx_gen_ira_rstd_coins_1m | double |  |
| mrx_gen_ira_rstd_coins_2m | double |  |
| mrx_gen_ira_rstd_coins_3m | double |  |
| mrx_gen_ira_rstd_copay_1m | double |  |
| mrx_gen_ira_rstd_copay_2m | double |  |
| mrx_gen_ira_rstd_copay_3m | double |  |
| mrx_gen_loc | string |  |
| mrx_gen_loc_in | string |  |
| mrx_gen_loc_inp | string |  |
| mrx_gen_loc_ltc | string |  |
| mrx_gen_loc_mo | string |  |
| mrx_gen_loc_mop | string |  |
| mrx_gen_loc_mostd | string |  |
| mrx_gen_loc_oon | string |  |
| mrx_gen_loc_rstd | string |  |
| mrx_gen_ltc_1m | double |  |
| mrx_gen_ltcp_1m | double |  |
| mrx_gen_ltcp_b_1m | double |  |
| mrx_gen_ltcp_b_os | double |  |
| mrx_gen_ltcp_g_1m | double |  |
| mrx_gen_ltcp_g_os | double |  |
| mrx_gen_mo_1m | double |  |
| mrx_gen_mo_2m | double |  |
| mrx_gen_mo_3m | double |  |
| mrx_gen_mo_os | double |  |
| mrx_gen_monpp_1m | double |  |
| mrx_gen_monpp_2m | double |  |
| mrx_gen_monpp_3m | double |  |
| mrx_gen_monpp_os | double |  |
| mrx_gen_mop_1m | double |  |
| mrx_gen_mop_2m | double |  |
| mrx_gen_mop_3m | double |  |
| mrx_gen_mopp_1m | double |  |
| mrx_gen_mopp_2m | double |  |
| mrx_gen_mopp_3m | double |  |
| mrx_gen_mopp_os | double |  |
| mrx_gen_mostd_1m | double |  |
| mrx_gen_mostd_2m | double |  |
| mrx_gen_mostd_3m | double |  |
| mrx_gen_oon_1m | double |  |
| mrx_gen_oon_os | double |  |
| mrx_gen_oonp_1m | double |  |
| mrx_gen_oonp_3m | double |  |
| mrx_gen_oonp_os | double |  |
| mrx_gen_rstd_1m | double |  |
| mrx_gen_rstd_2m | double |  |
| mrx_gen_rstd_3m | double |  |
| mrx_grp_coins_yn | string |  |
| mrx_grp_copay_yn | string |  |
| mrx_grp_id | string |  |
| mrx_grp_innpp_1m_num | double |  |
| mrx_grp_innpp_3m_num | double |  |
| mrx_grp_innpp_coins_1m | double |  |
| mrx_grp_innpp_coins_3m | double |  |
| mrx_grp_innpp_coins_os | double |  |
| mrx_grp_innpp_copay_1m | double |  |
| mrx_grp_innpp_copay_3m | double |  |
| mrx_grp_innpp_copay_os | double |  |
| mrx_grp_innpp_othnum | double |  |
| mrx_grp_innpp_presup | string |  |
| mrx_grp_inpp_1m_num | double |  |
| mrx_grp_inpp_3m_num | double |  |
| mrx_grp_inpp_co_num | double |  |
| mrx_grp_inpp_coins_1m | double |  |
| mrx_grp_inpp_coins_3m | double |  |
| mrx_grp_inpp_coins_os | double |  |
| mrx_grp_inpp_copay_1m | double |  |
| mrx_grp_inpp_copay_3m | double |  |
| mrx_grp_inpp_copay_os | double |  |
| mrx_grp_inpp_ps | string |  |
| mrx_grp_lbl | string |  |
| mrx_grp_lbl1 | string |  |
| mrx_grp_lbl2 | string |  |
| mrx_grp_locat | string |  |
| mrx_grp_mo_1m_num | double |  |
| mrx_grp_mo_3m_num | double |  |
| mrx_grp_mo_coins_1m | double |  |
| mrx_grp_mo_coins_3m | double |  |
| mrx_grp_mo_coins_os | double |  |
| mrx_grp_mo_copay_1m | double |  |
| mrx_grp_mo_copay_3m | double |  |
| mrx_grp_mo_copay_os | double |  |
| mrx_grp_mo_othnum | double |  |
| mrx_grp_mo_presup | string |  |
| mrx_grp_oonp_1m_num | double |  |
| mrx_grp_oonp_3m_num | double |  |
| mrx_grp_oonp_coins_1m | double |  |
| mrx_grp_oonp_coins_3m | double |  |
| mrx_grp_oonp_coins_os | double |  |
| mrx_grp_oonp_copay_1m | double |  |
| mrx_grp_oonp_copay_3m | double |  |
| mrx_grp_oonp_copay_os | double |  |
| mrx_grp_oonp_othnumn | double |  |
| mrx_grp_oonp_presup | string |  |
| mrx_grp_tier_lbl1 | string |  |
| mrx_grp_tier_lbl2 | string |  |
| mrx_grp_tierlbl | string |  |
| mrx_grp_type | string |  |
| mrx_grp_type_id | string |  |
| mrx_innpp_1m_num | double |  |
| mrx_innpp_3m_num | double |  |
| mrx_innpp_othnum | double |  |
| mrx_innpp_presup | string |  |
| mrx_inpp_1m_num | double |  |
| mrx_inpp_3m_num | double |  |
| mrx_inpp_co_num | double |  |
| mrx_inpp_ps | string |  |
| mrx_insulin_attest | string |  |
| mrx_limit_ofc_yn | string |  |
| mrx_locat | string |  |
| mrx_ltc_attest_flag | string |  |
| mrx_mo_1m_num | double |  |
| mrx_mo_3m_num | double |  |
| mrx_mo_othnum | double |  |
| mrx_mo_presup | string |  |
| mrx_nat_rx_cov_yn | string |  |
| mrx_oonp_1m_num | double |  |
| mrx_oonp_3m_num | double |  |
| mrx_oonp_othnumn | double |  |
| mrx_oonp_presup | string |  |
| mrx_otc_meds_attest_flag | string |  |
| mrx_otc_meds_pay_ump_yn | string |  |
| mrx_otc_step_therapy_yn | string |  |
| mrx_partd_network_loc | string |  |
| mrx_pen_lessexpen_yn | string |  |
| mrx_pen_oonpharm_yn | string |  |
| mrx_post_exclud_only_yn | string |  |
| mrx_pro_part_fill | string |  |
| mrx_ptd_nat_avg | double |  |
| mrx_quantity_limits | string |  |
| mrx_rai_adh_goal_notes_1rx | string |  |
| mrx_rai_adh_goal_notes_2rx | string |  |
| mrx_rai_adh_goal_notes_3rx | string |  |
| mrx_rai_elig_crit_1rx | string |  |
| mrx_rai_elig_crit_2rx | string |  |
| mrx_rai_elig_crit_3rx | string |  |
| mrx_rai_elig_crit_notes_1rx | string |  |
| mrx_rai_elig_crit_notes_2rx | string |  |
| mrx_rai_elig_crit_notes_3rx | string |  |
| mrx_rai_frq_ri_desc_1rx | string |  |
| mrx_rai_frq_ri_desc_2rx | string |  |
| mrx_rai_frq_ri_desc_3rx | string |  |
| mrx_rai_meet_adh_goal_yn_1rx | string |  |
| mrx_rai_meet_adh_goal_yn_2rx | string |  |
| mrx_rai_meet_adh_goal_yn_3rx | string |  |
| mrx_rai_num_partd_offrd | string |  |
| mrx_rai_off_rew_incent_yn | string |  |
| mrx_rai_rew_inc_notes_1rx | string |  |
| mrx_rai_rew_inc_notes_2rx | string |  |
| mrx_rai_rew_inc_notes_3rx | string |  |
| mrx_rai_type_partd_rew_1rx | string |  |
| mrx_rai_type_partd_rew_2rx | string |  |
| mrx_rai_type_partd_rew_3rx | string |  |
| mrx_reduct_cost_yn | string |  |
| mrx_snp_zerocost_attest | string |  |
| mrx_sp_access_yn | string |  |
| mrx_step_ther_drugs_yn | string |  |
| mrx_tier_extd_days_gen_yn | string |  |
| mrx_tier_form_ex | string |  |
| mrx_tier_form_ex_2 | double |  |
| mrx_tier_form_ex_2_yn | string |  |
| mrx_tier_group_num | double |  |
| mrx_v_bid_attestation | string |  |
| mrx_vaccine_attest | string |  |
| orgtype | string | CMS organization type code, string (01=Local CCP/HMO-PPO dominant, 08, 10, 11, 06, 04, 02...). Plan-sponsor org category. Largely co-varies with pbp_a_plan_type. |
| part_d_enhncd_cvrg_demo | string |  |
| part_d_model_demo | string |  |
| pbp_a_ben_cov | string | Section-A benefit-coverage scope code (string; '1' dominant, '2', plus nulls). Indicates the plan's overall benefit coverage class. |
| pbp_a_plan_type | string | PBP plan-type code, string ('01'=HMO, '02'=HMO-POS, '04'=Local PPO, '29'=PDP-style, '20', '31'=Regional PPO, etc.). Carried from Section A; identifies the MA/PDP product type. |
| observed_period | date | Vlada-normalized observation period (date) = Jan 1 of report_year. Always equals effective_period_start in this table; does NOT distinguish quarterly releases (so it cannot stand in for quarter/vintage in the grain). |
| asserted_at | date | Vlada ingestion/assert date (date; 3 values: 2026-05-16, 2026-05-20, 2026-05-25). The 16,307 rows asserted 2026-05-25 are exactly the 2021/2022 dual-vintage backfill rows. Pipeline provenance, not benefit data. |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int | Integer ordinal of the CMS release within the plan-year, normally tracking quarter (Q1=1...Q4=4). REQUIRED in the grain: in 2021/2022 the same (year,quarter) was loaded at two different vintage sequences from two different CMS source ZIPs (mid-year 'updated-MMDDYYYY' re-releases). |
| parse_revision | int |  |
| parser_artifact_hash | string |  |
| source_url | string |  |
| sha256_content_hash | string |  |
| source_row_ordinal | double |  |
| mrx_bal_model_attest | string |  |
| mrx_bal_opt_flex | string |  |
| mrx_bal_opt_flex_other_desc | string |  |
| mrx_balance_covg_tier | string |  |
| mrx_balance_cstshr_struc_type | string |  |
| mrx_balance_deductible_amt | double |  |
| mrx_balance_deductible_opt | string |  |
| mrx_balance_extended_tier | string |  |
| mrx_balance_mo_tier | string |  |
| mrx_dsnp_buydown_attest | string |  |
| mrx_alt_* (family) |  | ~35 cols describing the Enhanced Alternative coverage design: deductible (ded_amount/charge/type), coverage limits (cov_lmt_amt/yn), gap coverage (gap_covg_brand/gen/tier/yn — pre-2026; IRA removed the gap in 2026), generic cost-share (gen_coins_pct/gen_copay_amt/gen_cstshr_struct), excluded/reduced drugs, pre/post-ICL cost share, and MMP (Medicare-Medicaid plan) variants. Sparse; which sub-fields are valid depends on report_year (PBP layout churn). |
| mrx_b_* (family) |  | ~22 cols for the Part D supplemental/'B' cost-share block (coinsurance pct, copay min/max, AWP discount, dispensing-fee min/max, deductible, max-OOP). Mostly NULL in recent years (mrx_b_ded_amt=0 non-null across all 208K rows in sample) — legacy/rarely-used design fields. |
| mrx_gen_* tier-copay matrix (mrx_gen_in/inp/innpp/mo/mop/oon/rstd/mostd/ltc _1m/_2m/_3m) |  | ~120 double cols intended for generic-drug copay/coins by pharmacy location (in-network, preferred, mail-order, OON, retail/mail standard, LTC) and days-supply (1/2/3-month). TRAP: essentially EMPTY in this parent table (mrx_gen_in_1m = 632 non-null of 208,537, only legacy years). Tier×pharmacy cost detail lives in the child table pbp_mrx_tier, not here. |
| mrx_gen_loc_* / mrx_locat / mrx_partd_network_loc |  | Part D pharmacy-location indicators (rstd=retail-standard, mostd=mail-order-standard, oon=out-of-network-preferred, ltc=long-term-care-preferred, in/inp/mo/mop). String flags describing which pharmacy channels the plan structures cost-share for. |
| mrx_gen_ira_* (family) |  | ~30 cols added for IRA (Inflation Reduction Act) standardized Part D cost-share — generic coins/copay by standard-retail (rstd), mail-standard (mostd), LTC-preferred (ltcp), OON-preferred (oonp) at 1/2/3-month supply. Populated only in IRA-era years (CY2024+). |
| mrx_grp_* (family) |  | ~50 cols for cost-share 'group' constructs (group id/type/labels, per-group copay/coins by pharmacy×supply). TRAP: mrx_grp_id and mrx_grp_type_id are 100% NULL across all 208K rows — this table is NEVER exploded to group rows. The profiler wrongly used these as a 'key'. |
| mrx_rai_* / max_rai_* (family) |  | ~30 cols for Part D Rewards & Incentives programs (offered y/n, type, eligibility criteria, adherence-goal notes, max annual reward amounts _1rx/_2rx/_3rx). Free-text + amounts; mostly NULL. |
| mrx_ae_/mrx_ba_/mrx_ea_* (family) |  | Cost-share-group apply flags and out-of-pocket-threshold structures for Alternative-Enhanced (ae), Basic-Alternative (ba), Enhanced-Alternative (ea) tiers — cstshr_apply, cstshr_grps, ded_amount, oop_th_amt, post_oopt. Sparse design-detail fields. |
| mrx_form_* / mrx_formulary_yn / mrx_formulary_tiers_num / mrx_form_tier_model_2..6 |  | Formulary model descriptors: formulary y/n, number of tiers, tier-model codes (2-6 tiers, with _mmp and _opt variants). mrx_form_tier_model_5 populated only CY2013-2016; mrx_formulary_yn 100% NULL in 2026 — strongly year-dependent (these moved/changed in the CY2022-Q2 and CY2024 PBP redesigns). |
| mrx_quantity_limits / mrx_step_ther_drugs_yn / mrx_otc_step_therapy_yn / mrx_auth_ynba / mrx_first_fill / mrx_excluded_tiers_yn |  | Utilization-management flags: quantity limits (string, populated 2010-2021 then NULL), step therapy, prior auth, first-fill/extended-first-fill, excluded tiers. String y/n-style indicators; coverage varies by year. |
| mrx_demo_yn / mrx_demo_type / part_d_model_demo / part_d_enhncd_cvrg_demo |  | Part D demonstration/model-test participation flags and type (e.g. VBID, Enhanced Med Therapy demos). VBID-related fields blanked in CY2026 (VBID discontinued). |
| effective_period_start / effective_period_end |  | Plan-year coverage window: always Jan 1 .. Dec 31 of report_year (dates). Derived from report_year; identical for all quarterly releases of the same year. |
| cms_vintage_sequence / parse_revision / parser_artifact_hash / source_url / sha256_content_hash |  | Lineage: source_url = the exact CMS PBP ZIP (29 distinct, e.g. pbp-benefits-2025.zip, pbp-benefits-2021-updated-08022021.zip); sha256_content_hash = content hash of that file; parse_revision (1 or 2) = Vlada parser version; parser_artifact_hash = parser build. source_url is the truest snapshot discriminator. |

Tools that read it: get_pbp_benefit

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