# MA pbp section c oon

`medicare_silver.pbp_section_c_oon` · Medicare Advantage, Part D, Medicaid · status partial

Section C OON: Out-of-network cost-share detail. Coverage: All years (plans with OON only).

**Grain.** One row per OON benefit cost-share group per plan per CMS snapshot. The MINIMAL verified-unique key is contract_id + plan_id + segment_id + pbp_c_oon_outpt_group_num_id + report_year + quarter (658,957 distinct = exactly the full row_count). version is functionally determined by these (adding it does not change the distinct count) because within any one (report_year, quarter) a given plan has exactly one version. A plan typically has SEVERAL group rows (group_num_id 1..196), each a distinct OON cost-share bundle (e.g. a 30% group, a Dental group, an Ambulance group).

**How to use it.** Get the 2024 out-of-network member cost-share for each PPO plan, de-duplicated across the quarterly republications: SELECT contract_id, plan_id, segment_id, pbp_c_oon_outpt_group_num_id, pbp_c_oon_outpt_grp_lbl, pbp_c_oon_outpt_coins_max_pct, pbp_c_oon_outpt_copay_max_amt FROM pbp_section_c_oon WHERE report_year=2024 AND quarter=(SELECT max(quarter) FROM pbp_section_c_oon WHERE report_year=2024) AND pbp_a_plan_type IN ('04','31') -- Local/Regional PPO. This answers 'what does a member pay out of network for outpatient services in each PPO plan', one row per OON cost-share group, without quarter-driven double counting.

