Medicare Advantage, Part D, Medicaid

MA pbp section c pos

medicare_silver.pbp_section_c_pos·partial·silver·annual·Medicare Advantage Plan Benefit Packages (PBP)
Rows
N/A
Columns
46
History
2007 (report_year 2007, effective_period_start 2007-01-01) to 2026 (report_year 2026, effective_period_start 2026-01-01)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A Medicare Advantage plan-benefit reference table holding the enrollee cost-sharing design (coinsurance %, copay $, deductible, plan-coverage maximum) for the "Point of Service" (POS) outpatient benefit category of each MA plan, parsed from the annual CMS PBP (Plan Benefit Package) Public Use Files.
  2. 2It tells you what a member pays out-of-pocket for POS-routed outpatient services under each Medicare Advantage contract/plan/segment, by benefit-group, year over year (2007-2026).

Grain

KeyGrain
contract_idplan_idsegment_idpbp_c_pos_outpt_group_num_idreport_yearquarter
  1. 1One row per MA plan benefit-group per quarterly CMS PBP snapshot: contract_id x plan_id x segment_id x pbp_c_pos_outpt_group_num_id x report_year x quarter.
  2. 2Verified: SELECT DISTINCT on exactly those 6 columns = 70,349 = the full row_count.
  3. 3A "group" is a cost-share tier the plan defines for its POS outpatient benefit (Group 1, Group 2, ...); most plans have 1-2 groups, some up to 20+.
  4. 4NOTE: this is the physical/storage grain — analytically each plan-group is republished IDENTICALLY across the quarters of a year (e.g.
  5. 52023 Q1=Q2=Q3=Q4, values unchanged), so the true annual benefit grain is contract_id x plan_id x segment_id x group_num_id x report_year (3,089 distinct plan-groups in 2023 vs 12,353 raw rows).

How to read it

  1. 1Get the member cost-share for a specific MA plan's POS outpatient benefit for a given year, deduped to one snapshot.
  2. 2Example: SELECT pbp_c_pos_outpt_group_num_id, pbp_c_pos_group_lbl, pbp_c_pos_outpt_coins_yn, pbp_c_pos_outpt_coins_min_pct, pbp_c_pos_outpt_copay_yn, pbp_c_pos_outpt_copay_min_amt, pbp_c_pos_outpt_mc_bencats FROM medicare_silver.pbp_section_c_pos WHERE contract_id='H0174' AND plan_id='005' AND segment_id='0' AND report_year=2019 AND quarter=4 ORDER BY pbp_c_pos_outpt_group_num_id; -- returns each cost-share group's coinsurance %/copay $ and the benefit-category codes it applies to, for that plan-year (filter quarter to avoid the 4x quarterly-republication duplication).

