# MA pbp section a

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

Plan universe. One row per (contract, plan, segment, version) per (year, quarter). Era-1 (pre-2010) rows synthesize segment_id='', version=0.

**Grain.** One row per Medicare plan-segment per PUF release snapshot — i.e. one row per (contract_id, plan_id, segment_id, report_year, quarter). VERIFIED unique: COUNT(DISTINCT of those 5 cols) = 244,035 = row_count exactly, and max rows-per-key = 1 with zero keys having >1 row. report_year+quarter is the snapshot (release) dimension, NOT a benefit period: a plan year appears once for 2001-2017 (annual, Q1 only) and up to four times for 2018+ (CMS started quarterly PBP re-releases). ~101k plan-years have 1 snapshot; ~45k have 2-4.

**How to use it.** Get the current roster of distinct Medicare plans for 2026 (one row per plan, latest snapshot): SELECT contract_id, plan_id, segment_id, pbp_a_plan_name, pbp_a_plan_type, pbp_a_org_marketing_name, pbp_a_special_need_flag, pbp_a_est_memb FROM medicare_silver.pbp_section_a WHERE report_year = 2026 AND quarter = (SELECT MAX(quarter) FROM medicare_silver.pbp_section_a WHERE report_year = 2026). This answers 'which MA/PD plans exist this year, who operates them, what type are they, and roughly how big' — and gives the contract/plan/segment key to join into the cost-sharing and drug PBP sections for actual benefit/cost analysis.

