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
- 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.
- 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.
- 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;
- 4Section A itself carries almost no dollar amounts.
Grain
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquarter |
|
How to read it
- 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).
- 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
- 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.
- 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).
- 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.
- 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.
- 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.
- 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.
- 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)
| 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). |
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")
| Item | Value |
|---|---|
| Typed tools that read it | get_pbp_benefit |
| Identity key | contract_id,plan_id,segment_id |
| Join | how_to_join(source_fqn="medicare_silver.pbp_section_a") |
| Raw door | Athena (read-only via query_substrate): medicare_silver.pbp_section_a |
| Company names | pbp_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 |
| Note | Grain-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