Traps

  1. 1QUARTER IS A DUPLICATION AXIS, NOT NEW DATA. For 2018+ the same plan-group is republished IDENTICALLY across Q1-Q4 (2023: 12,353 raw rows = 4 x 3,089 distinct plan-groups; benefit values do NOT differ across quarters). Any benefit analysis MUST collapse to one quarter per year (or group by report_year only) or you will 2-4x overcount plans. There is NO is_current column to do this for you.
  2. 2PROFILER GRAIN IS A BLOATED SUPERSET. The profiler's 14-column 'verified unique' key wrongly includes VALUE columns (pbp_c_pos_outpt_maxplan_amt/_cov/_per/_per_d/_yn) and the redundant bid_id/plan_type. The true MINIMAL grain is just contract_id x plan_id x segment_id x pbp_c_pos_outpt_group_num_id x report_year x quarter (6 cols = 70,349). pbp_c_pos_outpt_maxplan_per_d is in that profiler key yet is 100% NULL.
  3. 3NULL VALUE COLUMNS ARE MEANINGFUL = 'cost-share type does not apply'. coins_min/max_pct is NULL exactly when coins_yn<>'1'; copay_*_amt NULL when copay_yn<>'1'; deduct_amt NULL when deduct_yn<>'1'; maxplan_amt NULL when maxplan_yn<>'1' (all verified, 0 violations). Always gate on the matching _yn='1' flag (1=Yes, 2=No) before reading a dollar/percent value; do not treat NULL as $0.
  4. 4coins_*_pct are PERCENTAGES (0-100), copay_*_amt / deduct_amt / maxplan_amt are DOLLARS. maxplan_amt is a PLAN-PAID benefit LIMIT (what the plan covers up to), not a member out-of-pocket cost. A single group can carry BOTH a copay and a coinsurance simultaneously (2,247 rows), so member cost is not one-or-the-other.
  5. 5asserted_at / parse_revision / parser_artifact_hash are VLADA ETL metadata (only 2 ingest dates: 2026-05-16 & 2026-05-20), NOT CMS dates. cms_vintage_sequence tracks CMS quarterly re-releases (1-4), also not an is_current flag. For real CMS provenance use source_url + sha256_content_hash (34 distinct, one per snapshot). bid_id is just contract_id_plan_id_segment_id (redundant). pbp_c_pos_group_lbl is free-text and ~50% NULL — never key/join on it.
  6. 6This is the POS (Point-of-Service) slice only — one of many PBP Section C benefit tables (sibling pbp_section_c_* tables cover other outpatient/inpatient/professional benefit categories). bencat_bens / mc_bencats / nmc_bencats are CMS PBP benefit-category codes (semicolon-delimited code lists like '7b;8a1;14e1'), not service descriptions; the empty-string bencat_bens is a pre-2013 vintage gap, not a real category.

Columns (46)

