Medicare Advantage, Part D, Medicaid
PBP section c pos oon (cleaned view)
medicare_semantic.vw_pbp_section_c_pos_oon·live·semantic_view·annualRows
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
- 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.
- 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.
- 3It is one of a family of vw_pbp_section_* semantic views over the medicare_silver PBP tables.
Grain
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquartersource_pbp_sectionbenefit_group_labelcost_share_stringbenefit_category_list_mcbenefit_category_list_nmc |
|
How to read it
- 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
- 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.
- 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).
- 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.
- 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.
- 5report_year is the time axis, NOT quarter (the profiler auto-labeled quarter as the time column — wrong). History runs 2007-2026 annually.
- 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.
- 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)
| Column | Type | Meaning |
|---|---|---|
contract_id | string | CMS MA contract id (e.g. 'H0028'). 876 distinct. Part of grain. With plan_id+segment_id identifies the plan-segment. |
plan_id | string | Plan id within the contract (e.g. '004'), zero-padded 3-char string. 655 distinct. Part of grain. |
segment_id | string | Plan segment id (e.g. '0','1','2'), string. 25 distinct. A plan can have multiple service-area segments with different benefits. Part of grain. |
version | double | CMS 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_year | double | Contract/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. |
quarter | double | Quarter 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_category | string | Constant 'section_c_pos_oon' for every row. A view-tag identifying this dataset; carries no row-level information. |
cost_share_string | string | Human-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_amount | double | Parsed 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_pct | double | Parsed 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_text | string | 100% NULL in this view. Reserved free-text benefit limit; never populated for Section C OON/POS. |
auth_required | boolean | 100% NULL in this view. Prior-authorization flag not populated for the OON/POS section. |
referral_required | boolean | 100% NULL in this view. Referral-required flag not populated. |
network_type | varchar(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_applies | boolean | 100% NULL in this view. Whether the benefit counts toward MOOP; not populated. |
limit_quantity | double | 100% NULL in this view. |
limit_unit | string | 100% NULL in this view. |
limit_period_code | string | 100% NULL in this view (the profiler listed it as a candidate key but it is entirely null). |
limit_period_label | string | 100% NULL in this view. |
limit_quantity_per_year | double | 100% NULL in this view. |
benefit_amount | double | 100% NULL in this view (0 non-null rows). Reserved for plan-funded benefit allowances (e.g. OTC/flex $); not populated here. |
benefit_amount_kind | string | 100% NULL in this view. |
benefit_amount_period_code | string | 100% NULL in this view. |
benefit_amount_period_label | string | 100% NULL in this view. |
benefit_amount_annualized | double | 100% NULL in this view. |
benefit_amount_pmpm | double | 100% NULL in this view. |
normalization_status | string | 100% NULL in this view. |
normalization_basis | string | 100% NULL in this view. |
aggregation_policy | string | 100% NULL in this view. |
offered_status | varchar(15) | Constant 'offered' for every row. The view only contains benefits the plan offers OON/POS; carries no row-level information. |
numeric_amount_observability | varchar(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_reason | varchar(30) | Constant 'unknown_requires_crosswalk' for every row. Explains why benefit_amount is null; carries no row-level information. |
annualization_policy | varchar(17) | Constant 'not_numeric' for every row. No row-level information. |
combined_limit_policy | varchar(29) | Constant 'none_detected' for every row. No row-level information. |
consumer_document_reconciliation_status | varchar(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_tier | varchar(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_list | string | Raw 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_mc | string | Semicolon-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_nmc | string | Semicolon-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_id | string | |
benefit_group_label | string | The 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_max | double | Maximum 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_min | double | Minimum coinsurance % across the rolled-up categories. With _max gives the coinsurance range for the group. |
copay_amount_max | double | Maximum copay $ across the rolled-up categories (double). Differs from copay_amount in 63,388 rows (range-valued group). |
copay_amount_min | double | Minimum copay $ across the rolled-up categories. With _max gives the copay range for the group. |
cost_share_basis | string | |
day_interval_count_coinsurance | double | |
day_interval_count_copay | double | |
group_deductible_amount | double | |
has_coinsurance | boolean | Derived boolean: this group has a coinsurance component. True 368,803 / False 346,272 / NULL 14,231 (undeterminable, the empty cost-share rows). |
has_copay | boolean | Derived boolean: this group has a flat-copay component. True 323,568 / False 391,507 / NULL 14,231. |
has_deductible | boolean | Derived 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_amount | double | |
max_plan_benefit_offered | boolean | |
max_plan_benefit_period_code | string | |
max_plan_benefit_period_description | string | |
max_plan_benefit_period_label | string | |
original_medicare_amount_kind | string | |
original_medicare_amount_resolved | double | |
original_medicare_cost_share_charged | boolean | |
pos_all_state_licensed_practitioners | boolean | |
pos_benefit_type_code | string | |
pos_benefit_type_label | string | |
pos_inpatient_maximum_1a_period_code | string | |
pos_inpatient_maximum_1a_period_description | string | |
pos_inpatient_maximum_1a_period_label | string | |
pos_inpatient_maximum_1b_period_code | string | |
pos_inpatient_maximum_1b_period_description | string | |
pos_inpatient_maximum_1b_period_label | string | |
pos_inpatient_maximum_acute_amount | double | |
pos_inpatient_maximum_combined_amount | double | |
pos_inpatient_maximum_offered | boolean | |
pos_inpatient_maximum_period_code | string | |
pos_inpatient_maximum_period_description | string | |
pos_inpatient_maximum_period_label | string | |
pos_inpatient_maximum_psych_amount | double | |
pos_inpatient_maximum_type_code | string | |
pos_inpatient_maximum_type_label | string | |
pos_moop_amount | double | |
pos_moop_offered | boolean | |
pos_moop_period_code | string | |
pos_moop_period_description | string | |
pos_moop_period_label | string | |
pos_plan_maximum_amount | double | |
pos_plan_maximum_benefit_types_code | string | |
pos_plan_maximum_benefit_types_label | string | |
pos_plan_maximum_category_list_legacy | string | |
pos_plan_maximum_category_list_mc | string | |
pos_plan_maximum_category_list_nmc | string | |
pos_plan_maximum_offered | boolean | |
pos_plan_maximum_period_code | string | |
pos_plan_maximum_period_description | string | |
pos_plan_maximum_period_label | string | |
section_c_plan_benefit_types_code | string | |
section_c_plan_benefit_types_label | string | |
section_c_plan_category_list_legacy | string | |
section_c_plan_category_list_mc | string | |
section_c_plan_category_list_nmc | string | |
section_c_plan_group_count | double | |
section_c_plan_level_policy | string | |
section_c_plan_level_source_status | string | |
section_c_sub_benefit | varchar(30) | 100% NULL in this view. Reserved sub-benefit label; never populated. |
visitor_travel_benefit_type_code | string | |
visitor_travel_benefit_type_label | string | |
visitor_travel_geographic_area_code | string | |
visitor_travel_geographic_area_label | string | |
visitor_travel_offered | boolean | |
source_pbp_section | varchar(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_table | varchar(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_authorities | string | Constant 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_url | string | CMS 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_hash | string | SHA-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")
| 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_semantic.vw_pbp_section_c_pos_oon") |
| Raw door | Athena (read-only via query_substrate): medicare_semantic.vw_pbp_section_c_pos_oon |
| Note | Cleaned 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