Medicare Advantage, Part D, Medicaid

PBP section c pos oon (cleaned view)

medicare_semantic.vw_pbp_section_c_pos_oon·live·semantic_view·annual
Rows
N/A
Columns
112
History
report_year 2007 (contract years 2007 through 2026) to report_year 2026
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A semantic, history-spanning view of the out-of-network / Point-of-Service (POS) cost-sharing terms that Medicare Advantage plans report in Section C of the CMS Plan Benefit Package (PBP) filing.
  2. 2It tells you, for a given MA plan-segment in a given year, what a member pays (copay $ and/or coinsurance %) when they use out-of-network or POS benefits, grouped into the plan's own cost-share "buckets." It is built by UNION-ing two CMS PBP source sections (Section C out-of-network 'C_OON' and Section C POS 'C_POS') and wrapping them in a normalized cost-share + provenance + LMI-taxonomy frame.
  3. 3It is one of a family of vw_pbp_section_* semantic views over the medicare_silver PBP tables.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquartersource_pbp_sectionbenefit_group_labelcost_share_stringbenefit_category_list_mcbenefit_category_list_nmc
  1. 1One row per (MA plan-segment snapshot) x (PBP source section) x (benefit-group cost-share bucket) x (cost-share variant) x (Medicare-covered vs non-Medicare-covered service-category split).
  2. 2Concretely the practical minimal key is contract_id + plan_id + segment_id + report_year + quarter + source_pbp_section + benefit_group_label + cost_share_string + benefit_category_list_mc + benefit_category_list_nmc, which yields 729,119 of the 729,306 rows distinct; the remaining ~63 are genuinely-identical empty residual duplicates (old 2010-2011 C_POS rows where every cost-share field is NULL).
  3. 3No single short column or the profiler's reported "candidate key" is unique.
  4. 4NOTE the grain is at the cost-share GROUP level, not the individual benefit/service-category level: one benefit_group_label row rolls up many CMS service categories (which is why min/max range columns exist and why benefit_category_list_mc/_nmc hold semicolon lists of category codes).

How to read it

  1. 1Get a plan's 2026 out-of-network cost-share buckets (deduped to one snapshot): SELECT benefit_group_label, cost_share_string, copay_amount, coinsurance_pct, source_pbp_section FROM medicare_semantic.vw_pbp_section_c_pos_oon WHERE contract_id='H0028' AND plan_id='016' AND segment_id='0' AND report_year=2026 AND quarter=1 ORDER BY source_pbp_section, benefit_group_label; -- answers 'what does this MA plan charge a member for out-of-network / POS services in 2026, by cost-share group?' Always pin report_year and a single quarter to avoid the quarterly-snapshot duplication, and remember each row is a cost-share GROUP spanning the service-category codes in benefit_category_list_mc/_nmc.