**Traps.**
- QUARTER IS A REPUBLICATION SNAPSHOT, NOT A KEY YOU CAN SUM OVER. For 2018-2020 the same annual bid was republished in Q1-Q4 with ~identical values (of 13,082 multi-quarter plan+group keys in 2020, only 13 had any coinsurance change). A query like WHERE report_year=2020 without pinning one quarter double/triple-counts every plan. Pick a single quarter (e.g. the max quarter per plan-year), or dedup on the 6-col grain minus quarter, before aggregating. Note row counts per year reflect this: 2026 is huge (192K) because it has many bid VERSIONS in Q1, while 2018-2020 are inflated by 4x quarterly republication.
- version IS in the grain via year+quarter but is a RED HERRING as a standalone dedup axis. Within one (report_year, quarter) each plan has exactly ONE version, and different versions hold different plans — version is the CMS bid-submission counter, not competing snapshots of one plan. Do NOT filter to 'version=latest' to dedup a plan; that would drop most plans entirely.
- Many money/flag columns are NULL-because-not-applicable, not missing data. ded_amt is null unless ded_yn='1' (only 1,637 rows). maxplan_amt/maxplan_per are null unless maxplan_yn='1' (34K rows, mostly supplemental benefits). The entire cs_* family and cost_share/coins_cov are ~99% null — they exist only for a tiny set of plans with secondary/tiered structures. coins_*pct is null where coins_yn!='1', copay_*amt null where copay_yn!='1'. Always gate on the matching _yn flag before reading the amount.
- bid_id is 100% derivable (contract_id||'_'||plan_id||'_'||segment_id) and observed_period/effective_period_start/effective_period_end are 100% derivable from report_year — none add information; do not treat them as independent dimensions or join keys.
- This is the OUT-OF-NETWORK table (PPO/PFFS only). Sibling tables in medicare_silver are pbp_section_c (main Section C / in-network outpatient benefits) and pbp_section_c_pos (point-of-service). To compare in- vs out-of-network member cost you must join this to pbp_section_c on contract_id+plan_id+segment_id+report_year(+quarter). HMOs (plan_type 01) are nearly absent here because they generally cover no out-of-network outpatient benefit.
- Benefit applicability lives in semicolon-delimited code LISTS (pbp_c_oon_out_mc_bendesc_cats for Medicare-covered, _nmc_ for supplemental), using the CMS PBP benefit-category code system (e.g. 10a1=ambulance, 15=Part B drugs, 17a=eye exam). You cannot filter to 'ambulance OON cost' by a single column — you must string-match the category code within these list fields. grp_lbl is free text (plan-chosen, e.g. '30%', 'Dental') and is not a reliable controlled vocabulary.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS MA contract ID (e.g. H0088). 492 distinct. Part of grain. Join key to plan/enrollment/Stars tables. |
| plan_id | string | Plan ID within the contract (3-char, e.g. '001'). 655 distinct values overall (not unique alone). Part of grain. |
| segment_id | string | Plan segment ('0' for non-segmented; up to 25 distinct). Part of grain. Most plans are segment '0'. |
| pbp_c_oon_outpt_group_num_id | string | Sequence number (string '1'..'196', 122 distinct) of the OON outpatient cost-share group within the plan. THIS is what makes a plan have many rows. Part of grain. Not globally meaningful — only orders groups inside one plan. |
| pbp_c_oon_outpt_bendesc_cats | string | Benefit-description category field; observed empty-string '' or null in nearly all rows — effectively unused/legacy. Real category content lives in the mc/nmc variants below. |
| version | double | CMS bid/submission version for that plan-year (double, 1..26). Functionally determined by the grain (one version per plan per year+quarter), so NOT needed in the key. Higher versions = later bid submissions; row counts taper off at high versions. Different versions within a (year,quarter) hold DIFFERENT plans, not competing snapshots of the same plan. |
| report_year | double | Benefit/contract year (double, 2007-2026). Maps 1:1 to effective_period_start/end. The primary time dimension. Part of grain. |
| quarter | double | CMS release quarter (double, 1-4). Part of grain BUT a republication-snapshot axis: 2018-2020 republished the same annual bid in Q1-Q4 (data is ~identical across quarters); 2007-2017 and 2021+ are largely Q1-only. See gotchas — summing across quarters double/quadruple-counts plans. |
| bid_id | string | Composite ID, 100% equal to contract_id//'_'//plan_id//'_'//segment_id (verified on all 658,957 rows). Fully redundant convenience key, carries no new information. |
| orgtype | string | CMS organization type code (string). 01=Local CCP dominates (608K); 11=Regional PPO area, 04=PFFS, plus rare 05/14. Correlates with pbp_a_plan_type. |
| pbp_a_ben_cov | string | Benefit-coverage scope flag from Section A. '1' = original-Medicare-covered scope (652K), '2' = supplemental/other (7K). |
| pbp_a_plan_type | string | MA plan type code. 04=Local PPO (605K), 31=Regional PPO (30K), 09=PFFS (21K), 01=HMO (rare, 2.7K), etc. These are exactly the plan types that allow out-of-network use — HMOs barely appear because they generally have no OON benefit. |
| pbp_c_oon_out_mc_bendesc_cats | string | Semicolon-delimited list of Medicare-covered PBP benefit-category codes this OON group applies to (e.g. '10a1;10a2'=ambulance, '15'=Part B drugs, '17a'=eye exam, '3-1..8b'=outpatient hospital/surgery). The benefit map for the group. |
| pbp_c_oon_out_nmc_bendesc_cats | string | Same code system but for NON-Medicare-covered (supplemental) benefit categories the group covers (e.g. '9d_2','13c','14b'). Often null when the group is Medicare-covered only. |
| pbp_c_oon_outpt_bendesc_ben | string | Benefit-type code for the group: '01' (Medicare-covered, 377K) most common, '10'/'11' (supplemental/optional benefit) next; ~42K null. Distinguishes a Medicare-covered OON group from a supplemental one. |
| pbp_c_oon_outpt_coins_cov | string | Coinsurance-coverage qualifier code (string, ~98% null). Rare values 1,2,3,6 indicate special coverage handling; usually irrelevant. |
| pbp_c_oon_outpt_coins_max_pct | double |  |
| pbp_c_oon_outpt_coins_min_pct | double |  |
| pbp_c_oon_outpt_coins_yn | string | Does this OON group charge coinsurance? '1'=Yes (338K), '2'=No (307K), null (14K). CMS Y/N convention 1=Yes 2=No. |
| pbp_c_oon_outpt_copay_max_amt | double |  |
| pbp_c_oon_outpt_copay_min_amt | double |  |
| pbp_c_oon_outpt_copay_yn | string | Does this OON group charge a flat copay? '2'=No (354K) is most common, '1'=Yes (291K), null (14K). |
| pbp_c_oon_outpt_cost_share | string | Cost-share structure type code (string, ~95% null). Sparse values 1/2/3 flag plans with a special/secondary cost-share arrangement; usually null. |
| pbp_c_oon_outpt_cs_coins_max | double |  |
| pbp_c_oon_outpt_cs_coins_min | double |  |
| pbp_c_oon_outpt_cs_coins_yn | string |  |
| pbp_c_oon_outpt_cs_copay_max | double |  |
| pbp_c_oon_outpt_cs_copay_min | double |  |
| pbp_c_oon_outpt_cs_copay_yn | string |  |
| pbp_c_oon_outpt_ded_amt | double | OON deductible amount (double, $0-$5,000, median $500) — meaningful only on the ~1,637 rows where ded_yn='1', else null. |
| pbp_c_oon_outpt_ded_yn | string | Does an OON deductible apply to this group? Overwhelmingly '2'=No (643K); '1'=Yes only 1,637 rows; null 14K. OON deductibles are rare at the group level. |
| pbp_c_oon_outpt_grp_lbl | string | Plan's free-text label for the cost-share group (e.g. '30%', '$0 copay', 'Dental', 'Ambulance', 'Group 1', 'OTC', 'Fitness'). Heterogeneous, ~17% null. Human-readable name, not a controlled code. |
| pbp_c_oon_outpt_maxplan_amt | double | Maximum plan benefit / coverage cap dollar amount (double, $0-$7,500, median ~$74) — meaningful only on the 34K rows where maxplan_yn='1' (typically supplemental benefits like OTC, dental, hearing-aid allowances). |
| pbp_c_oon_outpt_maxplan_per | string | Period code for the maximum (string 1-7; 5 and 3 most common). ~97% null — only set when maxplan_yn='1'. Encodes per-year/per-visit/etc. cadence of the cap. |
| pbp_c_oon_outpt_maxplan_per_d | string | Free-text/description companion to maxplan_per (period detail). Mostly null; populated alongside the per code. |
| pbp_c_oon_outpt_maxplan_yn | string | Is there a benefit maximum (plan coverage cap) on this OON group? '2'=No (420K), null (205K), '1'=Yes (34K). When null, no max concept applies to that benefit type. |
| observed_period | date | Date = effective_period_start on 100% of rows (always Jan 1 of report_year). Redundant date encoding of report_year. |
| asserted_at | date | Pipeline ingestion/parse-batch date (only 2 values: 2026-05-16 and 2026-05-20). NOT a business date — when Vlada loaded this silver table, used for lineage. |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int | Integer lineage stamp ordering CMS source vintages within the pipeline (e.g. 2). Provenance, not a business field. |
| parse_revision | int | Integer parser-revision number for the Vlada extraction (e.g. 2). Provenance/QA, not business data. |
| parser_artifact_hash | string | SHA-256 of the parser artifact that produced the row. Reproducibility/lineage. |
| source_url | string | The CMS source ZIP this row came from (e.g. https://www.cms.gov/files/zip/pbp-benefits-2020-quarter-2.zip). Direct provenance to the official file. |
| sha256_content_hash | string | SHA-256 content hash of the source payload for integrity verification. Lineage/dedup. |
| pbp_c_oon_outpt_coins_min_pct / pbp_c_oon_outpt_coins_max_pct |  | OON coinsurance percentage the member pays (double, 0-100). Median max ~32%. min=max for a fixed rate; they differ when the group spans a range. Populated only where coins_yn='1'. |
| pbp_c_oon_outpt_copay_min_amt / pbp_c_oon_outpt_copay_max_amt |  | OON copay dollar amount the member pays (double, $0-$5,000). Median max ~$41. Populated where copay_yn='1'. min=max for a fixed copay. |
| pbp_c_oon_outpt_cs_coins_yn / cs_coins_min / cs_coins_max |  | Secondary/tiered coinsurance sub-structure (the 'cs_' prefix). ~99.8% null — populated on only ~1,300 rows that have a layered cost-share. Ignore unless cost_share is set. |
| pbp_c_oon_outpt_cs_copay_yn / cs_copay_min / cs_copay_max |  | Secondary/tiered copay sub-structure. Also ~99.8% null. Same caveat as cs_coins_*. |
| effective_period_start / effective_period_end |  | Benefit-year boundaries, always Jan 1 - Dec 31 of report_year. Derived 1:1 from report_year; carry no extra information. |

Tools that read it: get_pbp_benefit

Query it: `query_substrate` with `SELECT ... FROM medicare_silver.pbp_section_c_oon WHERE ... LIMIT 100`; read `describe_data_source("medicare_silver.pbp_section_c_oon")` first.
