# MA pbp section b12 renal dialysis

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

Section B12: Renal dialysis cost-share. Coverage: All years.

**Grain.** One row per Medicare Advantage plan-benefit-package per quarterly CMS PBP vintage: the minimal verified key is (contract_id, plan_id, segment_id, report_year, quarter), which yields exactly 201,488 distinct combinations = the full row count (0 duplicates). Each row is one plan's renal-dialysis cost-sharing design as filed in one quarterly PBP release of one contract year.

**How to use it.** To get each MA plan's latest renal-dialysis coinsurance for the 2026 benefit year (deduping the quarterly snapshots to the newest vintage): SELECT contract_id, plan_id, segment_id, pbp_b12_coins_pct_mc, COALESCE(pbp_b12_coins_yn, pbp_b12_coins_yesno) AS charges_coins FROM pbp_section_b12_renal_dialysis WHERE report_year=2026 AND quarter=(SELECT MAX(quarter) FROM pbp_section_b12_renal_dialysis WHERE report_year=2026). Answers: 'what coinsurance % does each Medicare Advantage plan charge its members for renal dialysis in 2026?' (most plans = 20%, the standard Medicare cost share)."

**Traps.**
- GRAIN IS NOT bid_id-based. The profiler reports an 8-column superset; the TRUE minimal key is just 5 columns: (contract_id, plan_id, segment_id, report_year, quarter) = 201,488 distinct = exact row count (verified 0 dups). bid_id, pbp_a_plan_type, effective_period_start, observed_period are all redundant. bid_id is additionally NULL for every row 2001-2006, so it cannot be a key.
- NO is_current / no snapshot dedup. This is a quarterly-vintage PANEL: the SAME plan-year is re-published each quarter and ALL quarters are kept (2023 alone has 4 copies = 31,005 rows for ~7,766 bids). quarter == cms_vintage_sequence. To get one row per plan-year you MUST pick a quarter yourself (e.g. MAX(quarter) per report_year, or filter quarter=1). Pre-2018 years only have Q1; 2018+ have 2-4 quarters.
- Legacy/current Yes-No column PAIRS. Cost-structure switches exist in two mutually-exclusive encodings: pbp_b12_coins_yn (modern) vs pbp_b12_coins_yesno (pre-~2005), and likewise for copay/ded/maxenr. They never co-populate — you MUST COALESCE(yn, yesno) to read the full 2001-2026 history. 1=Yes, 2=No throughout.
- NULL cost fields mean 'not applicable / not filed', not zero. ~10,199 rows have NULL across coins_yn/copay_yn/ded_yn/maxenr_yn (and pbp_b12_sep_cost_yn is NULL for 188K rows because it was added in later CMS schema years). Do not coerce these NULLs to 0% or $0 — treat as unknown/section-not-applicable. Headline cost = pbp_b12_coins_pct_mc (median 20.0 = standard Medicare 20% coinsurance); copay is rare (only 9,672 rows).
- In-area vs out-of-area suffix confusion. Two parallel families exist: the POPULATED area-split fields are the *_mc_ia / *_mc_oa forms (~5,442 / 4,791 rows). The similarly-named *_ia_mc / *_oa_mc forms are near-empty legacy variants (~63 rows). Use *_pct_mc as the default, and *_pct_mc_ia / *_pct_mc_oa only for the minority of plans that vary cost by service area. pbp_b12_auth is a positional 5-digit BITMASK string, not free text.
- Provenance dates are not benefit dates. asserted_at (2026-05-16..20) is the Vlada load date; filter by report_year / effective_period_start for the benefit year. orgtype and pbp_a_plan_type are coded CMS values (decode via the PBP data dictionary: plan_type '01'=HMO, '04'=local PPO, '02'=HMO-POS, '20'=PFFS, etc.); they are carried-down Section-A attributes, not part of the grain.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS Medicare Advantage/Part C contract ID (e.g. 'H0028'). 1,972 distinct. Part of the grain. Joins to plan/enrollment/Stars tables. Letter prefix indicates org type (H=local MA, R=regional, etc.). |
| plan_id | string | Plan benefit package ID within the contract, zero-padded 3-char string (e.g. '001','017'). 656 distinct values but only unique WITHIN a contract. Part of the grain. |
| segment_id | string | Plan segment ID, string (e.g. '0'). 27 distinct. Most plans are segment '0'; segments split a PBP by service-area region. Part of the grain. |
| version | double | CMS PBP-software bid version number that generated this record (double, 0-27). NOT a grain dimension and NOT a snapshot/revision selector — verified 0 grain-keys carry more than one version. A per-bid attribute; ignore for dedup. |
| report_year | double | Contract/benefit year the bid applies to (double, 2001-2026). Part of the minimal grain. Equivalent 1:1 to effective_period_start year and observed_period year. |
| quarter | double | CMS quarterly re-release of the PBP file (double, 1-4). Part of the grain. This is a SNAPSHOT axis: the same plan-year is re-published across quarters and ALL quarters are retained (e.g. 2023 has 4 quarterly copies of each bid). Older years (<=2017) only have Q1. Equals cms_vintage_sequence. |
| bid_id | string | Concatenated key contract_plan_segment (e.g. 'H0028_007_0'). TRAP: NULL for all rows 2001-2006 (~7,316 rows) because CMS did not emit it pre-2007. Do NOT use as a primary key. Redundant with contract_id+plan_id+segment_id when present. |
| orgtype | string | CMS organization-type code (string). '01'=local CCP/HMO-PPO (88% of rows, 177,737), '08'=PFFS, '04'=regional PPO, '11'=MSA/cost, '06','05','02' other. Describes the carrier's organizational form. |
| pbp_a_ben_cov | string | Section-A benefit-coverage flag (string): '1'=plan offers this benefit category (196,773 rows), '2'=not offered (4,373), NULL (342). Carried from the PBP Section A header; loosely associated with whether the B12 cost fields are populated. |
| 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, '18'=1876 cost, '48'=PDP-like/other. Carried from Section A; describes the product. |
| pbp_b12_auth | string | 5-digit BITMASK string (e.g. '01000','00111') flagging which renal-dialysis sub-services require prior authorization; NOT free text. NULL where not applicable (61,759 rows). Decode positionally against the CMS PBP B12 data dictionary. |
| pbp_b12_auth_yn | string | Does any renal-dialysis service require prior authorization? '1'=Yes (77,101), '2'=No (62,628), NULL (61,759). 1/2 = Yes/No throughout this table. |
| pbp_b12_coins_cov_ia_mc | string | Coinsurance-coverage descriptor for in-area Medicare-covered dialysis (string). Almost entirely NULL in this table; a rarely-used variant field. Treat as edge-case detail, not a primary signal. |
| pbp_b12_coins_cov_mc | string | Coinsurance-coverage descriptor for Medicare-covered renal dialysis (string). Mostly NULL; the populated cost signal lives in the *_pct_mc numeric fields, not this descriptor. |
| pbp_b12_coins_cov_mc_ia | string | Coinsurance coverage descriptor, Medicare-covered / in-area split (string). Sparse. Companion descriptor to pbp_b12_coins_pct_mc_ia. |
| pbp_b12_coins_cov_mc_oa | string | Coinsurance coverage descriptor, Medicare-covered / out-of-area split (string). Sparse. Companion to pbp_b12_coins_pct_mc_oa. |
| pbp_b12_coins_cov_oa_mc | string | Coinsurance coverage descriptor, out-of-area Medicare-covered (string). Nearly always NULL; rarely-used variant. |
| pbp_b12_coins_max_pct_mc | double | Maximum coinsurance PERCENT for Medicare-covered dialysis (double). 152,283 non-null. Tracks pbp_b12_coins_pct_mc closely; the ceiling when a plan expresses a range. Median ~20. |
| pbp_b12_coins_pct_ia_mc | double | Coinsurance percent, in-area variant (double). Extremely sparse (63 non-null) — legacy/edge field. Use *_pct_mc or *_pct_mc_ia instead. |
| pbp_b12_coins_pct_mc | double | PRIMARY cost field: coinsurance PERCENT the member pays for Medicare-covered renal dialysis (double). 155,043 non-null; median = 20.0 (the standard Medicare 20% cost share), range 0-100. This is the headline renal-dialysis cost-share number. |
| pbp_b12_coins_pct_mc_ia | double | Coinsurance percent for the IN-AREA (in-network service-area) split of Medicare-covered dialysis (double). 5,442 non-null — used by a minority of plans that vary cost by area. Overrides pbp_b12_coins_pct_mc for those plans. |
| pbp_b12_coins_pct_mc_oa | double | Coinsurance percent for the OUT-OF-AREA split of Medicare-covered dialysis (double). 5,442 non-null, pairs with *_mc_ia. The out-of-network-area cost share. |
| pbp_b12_coins_pct_oa_mc | double | Coinsurance percent, out-of-area variant (double). Extremely sparse (63 non-null) — legacy/edge field, distinct from the *_mc_oa field which is the populated one. |
| pbp_b12_coins_yesno | string | LEGACY (pre-~2005) coinsurance Yes/No flag (string '1'/'2'). Populated only for ~742 old rows where pbp_b12_coins_yn is NULL. GOTCHA: COALESCE with pbp_b12_coins_yn to read the full history — the two never co-populate. |
| pbp_b12_coins_yn | string | Current coinsurance Yes/No switch (string): '1'=plan charges coinsurance for dialysis (160,485), '2'=No (30,804), NULL (10,199). The main 'does this plan use coinsurance' flag for modern years. |
| pbp_b12_copay_ia_mc_amt | double | Copay dollar amount, in-area variant (double). Very sparse (423 non-null) — legacy/edge field. |
| pbp_b12_copay_mc_amt | double | PRIMARY copay field: dollar copay the member pays per dialysis service, Medicare-covered (double). Only 9,672 non-null (most plans use coinsurance, not copay); median ~$2.68, max $600. Read alongside pbp_b12_copay_yn. |
| pbp_b12_copay_mc_amt_ia | double | Copay dollar amount for the IN-AREA split (double). 4,791 non-null. Area-specific copay override paired with *_amt_oa. |
| pbp_b12_copay_mc_amt_oa | double | Copay dollar amount for the OUT-OF-AREA split (double). 4,791 non-null, pairs with *_amt_ia. |
| pbp_b12_copay_mc_max_amt | double | Maximum copay dollar amount for Medicare-covered dialysis (double). 8,795 non-null. Ceiling when a plan expresses a copay range. |
| pbp_b12_copay_oa_mc_amt | double | Copay amount, out-of-area variant (double). Very sparse (423 non-null) — legacy/edge field, distinct from the populated *_amt_oa field. |
| pbp_b12_copay_yesno | string | LEGACY copay Yes/No flag (string '1'/'2'); populated only for a small set of old rows where pbp_b12_copay_yn is NULL. COALESCE with pbp_b12_copay_yn for full history. |
| pbp_b12_copay_yn | string | Current copay Yes/No switch (string): '2'=No copay (176,831, the majority — plans favor coinsurance), '1'=Yes (14,458), NULL (10,199). |
| pbp_b12_ded_amt | double | Deductible dollar amount specific to renal dialysis (double). Almost always NULL — only ~69 plans (ded_yn='1') charge a dialysis-specific deductible. |
| pbp_b12_ded_yesno | string | LEGACY deductible Yes/No flag (string). Sparse; COALESCE with pbp_b12_ded_yn for old years. |
| pbp_b12_ded_yn | string | Does the plan charge a deductible for renal dialysis? '2'=No (191,220, essentially all plans), '1'=Yes (only 69), NULL (10,199). |
| pbp_b12_maxenr_amt | double | Maximum enrollee out-of-pocket dollar amount for renal dialysis (double). Almost entirely NULL — only ~44 plans set a dialysis-specific max. |
| pbp_b12_maxenr_per | string | Period code for the max-enrollee-cost cap (string). When set (maxenr_yn='1'), observed value '3'. Decode against CMS period codes (e.g. per-year). Almost always NULL. |
| pbp_b12_maxenr_per_d | string | Free-text/description of the max-enrollee period (string). Observed NULL even when maxenr_per='3'. Rarely populated. |
| pbp_b12_maxenr_yesno | string | LEGACY max-enrollee-cost Yes/No flag (string). Sparse; COALESCE with maxenr_yn. |
| pbp_b12_maxenr_yn | string | Does the plan set a maximum enrollee out-of-pocket for renal dialysis? '2'=No (191,245, virtually all), '1'=Yes (only 44), NULL (10,199). |
| pbp_b12_refer_yn | string | Is a referral required for renal dialysis? '2'=No (141,251), '1'=Yes (47,648), NULL (12,589). 1/2=Yes/No. |
| pbp_b12_sep_cost_yn | string | Does dialysis have a SEPARATE cost-share structure (vs folded into general benefits)? Mostly NULL (188,366 — field added in later years), '2'=No (11,140), '1'=Yes (1,982). |
| observed_period | date | Vlada provenance: the benefit period this snapshot describes (date), always Jan-1 of report_year. 1:1 with report_year — redundant as a grain column. |
| asserted_at | date | Vlada provenance: ingestion/load date into the silver layer (date). All rows loaded 2026-05-16 to 2026-05-20. Not a CMS field; do not use for benefit-year filtering. |
| effective_period_start | date | Vlada provenance: benefit-year start date (date), Jan-1 of report_year. Range 2001-01-01 to 2026-01-01. Redundant with report_year. |
| effective_period_end | date | Vlada provenance: benefit-year end date (date), Dec-31 of report_year. Redundant with report_year. |
| cms_vintage_sequence | int | Snapshot sequence number within a report_year (int 1-4) = the quarter. EQUALS the quarter column (1=Q1...4=Q4). Confirms multiple quarterly vintages per year are all retained; not an is_current selector. |
| parse_revision | int | Vlada parser revision that produced the row (int, 1 or 2). 100,054 rows at rev 1, rest at rev 2. Pipeline-internal; not a grain dimension and not a row-supersession flag. |
| parser_artifact_hash | string | SHA-256 of the parser code/config artifact (string). Provenance/lineage for reproducibility; same hash shared across a load batch. |
| source_url | string | CMS source ZIP the row was extracted from (string), e.g. 'https://www.cms.gov/files/zip/pbp-benefits-2023-quarter-3.zip'. Encodes year+quarter; the raw-substrate provenance link. |
| sha256_content_hash | string | SHA-256 of the source file content (string). Integrity/dedup hash of the downloaded CMS ZIP; shared by all rows from the same file. |

Tools that read it: get_pbp_benefit

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