Medicare Advantage, Part D, Medicaid

MA pbp section a

medicare_silver.pbp_section_a·partial·silver·Plan-year coverage is annual (2001-2026, 26 plan years). Publication cadence changed mid-history: 2001-2017 = a single annual (Q1) PUF release per year; 2018-present = multiple quarterly re-releases (Q1-Q4) per plan-year. 40 distinct year-quarter release snapshots in total.·Medicare Advantage Plan Benefit Packages (PBP)
Rows
N/A
Columns
152
History
2001 (report_year 2001 / effective_period_start 2001-01-01) to 2026 (report_year 2026, quarter 1)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1CMS Plan Benefit Package (PBP) Public Use File, Section A — the plan-level administrative and identity header for every Medicare Advantage and Part D plan that filed a benefit bid with CMS.
  2. 2One row describes a single plan (contract+plan+segment) as of one PUF release: who runs it (org/marketing names, CEO/CFO), what kind of plan it is (HMO/PPO/PDP/SNP/PACE/MMP/Cost), member-service phone numbers and websites, special-needs/employer/VBID flags, and estimated enrollment.
  3. 3It is the lookup/dimension spine that the other PBP sections (cost-sharing, drug, dental, etc.) hang off of via the contract/plan/segment key;
  4. 4Section A itself carries almost no dollar amounts.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per Medicare plan-segment per PUF release snapshot — i.e. one row per (contract_id, plan_id, segment_id, report_year, quarter).
  2. 2VERIFIED 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 read it

  1. 1Get 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).
  2. 2This 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

  1. 1GRAIN 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.
  2. 2bid_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).
  3. 3CODE 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.
  4. 4FLAG 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.
  5. 5NULLS 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.
  6. 6SECTION 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.
  7. 7Provenance 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.

Columns (152)