ColumnTypeMeaning
contract_idstringCMS Medicare Advantage contract ID (e.g. H0174). 404 distinct. First component of the plan identity; an org's MA contract.
plan_idstringPlan number within the contract (e.g. '005', zero-padded 3-char string). 288 distinct. contract_id+plan_id+segment_id = the unique benefit package.
segment_idstringPlan segment / service-area sub-division ('0' for the base plan, '1'..'10' for segmented plans). 11 distinct; '0' covers 51,600 of 70,349 rows. Part of the plan key.
pbp_c_pos_outpt_group_num_idstringCost-share GROUP number the plan defines for its POS outpatient benefit ('1','2','3',...). THE row-level discriminator that makes each plan multi-row. Values 1-20+. Each group bundles a set of service benefit-categories that share one cost-share design.
pbp_c_pos_oupt_bencat_bensstringBenefit-category-set code for the group: '01' (37,623 rows), '10' (16,289), '11' (8,691), or '' empty. Empty string is concentrated in early vintages 2007-2012 (column not populated then) — empty = 'not coded in that vintage', not a real category. Functionally dependent on group_num_id (adding it to the key does not change the grain).
versiondoubleCMS PBP bid version number (double, 1.0-12.0+) — the plan's bid-submission revision; higher = later refile. Descriptive, NOT part of the grain (only the latest captured version per quarter is present).
report_yeardoubleCMS PBP benefit/contract year (double, 2007-2026, 20 distinct). The primary time dimension; equals the calendar year the benefit design is in effect.
quarterdoubleCMS quarterly release within the report_year (1-4). PART OF THE PHYSICAL GRAIN but a duplication axis: 2007-2017 have only Q1; 2018+ have multiple quarters whose benefit values are IDENTICAL. Some years skip quarters (2020 has no Q3, 2024 no Q2, 2025/2026 only Q1).
bid_idstringConvenience concatenation contract_id + '_' + plan_id + '_' + segment_id (e.g. 'H0174_005_0'). 100% derivable (0 mismatches) — redundant, do not treat as independent key.
orgtypestringCMS organization-type code: '01' (Local CCP, 69,926 rows) dominant, '05' (408), '11' (15). Identifies the MA org structure.
pbp_a_ben_covstringSection-A flag for whether the plan provides this (Part-A-style) benefit coverage: '1'=Yes (70,219), '2'=No (130). Plan-level attribute repeated on every group row.
pbp_a_plan_typestringCMS plan-type code: '02' dominant (69,783, the HMO-POS/local plan type for this POS table), plus '37','05','04','06','39','31','01','49','10'. Plan-level attribute.
pbp_c_pos_group_lblstringFree-text label for the group ('Group 1', 'Group 2', or descriptive like '50% coinsurance','20% coinsurance'). OFTEN NULL (~half the rows) and non-standard — display-only, NOT a reliable key or join field.
pbp_c_pos_outpt_bendesc_catsstringFree-text/coded benefit-description categories for the group. Sparse: 7,656 non-null, 966 distinct. Descriptive enrichment of which services the group covers.
pbp_c_pos_outpt_coins_covstringCoinsurance coverage-scope code. Very sparse: 1,341 non-null, 4 distinct values. Qualifies what the coinsurance applies to.
pbp_c_pos_outpt_coins_max_pctdoubleMaximum coinsurance PERCENT (0-100, avg 27.8%). Same population rule as min. min=max when the group has a single flat coinsurance rate.
pbp_c_pos_outpt_coins_min_pctdoubleMinimum coinsurance PERCENT the member pays (0-100, avg 21.4%). Populated iff coins_yn='1' (exactly 31,013 non-null). A COST field. NULL = no coinsurance applies.
pbp_c_pos_outpt_coins_ynstringDoes this group charge COINSURANCE? '1'=Yes (31,013), '2'=No (39,312), null (24). When '1', coins_min/max_pct are populated; when '2', they are NULL.
pbp_c_pos_outpt_copay_max_amtdoubleMaximum copay DOLLARS (0-9999.99, avg $79). Same population rule. A group can have BOTH a copay and a coinsurance (2,247 rows have both yn='1'); 8,667 rows have neither (full coverage / $0 / 'see other').
pbp_c_pos_outpt_copay_min_amtdoubleMinimum copay DOLLARS the member pays (0-699, avg $62). Populated iff copay_yn='1' (32,892 non-null). A COST field. NULL = no copay.
pbp_c_pos_outpt_copay_ynstringDoes this group charge a COPAY? '1'=Yes (32,892), '2'=No (37,433), null (24). When '1', copay_min/max_amt populated; when '2' they are NULL (verified 0 violations).
pbp_c_pos_outpt_cost_sharestringCost-share-structure enum: '1'/'2'/'3' (3 distinct), only 2,195 non-null. Encodes the cost-share arrangement type for the group; sparse, mostly NULL.
pbp_c_pos_outpt_cs_coins_maxdoubleCombined-cost-share coinsurance max PERCENT (20-50). Only 93 non-null.
pbp_c_pos_outpt_cs_coins_mindoubleCombined-cost-share coinsurance min PERCENT (0-50). Only 93 non-null. Edge-case cost field.
pbp_c_pos_outpt_cs_coins_ynstringSecondary/combined-cost-share coinsurance flag. VERY sparse: null on 70,083 of 70,349 rows; '2'=173, '1'=93. Used only for rare combined copay+coinsurance designs.
pbp_c_pos_outpt_cs_copay_maxdoubleCombined-cost-share copay max DOLLARS (20-70). Only 176 non-null.
pbp_c_pos_outpt_cs_copay_mindoubleCombined-cost-share copay min DOLLARS (0-45). Only 176 non-null. Edge-case cost field.
pbp_c_pos_outpt_cs_copay_ynstringSecondary/combined-cost-share copay flag. VERY sparse: null on 70,083 rows; '1'=176, '2'=90.
pbp_c_pos_outpt_deduct_amtdoubleDeductible DOLLARS (0-5000, avg $1,080). Populated iff deduct_yn='1' (216 non-null). A COST field; NULL = no deductible.
pbp_c_pos_outpt_deduct_ynstringDoes this group have a DEDUCTIBLE? '2'=No (69,443), '1'=Yes (216), null (690). Deductibles are rare for POS outpatient.
pbp_c_pos_outpt_maxplan_amtdoublePlan-coverage-maximum DOLLAR amount the PLAN will pay (15-500,000, avg $2,109). Populated iff maxplan_yn='1' (5,863 non-null). A benefit-LIMIT field (not a member cost). NULL = no plan max. NOTE: profiler wrongly included this in the grain key — it is a VALUE, not a key.
pbp_c_pos_outpt_maxplan_covstringPlan-maximum coverage-scope code ('1','2','6'). EXTREMELY sparse: only 69 non-null. Profiler listed it in the key but it is near-empty.
pbp_c_pos_outpt_maxplan_perstringPeriod the plan-maximum applies over (code: '3' dominant=4,982, plus '1','2','4','5','6','7'). Populated with maxplan_yn='1'. '3' is the most common period basis (per-year/annual).
pbp_c_pos_outpt_maxplan_per_dstringPlan-maximum period detail. 100% NULL (0 non-null across all 70,349 rows) — a completely empty column. TRAP: profiler listed it as a grain key though it carries no data.
pbp_c_pos_outpt_maxplan_ynstringDoes the plan cap its own coverage (a plan-coverage maximum / benefit limit) for this group? '2'=No (63,796), '1'=Yes (5,863), null (690).
pbp_c_pos_outpt_mc_bencatsstringSemicolon-delimited list of CMS Medicare-Covered benefit-category codes this group's cost-share applies to (e.g. '7b;7d;7f;8a1;...'). 46,314 non-null. These codes (3-1, 7a, 8a1, 14e1...) map to specific outpatient service types in the CMS PBP benefit taxonomy.
pbp_c_pos_outpt_nmc_bencatsstringSemicolon-delimited list of Non-Medicare-Covered (supplemental) benefit-category codes for the group. 24,980 non-null, 444 distinct lists. Same delimited code-list format as mc_bencats.
observed_perioddateVlada normalized observation period = Jan 1 of report_year (date). Equivalent to report_year; derived, redundant with effective_period_start.
asserted_atdateVlada INGEST/parse date (date), only 2 values: 2026-05-16 (33,681 rows, parse_revision 1) and 2026-05-20 (36,668 rows, parse_revision 2). This is WHEN Vlada parsed the file, NOT a CMS provenance date — do not use as a benefit-effective date.
effective_period_startdateBenefit effective start = Jan 1 of report_year (date, 2007-01-01..2026-01-01). The primary temporal anchor; 20 distinct annual values.
effective_period_enddateBenefit effective end = Dec 31 of report_year (date). Together with start, bounds the plan year.
cms_vintage_sequenceintSequence number (int 1-4) of the CMS re-release within a report_year, tracking quarterly republications. NOT an is_current flag — there is no is_current column on this table.
parse_revisionintVlada parser revision (int): 1 (33,681 rows, parsed 2026-05-16) or 2 (36,668 rows, parsed 2026-05-20). Load-tracking metadata.
parser_artifact_hashstringSHA-256 of the parser code artifact that produced the row (provenance/reproducibility of the ETL, not of the source data).
source_urlstringCMS source URL for the PBP zip the row came from (e.g. .../pbp-benefits-2019-q4.zip). Exactly 34 distinct = one per (report_year,quarter) snapshot. Lets you trace any value to the official CMS file.
sha256_content_hashstringSHA-256 of the source file content. Exactly 34 distinct (1:1 with source_url and with the 34 snapshots) — content-integrity / dedup key for the underlying CMS download.

Query it

describe_data_source(source_fqn="medicare_silver.pbp_section_c_pos")     # the card, live
query_substrate(sql="SELECT * FROM medicare_silver.pbp_section_c_pos WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND pbp_c_pos_outpt_group_num_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id
Joinhow_to_join(source_fqn="medicare_silver.pbp_section_c_pos")
Raw doorAthena (read-only via query_substrate): medicare_silver.pbp_section_c_pos
NoteGrain-governed; live in Glue / query_substrate. Source family pbp_benefits.

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