**Traps.**
- GRAIN IS THE SNAPSHOT, NOT THE PLAN-YEAR. quarter = the CMS PUF RELEASE quarter, not a coverage quarter. For 2018+ a single plan-year appears up to 4 times (one row per quarterly re-release; ~45k plan-years have 2-4 snapshots). If you want one row per plan per year you MUST dedup to MAX(quarter) (optionally MAX(version)/MAX(cms_vintage_sequence)) within (contract_id, plan_id, segment_id, report_year) — otherwise you over-count plans ~1.4x in recent years.
- bid_id LOOKS like the key but is NOT: it is NULL for all 9,994 pre-2007 rows and equals contract_id_plan_id_segment_id for only 229k of 244k rows; bid_id+year+quarter is NOT unique (234,041 < 244,035). Always key on the 5 columns contract_id, plan_id, segment_id, report_year, quarter (verified exactly unique = 244,035).
- CODE COLUMNS ARE NOT ZERO-PADDED CONSISTENTLY across the history. plan_type has both '01' (98k) and '1' (3.4k) for HMO; orgtype has '01'/'1', '04'/'4', '08'/'8', etc. The early-year files use unpadded codes. Filtering e.g. plan_type='01' silently drops the '1' rows — normalize with LPAD or match both forms.
- FLAG POLARITY IS INVERTED from intuition: pbp_a_special_need_flag = '1' means IS a SNP (31,002 rows) and '2' means NOT a SNP (207,959). Many Y/N flags here are coded '1'/'2', not 1/0 or Y/N.
- NULLS CARRY MEANING (N/A, not zero/false). pbp_a_est_memb is null for ~70% of rows (= enrollment not reported, NOT zero members); all snp_* fields and special_need_plan_type are null for non-SNP plans; vbid_indicator/pbpver are null in years before the feature existed. Do not coalesce these to 0/false.
- SECTION A IS A DIMENSION/HEADER, NOT A COST TABLE. It carries plan identity, type, contacts and flags but essentially no dollar cost-sharing — for premiums, copays, deductibles, and drug costs you must join to the other PBP sections (and the cost-sharing/MOOP tables) on the same contract_id/plan_id/segment_id key plus report_year/quarter.
- Provenance is multi-vintage: asserted_at has 2 values and cms_vintage_sequence ranges 1-4 (the 2018-2024 quarterly snapshots were loaded 2026-05-20 on top of the 2026-05-16 historical load). sha256_content_hash is a per-FILE hash (40 distinct, one per release zip), not a per-row hash, so it cannot be used to detect row-level duplicates.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS contract number (e.g. H0028, E0654, R0110, S-prefix=PDP). 2,146 distinct. First part of the grain. Letter prefix encodes product line (H/R=MA, S=PDP, E=employer/EGHP, etc.). |
| plan_id | string | Plan ID within the contract (e.g. '001','801'). 755 distinct, zero-padded string. Employer plans typically use 800-series. Second part of the grain; NOT unique on its own. |
| segment_id | string | Plan segment (geographic/benefit sub-division of a plan), usually '0'. 27 distinct. Third part of the grain. Most plans have only segment 0. |
| version | double | CMS PBP submission/version iteration for that plan-year (0-27; higher = later re-submission). version 0 = the 9,994 pre-2007 legacy rows. FUNCTIONALLY DETERMINED by the 5-col grain (adding it does not subdivide rows) — it is metadata, not a key column. Stored as double. |
| report_year | double | Plan/benefit year the bid applies to (2001-2026). Part of the grain. The single most useful filter for picking a year of plans. Stored as double. |
| quarter | double | PUF RELEASE quarter (1-4), i.e. which quarterly re-publication of the PBP this row came from — NOT a quarter of coverage. 1 for 2001-2017; 1-4 for 2018+. Part of the grain. To get the latest view of a plan-year, take MAX(quarter) within (contract,plan,segment,report_year). |
| bid_id | string | Convenience concatenation contract_id_plan_id_segment_id. UNRELIABLE: NULL for all 9,994 pre-2007 rows and equals the concat for only 229,443 of 244,035 rows. Do NOT use as a key — use the 5 grain columns instead. 27,601 distinct. |
| orgtype | string | Numeric organization-type code (01=Local CCP/HMO-PPO dominant at 170k, 10=PDP, 08, 04, 11=Regional PPO, 13=employer, etc.). CAUTION: not zero-padded consistently — both '01' and '1', '04'/'4' appear; ~2,058 nulls. Duplicates pbp_a_org_type. |
| pbp_a_ben_cov | string |  |
| pbp_a_bpt_esrd_date_time | string |  |
| pbp_a_bpt_ma_date_time | string |  |
| pbp_a_bpt_msa_date_time | string |  |
| pbp_a_bpt_pd_date_time | string |  |
| pbp_a_ceo_name | string |  |
| pbp_a_ceo_title | string |  |
| pbp_a_cfo_name | string |  |
| pbp_a_continue_costshare_yn | string |  |
| pbp_a_continue_yesno | string |  |
| pbp_a_continue_yn | string |  |
| pbp_a_contract_number | string |  |
| pbp_a_contract_partd_flag | string | Whether the plan includes Part D drug coverage ('1' observed = has Part D). Distinguishes MA-PD from MA-only. |
| pbp_a_contract_period | string |  |
| pbp_a_curmbr_loc_phone | string |  |
| pbp_a_curmbr_loc_phone_ext | string |  |
| pbp_a_curmbr_phone | string |  |
| pbp_a_curmbr_phone_ext | string |  |
| pbp_a_dsnp_zerodollar | string |  |
| pbp_a_eghp_yn | string | Employer Group Health Plan flag. '1' = employer/union group plan (52,908 rows), '2' = individual-market. Identifies the employer (800-series) plans. |
| pbp_a_est_memb | double | Estimated enrollment for the plan (double). Non-null for only 74,329 rows (~30%); range 0 to 10,658,990, avg ~31,748. NULL = not reported (not zero). Only useful enrollment-like measure in Section A. |
| pbp_a_ffs_bid_b_auth_cats | string |  |
| pbp_a_ffs_bid_b_auth_yn | string |  |
| pbp_a_ffs_bid_b_ref_cats | string |  |
| pbp_a_ffs_bid_b_ref_yn | string |  |
| pbp_a_ffs_bid_b_yn | string |  |
| pbp_a_ffs_bid_c_auth_cats | string |  |
| pbp_a_ffs_bid_c_auth_yn | string |  |
| pbp_a_ffs_bid_c_ref_cats | string |  |
| pbp_a_ffs_bid_c_ref_yn | string |  |
| pbp_a_ffs_bid_c_yn | string |  |
| pbp_a_ffs_bid_d_yn | string |  |
| pbp_a_formulary_web_addr | string |  |
| pbp_a_hospice_care_yn | string |  |
| pbp_a_last_data_entry_date | string |  |
| pbp_a_network_flag | string |  |
| pbp_a_npffs_flag | string |  |
| pbp_a_opd_web_addr | string |  |
| pbp_a_org_marketing_name | string |  |
| pbp_a_org_name | string |  |
| pbp_a_org_type | string |  |
| pbp_a_org_website | string |  |
| pbp_a_partd_model_flag | string |  |
| pbp_a_pbp_address1 | string |  |
| pbp_a_pbp_address2 | string |  |
| pbp_a_pbp_address3 | string |  |
| pbp_a_pbp_address4 | string |  |
| pbp_a_pbp_address5 | string |  |
| pbp_a_pbp_contact_fax | string |  |
| pbp_a_pbp_contact_name | string |  |
| pbp_a_pbp_contact_phone | string |  |
| pbp_a_pbp_contact_phone_ext | string |  |
| pbp_a_pbp_contact_position | string |  |
| pbp_a_pbp_email | string |  |
| pbp_a_pd_curmbr_loc_phone | string |  |
| pbp_a_pd_curmbr_loc_phone_ext | string |  |
| pbp_a_pd_curmbr_phone | string |  |
| pbp_a_pd_curmbr_phone_ext | string |  |
| pbp_a_pd_prombr_loc_phone | string |  |
| pbp_a_pd_prombr_loc_phone_ext | string |  |
| pbp_a_pd_prombr_phone | string |  |
| pbp_a_pd_prombr_phone_ext | string |  |
| pbp_a_pd_ttytdd_cur_loc_phn_ex | string |  |
| pbp_a_pd_ttytdd_cur_loc_phone | string |  |
| pbp_a_pd_ttytdd_curmbr_phn_ext | string |  |
| pbp_a_pd_ttytdd_curmbr_phone | string |  |
| pbp_a_pd_ttytdd_pro_loc_phn_ex | string |  |
| pbp_a_pd_ttytdd_pro_loc_phone | string |  |
| pbp_a_pd_ttytdd_prombr_phn_ext | string |  |
| pbp_a_pd_ttytdd_prombr_phone | string |  |
| pbp_a_pdss_model_flag | string |  |
| pbp_a_pharmacy_website | string |  |
| pbp_a_phys_web_addr | string |  |
| pbp_a_plan_geog_name | string | Free-text geographic description of the service area, e.g. 'National', 'Honolulu, Kauai and Maui counties', 'Cleveland, Dayton, Toledo and surrounding counties'. Descriptive only, not a coded geography. |
| pbp_a_plan_name | string | Full marketed plan name incl. type suffix, e.g. 'Humana Gold Plus H0028-004 (HMO)', 'Kaiser Permanente Medicare Part D Group Plan (PDP)'. Human-readable plan label. |
| pbp_a_plan_phone | string |  |
| pbp_a_plan_type | string | Plan-type code: 01=HMO, 02=HMO-POS, 04=Local PPO, 05=, 06/07=MSA, 09=PFFS, 18=Cost, 20=PACE, 26, 29=PDP, 30=Employer PDP, 31=Regional PPO, 37, 48=Medicare-Medicaid Plan. Verified against plan-name suffixes. CAUTION: NOT zero-padded uniformly — '01' (98k) and '1' (3.4k) both mean HMO; filtering '01' silently drops '1'. |
| pbp_a_platino_flag | string |  |
| pbp_a_platino_yn | string |  |
| pbp_a_pos_amo | string |  |
| pbp_a_pos_choices | string |  |
| pbp_a_pos_yesno | string |  |
| pbp_a_prombr_loc_phone | string |  |
| pbp_a_prombr_loc_phone_ext | string |  |
| pbp_a_prombr_phone | string |  |
| pbp_a_prombr_phone_ext | string |  |
| pbp_a_ready_for_upload_date_tm | string |  |
| pbp_a_segment_id | double |  |
| pbp_a_segment_name | string |  |
| pbp_a_service_area | string |  |
| pbp_a_snp_cond | string |  |
| pbp_a_snp_cond_oth1 | string |  |
| pbp_a_snp_cond_oth2 | string |  |
| pbp_a_snp_cond_oth3 | string |  |
| pbp_a_snp_full_dual | string |  |
| pbp_a_snp_institutional_type | string |  |
| pbp_a_snp_part_dual | string |  |
| pbp_a_snp_pct | string |  |
| pbp_a_snp_pop | string |  |
| pbp_a_snp_state_cvg_yn | string |  |
| pbp_a_special_need_flag | string | Whether the plan is a Special Needs Plan. '1' = IS a SNP (31,002 rows), '2' = NOT a SNP (207,959). Counter-intuitive: 1=yes, 2=no. Pairs with pbp_a_special_need_plan_type. |
| pbp_a_special_need_plan_type | string | SNP subtype, non-null only for SNPs (31,002): '3'=Dual-eligible D-SNP (19,407, most common), '4'=Institutional I-SNP (7,244), '1'=Chronic C-SNP (4,351). NULL = not a SNP. (Code '2' not observed.) |
| pbp_a_squish_id | string |  |
| pbp_a_tier_bendesc_bens | string |  |
| pbp_a_tier_mc_bendesc_cats | string |  |
| pbp_a_tier_nmc_bendesc_cats | string |  |
| pbp_a_tier_yn | string |  |
| pbp_a_ttytdd_cur_loc_phone | string |  |
| pbp_a_ttytdd_cur_loc_phone_ext | string |  |
| pbp_a_ttytdd_curmbr_phone | string |  |
| pbp_a_ttytdd_curmbr_phone_ext | string |  |
| pbp_a_ttytdd_phone | string |  |
| pbp_a_ttytdd_pro_loc_phone | string |  |
| pbp_a_ttytdd_pro_loc_phone_ext | string |  |
| pbp_a_ttytdd_prombr_phone | string |  |
| pbp_a_ttytdd_prombr_phone_ext | string |  |
| pbp_a_upload_date_time | string |  |
| pbp_a_vbid_indicator | string | Value-Based Insurance Design participation flag. Non-null for only 30,420 rows (recent years only); NULL elsewhere = feature did not exist / not applicable. |
| pbp_a_vp_name | string |  |
| pbp_a_vtprogram_yn | string |  |
| pbpver | string | CMS PBP software version string (e.g. '2018.03'). NULL before 2018 (d_pbpver=0 in early years). Free text, not a clean version key. |
| observed_period | date | Vlada provenance: Jan-1 of report_year (date). Normalized point-in-time the row represents. |
| asserted_at | date | Vlada ingest date (date): when this row was parsed/loaded. Only 2 values: 2026-05-16 (bulk historical load, all years, vintage 1) and 2026-05-20 (the 2018-2024 quarterly re-release snapshots, vintages 2-4). Co-varies with cms_vintage_sequence; absorbed by the grain (no key collisions). |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int | Which CMS re-release vintage within a plan-year (1-4). 1 = primary/historical; 2/3/4 = additional 2018-2024 quarterly publications loaded 2026-05-20. Co-varies with quarter; already implied by the (report_year, quarter) grain — not an extra key dimension. |
| parse_revision | int | Vlada parser revision (int, 2 distinct values). Internal lineage of the parsing code, not analytical. |
| parser_artifact_hash | string | SHA-256 of the parser artifact that produced the row. Code-provenance. |
| source_url | string | Exact CMS PBP PUF zip the row was extracted from, e.g. '.../pbp-pufs/pbp-benefits-2018-q1.zip'. 40 distinct = one per year-quarter release. Maps each row to its raw CMS file. |
| sha256_content_hash | string | SHA-256 of the source file's content. 40 distinct (one per source zip), so all rows from the same release share one hash — it is a FILE hash, not a row hash. |
| pbp_a_balance_flag | string |  |
| pbp_a_dsnp_buydown | string |  |
| pbp_a_dsnp_buydown_nominal_att | string |  |
| pbp_a_org_type / pbp_a_org_name / pbp_a_org_marketing_name |  | Organization-type code (mirror of orgtype), legal organization name (e.g. 'BUCKEYE COMMUNITY HEALTH PLAN, INC.'), and consumer marketing name (e.g. 'Buckeye Health Plan - MyCare Ohio'). org_marketing_name is the brand a member sees. |
| pbp_a_snp_* (snp_cond, snp_full_dual, snp_part_dual, snp_pct, snp_pop, snp_institutional_type, snp_state_cvg_yn, snp_cond_oth1-3) |  | SNP-only detail fields (eligible chronic conditions, dual-eligibility scope, institutional type, % thresholds). Sparsely populated — e.g. snp_pop non-null for only 3,204 rows. NULL for the ~213k non-SNP plans (null carries meaning = N/A). |
| pbp_a_ffs_bid_b_yn / _c_yn / _d_yn and *_auth_yn / *_ref_yn / *_auth_cats / *_ref_cats |  | Bid-related flags about whether the plan's Part B/C/D benefits require prior authorization or referral, and which category lists. Mostly NULL (only populated for actual MA bids, not PDP/legacy). Y/N coded '1'/'2'. |
| pbp_a_tier_yn / pbp_a_tier_bendesc_bens / pbp_a_tier_mc_bendesc_cats / pbp_a_tier_nmc_bendesc_cats |  | Whether the plan uses benefit tiers and which benefit categories are tiered (Medicare-covered vs non-Medicare-covered). Pointer fields into the cost-sharing sections; sparsely populated. |
| contact block: pbp_a_ceo_name, cfo_name, vp_name, ceo_title, pbp_contact_name/phone/fax/email/position, plan_phone, and the large family of *_curmbr_phone / *_prombr_phone / *_ttytdd_* / *_loc_phone(_ext) (current-member, prospective-member, and TTY/TDD phones, plus PD- (Part D) variants) |  | Administrative contact info: executive names and dozens of member-service / TTY phone-number columns split by audience (current vs prospective member) and by medical vs Part-D line, with _loc_ (local) and _ext (extension) variants. Operational metadata, heavily NULL, frequently placeholder like '(711)-' for TTY. Not analytical. |
| web block: pbp_a_org_website, org_marketing... , formulary_web_addr, pharmacy_website, phys_web_addr, opd_web_addr |  | Plan/org, formulary, pharmacy, physician-directory, and OPD website URLs. Reference links; many NULL. |
| address block: pbp_a_pbp_address1-5 |  | Plan mailing address lines. Almost entirely NULL in observed data. |
| pbp_a_segment_id / pbp_a_segment_name |  | Segment number (double, mirrors segment_id) and optional segment label. segment_name almost always NULL. |
| pbp_a_plan_type vs misc flags (pbp_a_network_flag, npffs_flag, partd_model_flag, pdss_model_flag, platino_flag/yn, dsnp_zerodollar, vtprogram_yn, hospice_care_yn, continue_yn/yesno/costshare_yn, pos_yesno/choices/amo, contract_period, contract_number) |  | Assorted Y/N program/model flags: network-based?, non-network PFFS?, Part D model demo?, Puerto-Rico Platino?, D-SNP $0 cost share?, value-based transformation?, hospice carve-in?, continuation-area?, point-of-service option?. contract_number/contract_period duplicate contract_id/report_year. Most are '1'/'2' coded and sparsely populated by plan type. |
| pbp_a_last_data_entry_date / pbp_a_ready_for_upload_date_tm / pbp_a_upload_date_time / pbp_a_bpt_*_date_time |  | CMS-side submission timestamps as raw strings (e.g. '05/23/2017 12:46:50 PM Eastern Daylight Time'). When the org last edited / uploaded the bid and BPT (bid pricing tool) timestamps for MA/PD/ESRD/MSA. String, not parsed dates. |
| effective_period_start / effective_period_end |  | Vlada provenance: the benefit year the plan is in effect — Jan 1 to Dec 31 of report_year. This is the profiler's chosen 'time_column' (annual, 2001-2026). |

Tools that read it: get_pbp_benefit

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