ColumnTypeMeaning
contract_idstringCMS 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_idstringPlan 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_idstringPlan segment (geographic/benefit sub-division of a plan), usually '0'. 27 distinct. Third part of the grain. Most plans have only segment 0.
versiondoubleCMS 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_yeardoublePlan/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.
quarterdoublePUF 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_idstringConvenience 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.
orgtypestringNumeric 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_covstring
pbp_a_bpt_esrd_date_timestring
pbp_a_bpt_ma_date_timestring
pbp_a_bpt_msa_date_timestring
pbp_a_bpt_pd_date_timestring
pbp_a_ceo_namestring
pbp_a_ceo_titlestring
pbp_a_cfo_namestring
pbp_a_continue_costshare_ynstring
pbp_a_continue_yesnostring
pbp_a_continue_ynstring
pbp_a_contract_numberstring
pbp_a_contract_partd_flagstringWhether the plan includes Part D drug coverage ('1' observed = has Part D). Distinguishes MA-PD from MA-only.
pbp_a_contract_periodstring
pbp_a_curmbr_loc_phonestring
pbp_a_curmbr_loc_phone_extstring
pbp_a_curmbr_phonestring
pbp_a_curmbr_phone_extstring
pbp_a_dsnp_zerodollarstring
pbp_a_eghp_ynstringEmployer Group Health Plan flag. '1' = employer/union group plan (52,908 rows), '2' = individual-market. Identifies the employer (800-series) plans.
pbp_a_est_membdoubleEstimated 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_catsstring
pbp_a_ffs_bid_b_auth_ynstring
pbp_a_ffs_bid_b_ref_catsstring
pbp_a_ffs_bid_b_ref_ynstring
pbp_a_ffs_bid_b_ynstring
pbp_a_ffs_bid_c_auth_catsstring
pbp_a_ffs_bid_c_auth_ynstring
pbp_a_ffs_bid_c_ref_catsstring
pbp_a_ffs_bid_c_ref_ynstring
pbp_a_ffs_bid_c_ynstring
pbp_a_ffs_bid_d_ynstring
pbp_a_formulary_web_addrstring
pbp_a_hospice_care_ynstring
pbp_a_last_data_entry_datestring
pbp_a_network_flagstring
pbp_a_npffs_flagstring
pbp_a_opd_web_addrstring
pbp_a_org_marketing_namestring
pbp_a_org_namestring
pbp_a_org_typestring
pbp_a_org_websitestring
pbp_a_partd_model_flagstring
pbp_a_pbp_address1string
pbp_a_pbp_address2string
pbp_a_pbp_address3string
pbp_a_pbp_address4string
pbp_a_pbp_address5string
pbp_a_pbp_contact_faxstring
pbp_a_pbp_contact_namestring
pbp_a_pbp_contact_phonestring
pbp_a_pbp_contact_phone_extstring
pbp_a_pbp_contact_positionstring
pbp_a_pbp_emailstring
pbp_a_pd_curmbr_loc_phonestring
pbp_a_pd_curmbr_loc_phone_extstring
pbp_a_pd_curmbr_phonestring
pbp_a_pd_curmbr_phone_extstring
pbp_a_pd_prombr_loc_phonestring
pbp_a_pd_prombr_loc_phone_extstring
pbp_a_pd_prombr_phonestring
pbp_a_pd_prombr_phone_extstring
pbp_a_pd_ttytdd_cur_loc_phn_exstring
pbp_a_pd_ttytdd_cur_loc_phonestring
pbp_a_pd_ttytdd_curmbr_phn_extstring
pbp_a_pd_ttytdd_curmbr_phonestring
pbp_a_pd_ttytdd_pro_loc_phn_exstring
pbp_a_pd_ttytdd_pro_loc_phonestring
pbp_a_pd_ttytdd_prombr_phn_extstring
pbp_a_pd_ttytdd_prombr_phonestring
pbp_a_pdss_model_flagstring
pbp_a_pharmacy_websitestring
pbp_a_phys_web_addrstring
pbp_a_plan_geog_namestringFree-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_namestringFull 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_phonestring
pbp_a_plan_typestringPlan-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_flagstring
pbp_a_platino_ynstring
pbp_a_pos_amostring
pbp_a_pos_choicesstring
pbp_a_pos_yesnostring
pbp_a_prombr_loc_phonestring
pbp_a_prombr_loc_phone_extstring
pbp_a_prombr_phonestring
pbp_a_prombr_phone_extstring
pbp_a_ready_for_upload_date_tmstring
pbp_a_segment_iddouble
pbp_a_segment_namestring
pbp_a_service_areastring
pbp_a_snp_condstring
pbp_a_snp_cond_oth1string
pbp_a_snp_cond_oth2string
pbp_a_snp_cond_oth3string
pbp_a_snp_full_dualstring
pbp_a_snp_institutional_typestring
pbp_a_snp_part_dualstring
pbp_a_snp_pctstring
pbp_a_snp_popstring
pbp_a_snp_state_cvg_ynstring
pbp_a_special_need_flagstringWhether 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_typestringSNP 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_idstring
pbp_a_tier_bendesc_bensstring
pbp_a_tier_mc_bendesc_catsstring
pbp_a_tier_nmc_bendesc_catsstring
pbp_a_tier_ynstring
pbp_a_ttytdd_cur_loc_phonestring
pbp_a_ttytdd_cur_loc_phone_extstring
pbp_a_ttytdd_curmbr_phonestring
pbp_a_ttytdd_curmbr_phone_extstring
pbp_a_ttytdd_phonestring
pbp_a_ttytdd_pro_loc_phonestring
pbp_a_ttytdd_pro_loc_phone_extstring
pbp_a_ttytdd_prombr_phonestring
pbp_a_ttytdd_prombr_phone_extstring
pbp_a_upload_date_timestring
pbp_a_vbid_indicatorstringValue-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_namestring
pbp_a_vtprogram_ynstring
pbpverstringCMS 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_perioddateVlada provenance: Jan-1 of report_year (date). Normalized point-in-time the row represents.
asserted_atdateVlada 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_startdate
effective_period_enddate
cms_vintage_sequenceintWhich 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_revisionintVlada parser revision (int, 2 distinct values). Internal lineage of the parsing code, not analytical.
parser_artifact_hashstringSHA-256 of the parser artifact that produced the row. Code-provenance.
source_urlstringExact 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_hashstringSHA-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_flagstring
pbp_a_dsnp_buydownstring
pbp_a_dsnp_buydown_nominal_attstring
pbp_a_org_type / pbp_a_org_name / pbp_a_org_marketing_nameOrganization-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_catsBid-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_catsWhether 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_addrPlan/org, formulary, pharmacy, physician-directory, and OPD website URLs. Reference links; many NULL.
address block: pbp_a_pbp_address1-5Plan mailing address lines. Almost entirely NULL in observed data.
pbp_a_segment_id / pbp_a_segment_nameSegment 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_timeCMS-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_endVlada 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).

Query it

describe_data_source(source_fqn="medicare_silver.pbp_section_a")     # the card, live
query_substrate(sql="SELECT * FROM medicare_silver.pbp_section_a 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,plan_id,segment_id
Joinhow_to_join(source_fqn="medicare_silver.pbp_section_a")
Raw doorAthena (read-only via query_substrate): medicare_silver.pbp_section_a
Company namespbp_a_org_marketing_name pbp_a_org_name pbp_a_org_type / pbp_a_org_name / pbp_a_org_marketing_name web block: pbp_a_org_website, org_marketing... , formulary_web_addr, pharmacy_website, phys_web_addr, opd_web_addr resolve to a permanent Vlada ID: resolve_entity(text=<name>); the company pages hold owners and holdings
NoteGrain-governed; live in Glue / query_substrate. Source family pbp_benefits.

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