Traps

  1. 1No is_current / snapshot-dedup column. Years 2018-2020 and 2022-2024 publish 2-4 near-identical QUARTERLY snapshots of the SAME plan year, so naive counts/joins double-to-quadruple-count those years. To get one record per plan-year, filter to a single quarter per report_year (e.g. quarter=1, or MAX(quarter)). 'quarter' is a republication index, not a benefit-change period.
  2. 2The profiler's reported candidate key (contract_id, plan_id, segment_id, limit_period_code, benefit_amount_period_code, confidence_tier) is NOT a key here: limit_period_code and benefit_amount_period_code are 100% NULL and confidence_tier is single-valued. The real discriminators are source_pbp_section + benefit_group_label + cost_share_string + the MC/NMC category-list split. Two rows can share contract/plan/segment/year/quarter/benefit_group_label and differ only by Medicare-covered (benefit_category_list_mc) vs non-Medicare-covered (benefit_category_list_nmc).
  3. 3Many columns are dead weight in THIS view: ~20 columns are 100% NULL (limit_*, benefit_amount_* and all annualized/pmpm, auth_required, referral_required, max_oop_applies, section_c_sub_benefit, normalization_*, aggregation_policy) and ~9 more are single-valued constants (benefit_category='section_c_pos_oon', network_type='out_of_network', offered_status='offered', numeric_amount_observability, null_amount_reason, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status, confidence_tier, lmi_authorities). Don't infer the schema's promise from column names — benefit_amount is entirely empty here.
  4. 4Grain is the cost-share GROUP, not the individual benefit/service. One benefit_group_label rolls up many CMS service-category codes (held as semicolon lists in benefit_category_list_mc/_nmc), and coinsurance_pct/copay_amount are the representative value while *_min/*_max give the range across the collapsed categories (they differ in ~50-63k rows). Do not treat one row as one service.
  5. 5report_year is the time axis, NOT quarter (the profiler auto-labeled quarter as the time column — wrong). History runs 2007-2026 annually.
  6. 6The 2026 build is a granularity break: ~196k rows / ~50 rows per plan vs ~8.8 rows per plan in 2025 (with FEWER plans: 3,902 vs 4,229). 2026 explodes plans into many fine-grained POS/benefit-group rows (e.g. 'POS Grp 1 [$0;$5000 Max Amt]', per-category 16b/16c codes). Cross-year row counts are not comparable; this is an extraction-method change, not enrollment growth.
  7. 7This is the out-of-network/POS slice only (network_type always out_of_network). For in-network MA Section C cost-share use the sibling in-network PBP views, not this one.

Columns (112)

ColumnTypeMeaning
contract_idstringCMS MA contract id (e.g. 'H0028'). 876 distinct. Part of grain. With plan_id+segment_id identifies the plan-segment.
plan_idstringPlan id within the contract (e.g. '004'), zero-padded 3-char string. 655 distinct. Part of grain.
segment_idstringPlan segment id (e.g. '0','1','2'), string. 25 distinct. A plan can have multiple service-area segments with different benefits. Part of grain.
versiondoubleCMS PBP file submission/version number (double, 1-26). Plan-level attribute, NOT part of grain: each (contract,plan,segment,report_year,quarter) maps to exactly one version. Higher = later submission of that plan year.
report_yeardoubleContract/benefit year the PBP describes (double, 2007-2026). THIS is the real time axis (the profiler mislabeled 'quarter' as the time column). Part of grain.
quarterdoubleQuarter of the CMS PBP PUF release within report_year (double, 1-4). NOT a within-year benefit change: it is a republication snapshot. Some years publish only Q1 (2007-2017, 2021, 2025, 2026); others publish 2-4 near-duplicate quarterly snapshots of the SAME plan year (e.g. 2023 has Q1-Q4). Part of grain ONLY because of this duplication; for a deduplicated plan-year view pick one quarter per report_year.
benefit_categorystringConstant 'section_c_pos_oon' for every row. A view-tag identifying this dataset; carries no row-level information.
cost_share_stringstringHuman-readable cost-share for the benefit group, e.g. '20.0%', '$0 copay', '$300.0 copay', '$0 copay + 35.0%', '0.0%'. NULL in 68,948 rows (plan offers the benefit but no parsed numeric cost-share). Part of grain (a plan/group can have multiple distinct cost-share rows).
copay_amountdoubleParsed flat-dollar copay (double, $0-$5000, median ~$28). Populated in 323,568 rows; NULL when the benefit is coinsurance-only or unparsed. The representative/primary copay for the group.
coinsurance_pctdoubleParsed coinsurance percentage (double, 0-100, median ~26%). Populated in 368,803 rows; NULL when copay-only or unparsed. The representative/primary coinsurance for the group.
limit_textstring100% NULL in this view. Reserved free-text benefit limit; never populated for Section C OON/POS.
auth_requiredboolean100% NULL in this view. Prior-authorization flag not populated for the OON/POS section.
referral_requiredboolean100% NULL in this view. Referral-required flag not populated.
network_typevarchar(17)Constant 'out_of_network' for every row. Confirms this view is the OON/POS (non-in-network) cost-share slice. Carries no row-level information.
max_oop_appliesboolean100% NULL in this view. Whether the benefit counts toward MOOP; not populated.
limit_quantitydouble100% NULL in this view.
limit_unitstring100% NULL in this view.
limit_period_codestring100% NULL in this view (the profiler listed it as a candidate key but it is entirely null).
limit_period_labelstring100% NULL in this view.
limit_quantity_per_yeardouble100% NULL in this view.
benefit_amountdouble100% NULL in this view (0 non-null rows). Reserved for plan-funded benefit allowances (e.g. OTC/flex $); not populated here.
benefit_amount_kindstring100% NULL in this view.
benefit_amount_period_codestring100% NULL in this view.
benefit_amount_period_labelstring100% NULL in this view.
benefit_amount_annualizeddouble100% NULL in this view.
benefit_amount_pmpmdouble100% NULL in this view.
normalization_statusstring100% NULL in this view.
normalization_basisstring100% NULL in this view.
aggregation_policystring100% NULL in this view.
offered_statusvarchar(15)Constant 'offered' for every row. The view only contains benefits the plan offers OON/POS; carries no row-level information.
numeric_amount_observabilityvarchar(31)Constant 'offered_without_numeric_amounts' for every row. A data-quality tag meaning the benefit is offered but the benefit_amount $ fields are not observed in source. Carries no row-level information.
null_amount_reasonvarchar(30)Constant 'unknown_requires_crosswalk' for every row. Explains why benefit_amount is null; carries no row-level information.
annualization_policyvarchar(17)Constant 'not_numeric' for every row. No row-level information.
combined_limit_policyvarchar(29)Constant 'none_detected' for every row. No row-level information.
consumer_document_reconciliation_statusvarchar(11)Constant 'not_checked' for every row. These rows have not been reconciled against consumer-facing plan docs (SB/EOC). No row-level information.
confidence_tiervarchar(23)Constant 'source_faithful' for every row (the profiler listed it as a candidate key, but it is single-valued). Means values are taken faithfully from the CMS source with no inference. No row-level information.
benefit_categories_liststringRaw CMS PBP category encoding string, e.g. '' (empty, 628k rows), '01', '10', '11', or a long fixed-width bitmask of 0/1 flags. Low-level source artifact; prefer the parsed _mc/_nmc lists below.
benefit_category_list_mcstringSemicolon-delimited list of CMS PBP Section-C service-category codes that are MEDICARE-COVERED (MC) and share this cost-share group, e.g. '3-1;3-2;5;6;7a;...' or '6;14a;'. Populated in 504,781 rows. Codes reference the CMS PBP service-category taxonomy (see lmi_authorities). Part of grain. NULL when this row is the non-Medicare-covered side.
benefit_category_list_nmcstringSemicolon-delimited list of NON-MEDICARE-COVERED (NMC, i.e. supplemental) service-category codes sharing this cost-share group, e.g. '16b1;16b2;16c1;...'. Populated in 265,211 rows. Part of grain. The MC vs NMC split is what separates two otherwise-identical benefit_group_label rows (e.g. category '7b' appears once MC at 30% and once NMC). 90,000 rows have BOTH mc and nmc lists populated; 49,314 have neither.
benefit_group_idstring
benefit_group_labelstringThe plan's own cost-share bucket label and the primary row-level discriminator within a snapshot. 10,189 distinct values; NULL in 123,996 rows. Forms: generic 'Group 1'..'Group N'; semantic '35%','$0','50% coinsurance','OTC','Ambulance','Dental','Vision','Hearing'; raw category codes '17a','10a1','7b'; and the 2026-style 'POS Grp 1 [$0;$5000 Max Amt]' / 'POS_25%'. Part of grain.
coinsurance_pct_maxdoubleMaximum coinsurance % across the service categories rolled into this group (double). Differs from coinsurance_pct in 51,569 rows where the group spans a range (e.g. headline 20% but group spans 20-50%). Use to detect range-valued groups.
coinsurance_pct_mindoubleMinimum coinsurance % across the rolled-up categories. With _max gives the coinsurance range for the group.
copay_amount_maxdoubleMaximum copay $ across the rolled-up categories (double). Differs from copay_amount in 63,388 rows (range-valued group).
copay_amount_mindoubleMinimum copay $ across the rolled-up categories. With _max gives the copay range for the group.
cost_share_basisstring
day_interval_count_coinsurancedouble
day_interval_count_copaydouble
group_deductible_amountdouble
has_coinsurancebooleanDerived boolean: this group has a coinsurance component. True 368,803 / False 346,272 / NULL 14,231 (undeterminable, the empty cost-share rows).
has_copaybooleanDerived boolean: this group has a flat-copay component. True 323,568 / False 391,507 / NULL 14,231.
has_deductiblebooleanDerived boolean: a deductible applies. Almost always False (712,487); True only 1,853; NULL 14,966. OON deductibles are rarely encoded in this section.
max_plan_benefit_amountdouble
max_plan_benefit_offeredboolean
max_plan_benefit_period_codestring
max_plan_benefit_period_descriptionstring
max_plan_benefit_period_labelstring
original_medicare_amount_kindstring
original_medicare_amount_resolveddouble
original_medicare_cost_share_chargedboolean
pos_all_state_licensed_practitionersboolean
pos_benefit_type_codestring
pos_benefit_type_labelstring
pos_inpatient_maximum_1a_period_codestring
pos_inpatient_maximum_1a_period_descriptionstring
pos_inpatient_maximum_1a_period_labelstring
pos_inpatient_maximum_1b_period_codestring
pos_inpatient_maximum_1b_period_descriptionstring
pos_inpatient_maximum_1b_period_labelstring
pos_inpatient_maximum_acute_amountdouble
pos_inpatient_maximum_combined_amountdouble
pos_inpatient_maximum_offeredboolean
pos_inpatient_maximum_period_codestring
pos_inpatient_maximum_period_descriptionstring
pos_inpatient_maximum_period_labelstring
pos_inpatient_maximum_psych_amountdouble
pos_inpatient_maximum_type_codestring
pos_inpatient_maximum_type_labelstring
pos_moop_amountdouble
pos_moop_offeredboolean
pos_moop_period_codestring
pos_moop_period_descriptionstring
pos_moop_period_labelstring
pos_plan_maximum_amountdouble
pos_plan_maximum_benefit_types_codestring
pos_plan_maximum_benefit_types_labelstring
pos_plan_maximum_category_list_legacystring
pos_plan_maximum_category_list_mcstring
pos_plan_maximum_category_list_nmcstring
pos_plan_maximum_offeredboolean
pos_plan_maximum_period_codestring
pos_plan_maximum_period_descriptionstring
pos_plan_maximum_period_labelstring
section_c_plan_benefit_types_codestring
section_c_plan_benefit_types_labelstring
section_c_plan_category_list_legacystring
section_c_plan_category_list_mcstring
section_c_plan_category_list_nmcstring
section_c_plan_group_countdouble
section_c_plan_level_policystring
section_c_plan_level_source_statusstring
section_c_sub_benefitvarchar(30)100% NULL in this view. Reserved sub-benefit label; never populated.
visitor_travel_benefit_type_codestring
visitor_travel_benefit_type_labelstring
visitor_travel_geographic_area_codestring
visitor_travel_geographic_area_labelstring
visitor_travel_offeredboolean
source_pbp_sectionvarchar(5)Which CMS PBP source section the row came from: 'C_OON' (Section C out-of-network, 658,957 rows) or 'C_POS' (Section C Point-of-Service, 70,349 rows). The view UNIONs both. Part of grain (the same plan/group/category can appear once per section).
source_silver_tablevarchar(33)Underlying medicare_silver table the row was read from: 'medicare_silver.pbp_section_c_oon' or 'medicare_silver.pbp_section_c_pos'. 1:1 with source_pbp_section; lineage.
lmi_authoritiesstringConstant single URL pointing to the LMI-hosted 'CY 2026 PBP Service Category Descriptions.pdf' (mabenefitsmailbox.lmi.org). The authoritative crosswalk for decoding the service-category codes in benefit_category_list_mc/_nmc. Same value on every row.
source_urlstringCMS PBP PUF zip the row was extracted from, e.g. '.../pbp-benefits-2018-q1.zip'. 34 distinct files = one file per (report_year, quarter) snapshot. Provenance.
sha256_content_hashstringSHA-256 of the source file content (34 distinct, 1:1 with source_url). Integrity/provenance fingerprint of the originating CMS file, not a row-level hash.

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_section_c_pos_oon")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_section_c_pos_oon WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' AND source_pbp_section = '<value>' AND benefit_group_label = '<value>' AND cost_share_string = '<value>' AND benefit_category_list_mc = '<value>' AND benefit_category_list_nmc = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id,plan_id,segment_id
Joinhow_to_join(source_fqn="medicare_semantic.vw_pbp_section_c_pos_oon")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_section_c_pos_oon
NoteCleaned PBP reasoning surface (categories/section_c_pos_oon/contract.yaml); raw is pbp_section_*.

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