Medicare Advantage, Part D, Medicaid
MA pbp section b15 partb rx drugs
medicare_silver.pbp_section_b15_partb_rx_drugs·partial·silver·annual·Medicare Advantage Plan Benefit Packages (PBP)Rows
N/A
Columns
232
History
2008 to 2026
Card
yesgrain, traps, filters
Typed tools
1
What it is
- 1CMS Plan Benefit Package (PBP) Section B-15: the Medicare Advantage / MA-PD plan benefit design for PART B Rx DRUGS (physician-administered drugs covered under Part B — chemotherapy, home-infusion, IRA-capped insulin, etc.), i.e. the cost-share RULES (prior-auth, coinsurance %, copays, deductible, step therapy, max-OOP) each plan files with CMS each year.
- 2It is plan-design cost data (what the plan WILL charge), not claims or paid amounts.
- 3Sourced from the CMS PBP Public Use Files, 2008-2026.
Grain
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquarter |
|
How to read it
- 1Latest-snapshot Part B drug cost-share for current MA plans: SELECT contract_id, plan_id, mrx_b_auth_yn, mrx_b_coins_yn, mrx_b_step_tpy_yn, mrx_b_hi_yn, mrx_b_ira_coins_yn FROM medicare_silver.pbp_section_b15_partb_rx_drugs WHERE report_year=2026 AND quarter=1.
- 2Answers 'for each 2026 MA/MA-PD plan, does the Part B drug benefit require prior authorization / step therapy / coinsurance, and does it cover home-infusion and IRA-capped drugs?' To trend coinsurance %, restrict to report_year<=2017 (where mrx_b_coins_pct is populated) and always pick MAX(quarter) per plan-year to avoid snapshot double-counting.
Traps
- 1DEAD COLUMNS: all 149 pbp_b15_* columns (grp1-5 tiers, coins/copay/ded/maxplan/bendesc/maxenr) are 100% NULL/empty across every one of the 189,385 rows — they are schema placeholders from a newer PBP layout that was never populated here. The only columns carrying data are the 53 mrx_b_* fields plus the id/plan-context/provenance columns. Do NOT build any analysis on a pbp_b15_* column.
- 2SNAPSHOT DOUBLE-COUNTING: there is NO is_current column. A plan can appear up to 4 times in one report_year (once per quarterly CMS re-release: quarter 1-4, 1:1 with cms_vintage_sequence). Years 2018,2019,2020,2022,2023,2024 are multi-snapshot; the rest are single (quarter=1). Counting plans, averaging cost-share, or joining without first picking MAX(quarter)/MAX(cms_vintage_sequence) per (contract,plan,segment,report_year) inflates results ~1.85x overall.
- 3SCHEMA-ERA SHIFT in populated fields: the detailed legacy cost-share numbers (mrx_b_coins_pct, mrx_b_chemo_*, min/max pct & dispensing fees) are populated ONLY 2008-2017 and go NULL from 2018 on. Conversely the IRA fields (mrx_b_ira_*) appear ONLY 2024+. mrx_b_auth_yn (prior-auth) is the one field present the whole 2008-2026 span. Trend queries on coinsurance % will silently break at 2018.
- 4YN CONVENTION IS 1/2, NOT 1/0: every *_yn flag uses CMS coding '1'=Yes, '2'=No (stored as strings). Treating '2' as falsy-zero or summing them is wrong. Likewise coins_covbasis (1-10), coins_ehc (01/10/11), orgtype, and pbp_a_plan_type are CMS LOOKUP CODES needing the PBP data dictionary, not literal values.
- 5NULL MOSTLY MEANS 'NOT APPLICABLE / NOT THIS MECHANISM', not zero: mrx_b_ded_amt is non-null on just 7 rows (all $131) and mrx_b_max_oop_amt on ~773 — a NULL deductible/OOP does not imply $0. mrx_b_coins_pct is NULL where the plan uses copay instead of coinsurance.
- 6IDENTITY TRAPS: bid_id looks like a primary key but is a redundant concatenation of the three id columns; version looks temporal but is the per-bid revision number (scalar per row, not a snapshot). asserted_at has only 2 values (2026-05-16/20) — this is a one-time historical backfill, not a live feed, so 'latest asserted_at' is meaningless for currency; use report_year + quarter/vintage instead.
Columns (232)
| Column | Type | Meaning |
|---|---|---|
contract_id | string | CMS MA/MA-PD contract number, e.g. 'H0028' (string). Part of the plan identity. First char encodes org type (H=local CCP, R=regional PPO, etc.). |
plan_id | string | Plan number within the contract, e.g. '001','034' (zero-padded string). contract_id + plan_id + segment_id identifies one Medicare plan offering. |
segment_id | string | Service-area segment, almost always '0' (string). Part of the plan identity; non-zero only for segmented plans. |
version | double | CMS PBP per-plan bid VERSION NUMBER (double, 1-27), one scalar value per row. This is the plan's bid-submission revision, NOT a temporal/snapshot version — every report_year contains a scattered range of values. Does NOT disambiguate the grain. |
report_year | double | Benefit/contract year the PBP describes (double, 2008.0-2026.0). The primary time dimension. Equals year of effective_period_start/observed_period. |
quarter | double | Which quarterly CMS PUF re-release the row came from (double, 1.0-4.0). 1:1 with cms_vintage_sequence. Most years have only quarter=1 (single annual release); 2018,2019,2020,2022,2023,2024 have multiple quarterly republications. This is the within-year snapshot disambiguator — part of the grain. |
bid_id | string | Derived convenience key = contract_id||'_'||plan_id||'_'||segment_id, e.g. 'H0028_001_0'. REDUNDANT with the three id columns (22,455 distinct = same as contract||plan||segment); not an independent dimension. |
mrx_b_auth_yn | string | Prior authorization required for Part B Rx drugs? CMS code '1'=Yes, '2'=No. The ONE substantive field populated across the full 2008-2026 history (~152K of 189K rows non-null). |
mrx_b_chemo_coins_amt_maacqcos | double | |
mrx_b_chemo_coins_awp_disc | double | |
mrx_b_chemo_coins_cov | string | |
mrx_b_chemo_coins_max_dispfee | double | |
mrx_b_chemo_coins_max_pct | double | |
mrx_b_chemo_coins_min_dispfee | double | |
mrx_b_chemo_coins_min_pct | double | |
mrx_b_chemo_coins_pct | double | |
mrx_b_chemo_coins_prp_disc | double | |
mrx_b_chemo_copay_amt | double | |
mrx_b_chemo_copay_amt_max | double | |
mrx_b_chemo_copay_amt_min | double | |
mrx_b_coins_amt_maacqcost | double | |
mrx_b_coins_awp_disc | double | |
mrx_b_coins_covbasis | string | |
mrx_b_coins_ehc | string | |
mrx_b_coins_max_dispfee | double | |
mrx_b_coins_max_pct | double | |
mrx_b_coins_min_dispfee | double | |
mrx_b_coins_min_pct | double | |
mrx_b_coins_pct | double | |
mrx_b_coins_prp_disc | double | |
mrx_b_coins_yn | string | |
mrx_b_copay_ehc | string | |
mrx_b_copay_max_amt | double | |
mrx_b_copay_min_amt | double | |
mrx_b_copay_yn | string | |
mrx_b_cost_share_attest | string | Plan attestation about Part B drug cost-sharing structure (newer field, ~36K rows, 2018+ era). |
mrx_b_ded_amt | double | Part B Rx deductible dollar amount. Extremely sparse — only 7 non-null rows, all $131 (a single year's Part B deductible). Effectively NULL across the table; do not treat absence as $0. |
mrx_b_ded_yn | string | |
mrx_b_hi_coins_pct_max | double | |
mrx_b_hi_coins_pct_min | double | |
mrx_b_hi_coins_yn | string | |
mrx_b_hi_copay_amt_max | double | |
mrx_b_hi_copay_amt_min | double | |
mrx_b_hi_copay_yn | string | |
mrx_b_hi_mcaid_yn | string | |
mrx_b_hi_yn | string | |
mrx_b_ira_coins_max_pct | double | |
mrx_b_ira_coins_min_pct | double | |
mrx_b_ira_coins_yn | string | |
mrx_b_ira_copay_amt_max | double | |
mrx_b_ira_copay_amt_min | double | |
mrx_b_ira_copay_month_amt | double | |
mrx_b_ira_copay_yn | string | |
mrx_b_ira_deduct_yn | string | |
mrx_b_max_oop_amt | double | |
mrx_b_max_oop_per | string | |
mrx_b_max_oop_per_d | string | |
mrx_b_max_oop_yn | string | |
mrx_b_step_tpy_yn | string | |
mrx_b_stp_tpy_chk | string | |
orgtype | string | CMS organization type code (string: '01' local CCP, '02','04','06','08','11'...). Correlates with pbp_a_plan_type and the contract_id prefix. |
pbp_a_ben_cov | string | Plan A-level benefit-coverage indicator (string, e.g. '1'). High-level plan context carried into this section. |
pbp_a_plan_type | string | CMS plan-type code (string): '01'=HMO (dominant, 94K), '04'=Local PPO (54K), '02'=HMO-POS (20K), '20'=PDP/employer, '09','31','18',... Most codes span all 19 years. |
observed_period | date | Date the benefit is observed for = Jan 1 of report_year (2008-01-01 ... 2026-01-01). Aligns with effective_period_start. Provenance/bookkeeping, not a separate grain dimension. |
asserted_at | date | Date this row was loaded/asserted into the silver table. Only two values (2026-05-16, 2026-05-20) — confirms a one-time historical backfill in May 2026, NOT a live/incremental feed. |
effective_period_start | date | |
effective_period_end | date | |
cms_vintage_sequence | int | Integer rank of the CMS source vintage within a report_year (1=first/Q1 release ... 4). 1:1 with quarter. Use MAX(cms_vintage_sequence) (= MAX(quarter)) per plan-year to get the latest restatement. |
parse_revision | int | |
parser_artifact_hash | string | |
source_url | string | CMS source ZIP the row was parsed from, e.g. .../pbp-pufs/pbp-benefits-2013.zip. One distinct file per report_year×quarter snapshot. |
sha256_content_hash | string | SHA-256 of the source file content. Varies per snapshot file, so (bid_id, report_year, sha256) is also unique — but it's a provenance fingerprint, not a semantic key. |
pbp_b15_addl_cost | string | |
pbp_b15_auth | string | |
pbp_b15_auth_nonform | string | |
pbp_b15_bendec_ehc_yn | string | |
pbp_b15_bendec_for | string | |
pbp_b15_bendec_nfor | string | |
pbp_b15_bendesc_amo | string | |
pbp_b15_bendesc_ehc_yn | string | |
pbp_b15_bendesc_for | string | |
pbp_b15_bendesc_nfor | string | |
pbp_b15_bendesc_nfor_med_yn | string | |
pbp_b15_bendesc_nfor_yn | string | |
pbp_b15_bendesc_yesno | string | |
pbp_b15_bendesc_yn | string | |
pbp_b15_bendesc_yn_nfor | string | |
pbp_b15_coins_cov_b | string | |
pbp_b15_coins_cov_fb | string | |
pbp_b15_coins_cov_fg | string | |
pbp_b15_coins_cov_fpb | string | |
pbp_b15_coins_cov_gen | string | |
pbp_b15_coins_cov_mc | string | |
pbp_b15_coins_cov_nfb | string | |
pbp_b15_coins_cov_nfg | string | |
pbp_b15_coins_cov_pb | string | |
pbp_b15_coins_fb_yn | string | |
pbp_b15_coins_fg_yn | string | |
pbp_b15_coins_fpb_yn | string | |
pbp_b15_coins_mc_cov | string | |
pbp_b15_coins_mc_yn | string | |
pbp_b15_coins_yesno | string | |
pbp_b15_coins_yn | string | |
pbp_b15_coins_yn_nfb | string | |
pbp_b15_coins_yn_nfg | string | |
pbp_b15_copay_add_fb_yn | string | |
pbp_b15_copay_add_nfb_yn | string | |
pbp_b15_copay_fb_yn | string | |
pbp_b15_copay_fg_yn | string | |
pbp_b15_copay_fpb_yn | string | |
pbp_b15_copay_mc_yn | string | |
pbp_b15_copay_nfb_yn | string | |
pbp_b15_copay_nfg_yn | string | |
pbp_b15_ded_cdt | string | |
pbp_b15_ded_yesno | string | |
pbp_b15_ded_yn | string | |
pbp_b15_deduct_cdt | string | |
pbp_b15_fb_place | string | |
pbp_b15_fg_place | string | |
pbp_b15_fpb_place | string | |
pbp_b15_grp1_coins_cov | string | |
pbp_b15_grp1_coins_yn | string | |
pbp_b15_grp1_copay_yn | string | |
pbp_b15_grp1_drug_types | string | |
pbp_b15_grp1_label | string | |
pbp_b15_grp1_maxplan_cov | string | |
pbp_b15_grp1_maxplan_per | string | |
pbp_b15_grp1_maxplan_yn | string | |
pbp_b15_grp1_place | string | |
pbp_b15_grp2_coins_cov | string | |
pbp_b15_grp2_coins_yn | string | |
pbp_b15_grp2_copay_yn | string | |
pbp_b15_grp2_drug_types | string | |
pbp_b15_grp2_label | string | |
pbp_b15_grp2_maxplan_cov | string | |
pbp_b15_grp2_maxplan_per | string | |
pbp_b15_grp2_maxplan_yn | string | |
pbp_b15_grp2_place | string | |
pbp_b15_grp3_coins_cov | string | |
pbp_b15_grp3_coins_yn | string | |
pbp_b15_grp3_copay_yn | string | |
pbp_b15_grp3_drug_types | string | |
pbp_b15_grp3_label | string | |
pbp_b15_grp3_maxplan_cov | string | |
pbp_b15_grp3_maxplan_per | string | |
pbp_b15_grp3_maxplan_yn | string | |
pbp_b15_grp3_place | string | |
pbp_b15_grp4_coins_cov | string | |
pbp_b15_grp4_coins_yn | string | |
pbp_b15_grp4_copay_yn | string | |
pbp_b15_grp4_drug_types | string | |
pbp_b15_grp4_label | string | |
pbp_b15_grp4_maxplan_cov | string | |
pbp_b15_grp4_maxplan_per | string | |
pbp_b15_grp4_maxplan_yn | string | |
pbp_b15_grp4_place | string | |
pbp_b15_grp5_coins_cov | string | |
pbp_b15_grp5_coins_yn | string | |
pbp_b15_grp5_copay_yn | string | |
pbp_b15_grp5_drug_types | string | |
pbp_b15_grp5_label | string | |
pbp_b15_grp5_maxplan_cov | string | |
pbp_b15_grp5_maxplan_per | string | |
pbp_b15_grp5_maxplan_yn | string | |
pbp_b15_grp5_place | string | |
pbp_b15_maxenr_cdt | string | |
pbp_b15_maxenr_per | string | |
pbp_b15_maxenr_yesno | string | |
pbp_b15_maxenr_yn | string | |
pbp_b15_maxplan1_yesno | string | |
pbp_b15_maxplan_cdt | string | |
pbp_b15_maxplan_cov_cdt | string | |
pbp_b15_maxplan_cov_fb | string | |
pbp_b15_maxplan_cov_fg | string | |
pbp_b15_maxplan_cov_fpb | string | |
pbp_b15_maxplan_cov_gen | string | |
pbp_b15_maxplan_cov_nfb | string | |
pbp_b15_maxplan_cov_nfg | string | |
pbp_b15_maxplan_cov_pb | string | |
pbp_b15_maxplan_fb_less_copay | string | |
pbp_b15_maxplan_fb_yn | string | |
pbp_b15_maxplan_fg_less_copay | string | |
pbp_b15_maxplan_fg_unlm | string | |
pbp_b15_maxplan_fg_yesno | string | |
pbp_b15_maxplan_fg_yn | string | |
pbp_b15_maxplan_fpb_less_copay | string | |
pbp_b15_maxplan_fpb_yesno | string | |
pbp_b15_maxplan_fpb_yn | string | |
pbp_b15_maxplan_gen_unlm | string | |
pbp_b15_maxplan_grp_unlm_yn | string | |
pbp_b15_maxplan_grp_waived | string | |
pbp_b15_maxplan_less_copay | string | |
pbp_b15_maxplan_net_copay_yn | string | |
pbp_b15_maxplan_nfb_less_copay | string | |
pbp_b15_maxplan_nfb_yn | string | |
pbp_b15_maxplan_nfg_less_copay | string | |
pbp_b15_maxplan_nfg_yn | string | |
pbp_b15_maxplan_per | string | |
pbp_b15_maxplan_per_cdt | string | |
pbp_b15_maxplan_per_cdt1 | string | |
pbp_b15_maxplan_per_fb | string | |
pbp_b15_maxplan_per_fbyn | string | |
pbp_b15_maxplan_per_fg | string | |
pbp_b15_maxplan_per_fgen | string | |
pbp_b15_maxplan_per_nfb | string | |
pbp_b15_maxplan_per_nfg | string | |
pbp_b15_maxplan_per_pb | string | |
pbp_b15_maxplan_types | string | |
pbp_b15_maxplan_unused_yn | string | |
pbp_b15_maxplan_us_yesno | string | |
pbp_b15_maxplan_yesno | string | |
pbp_b15_maxplan_yn | string | |
pbp_b15_maxplan_yn_nfb | string | |
pbp_b15_maxplan_yn_nfg | string | |
pbp_b15_nfb_place | string | |
pbp_b15_nfg_place | string | |
pbp_b15copay_fb_yn | string | |
pbp_b15copay_fgen_yn | string | |
pbp_b15copay_fpb_yn | string | |
pbp_b15copay_nfb_yn | string | |
pbp_b15copay_nfgen_yn | string | |
mrx_b_coins_yn / mrx_b_copay_yn / mrx_b_ded_yn / mrx_b_max_oop_yn | Yes/No flags ('1'=Yes,'2'=No) for whether the Part B drug benefit applies coinsurance / copay / a deductible / a max-OOP. CMS 1/2 boolean convention (NOT 1/0). | |
mrx_b_coins_pct (and *_max_pct/*_min_pct) | Part B drug COINSURANCE percentage. Median 20.0 (standard Medicare Part B coinsurance), range 0-100. POPULATED ONLY 2008-2017 (~34K rows); NULL from 2018 onward when CMS dropped these detailed legacy fields. | |
mrx_b_chemo_* (coins/copay) | Cost-share specifically for Part B chemotherapy/anti-cancer drugs (coins pct, copay amt, dispensing-fee min/max). Same 2008-2017-only population pattern as the general coins fields (~34K). | |
mrx_b_max_oop_amt / mrx_b_max_oop_per | Max out-of-pocket dollar cap (0-6700) and its period. Only ~773 rows populated; mostly NULL. | |
mrx_b_hi_yn / mrx_b_hi_coins_* / mrx_b_hi_copay_* / mrx_b_hi_mcaid_yn | Home-Infusion (HI) drug cost-share block: whether covered ('1'/'2'), coinsurance pct min/max, copay min/max, and a Medicaid-coverage flag. mrx_b_hi_yn populated ~152K rows. | |
mrx_b_ira_* (coins/copay/deduct, copay_month_amt) | Inflation Reduction Act Part B drug provisions (e.g. capped insulin cost-share). NEW columns — populated ONLY 2024 onward (~23K rows). ira_*_yn use '1'/'2'. mrx_b_ira_copay_month_amt is the monthly capped copay. | |
mrx_b_step_tpy_yn / mrx_b_stp_tpy_chk | Step-therapy required for Part B drugs? '1'/'2'. step_tpy_yn populated ~86K rows. | |
mrx_b_coins_covbasis / mrx_b_coins_ehc / mrx_b_copay_ehc | CMS lookup codes describing the coinsurance coverage basis (values 1-10) and 'enhanced/EHC' coverage indicator (01/10/11). Coded values, not free text; require the CMS PBP data dictionary to interpret. | |
pbp_b15_* (149 columns: grp1-5_*, coins_*, copay_*, ded_*, maxplan_*, maxenr_*, bendesc_*, auth_*, place_*, etc.) | The MODERN PBP B-15 layout (drug-group tiers grp1-grp5 with labels/drug_types/copay/coins/max-plan-coverage, formulary/non-formulary brand/generic cost-share, plan-coverage maxima). ENTIRELY NULL/EMPTY in this dataset — every one of the 149 pbp_b15_* columns has 0 non-null values across all 189,385 rows. Schema placeholders only; carry no information here. | |
effective_period_start / effective_period_end | Benefit-year validity window: Jan 1 to Dec 31 of report_year. effective_period_start is the profiler's designated time_column (annual). | |
parse_revision / parser_artifact_hash | Internal ETL provenance: parser revision number and a hash of the parser artifact used to extract the row. |
Query it
describe_data_source(source_fqn="medicare_silver.pbp_section_b15_partb_rx_drugs") # the card, live query_substrate(sql="SELECT * FROM medicare_silver.pbp_section_b15_partb_rx_drugs 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 |
| Join | how_to_join(source_fqn="medicare_silver.pbp_section_b15_partb_rx_drugs") |
| Raw door | Athena (read-only via query_substrate): medicare_silver.pbp_section_b15_partb_rx_drugs |
| Note | Grain-governed; live in Glue / query_substrate. Source family pbp_benefits. |
This page as markdown: /docs-md/data/medicare_silver_pbp_section_b15_partb_rx_drugs.md · every page in one file: /llms-full.txt