# MA pbp section b4 emerg urgent

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

Section B4: Emergency / urgent care cost-share. Coverage: All years.

**Grain.** One row per Medicare Advantage benefit package per CMS quarterly PBP release: contract_id x plan_id x segment_id x effective_period_start (plan year) x quarter. Verified exact = 201,488 rows. The same plan-year can appear up to 4 times (one row per quarterly PBP-PUF republication, 2018-2024); pre-2018 plan-years appear once (Q1 only).

**How to use it.** "What does Aetna plan H0028-004 charge for an ER visit vs urgent care in 2026?" -> SELECT pbp_b4a_copay_amt_mc_min AS er_copay, pbp_b4a_coins_pct_mc_min AS er_coins_pct, pbp_b4b_copay_amt_mc_min AS urgent_copay FROM medicare_silver.pbp_section_b4_emerg_urgent WHERE contract_id='H0028' AND plan_id='004' AND segment_id='0' AND report_year=2026 AND quarter=1; -- ALWAYS pin quarter (or pick MAX(quarter) per year) so a plan-year published in 4 quarterly releases is not counted up to 4x.

**Traps.**
- GRAIN NEEDS quarter, not just the plan key. The natural CMS key (contract_id, plan_id, segment_id, year) yields only 114,175 rows — but the table has 201,488 because 2018-2024 plan-years are re-published in up to 4 quarterly PBP-PUF releases (each a separate row, slightly different). You MUST include quarter (or filter to one quarter) to avoid double/quadruple-counting a plan. Pre-2018 years are Q1-only.
- The profiler's 'verified unique' key is a bloated SUPERSET — it padded the real key with arbitrary wwc_maxplan benefit columns. The TRUE minimal grain is just contract_id x plan_id x segment_id x effective_period_start x quarter (= 201,488, verified exact). report_year is interchangeable with effective_period_start (same year).
- bid_id looks like a clean composite key but is NULL for every 2001-2006 row (8,316 rows) and only matches contract_id_plan_id_segment_id for the rest. Never use bid_id alone as the grain — it under-counts the early years.
- segment_id is inconsistent: non-segmented plans are '0' in modern years but an EMPTY STRING '' in older years (5,074 rows). Joins keyed on segment_id must normalize '' <-> '0'.
- cms_vintage_sequence is a load-batch artifact, NOT a reliable quarter indicator (2021-Q1=seq 4, 2022-Q1=seq 2). Use the quarter column (or parse source_url) for the quarter; per grain key there is exactly one vintage so no is_current/dedup filter is needed — every row is already the single authoritative version.
- NULL in the _yn flag columns is meaningful = 'benefit/question not applicable for that plan-year' (distinct from 2='No'). The whole B4C (worldwide) block is mostly NULL because foreign-travel emergency coverage is a supplemental benefit most plans/years don't offer; treating NULL as $0 cost-sharing would be wrong.
- _yn / _yesno columns use CMS convention 1=Yes, 2=No (NOT boolean). copay/coins/deductible dollar columns are only populated when the corresponding _yn='1'; min and max variants (e.g. copay_amt_mc_min/max) capture a range when a plan varies cost sharing across the service area.
- pbp_b4a_max_visit (med 90, range 75-120) is a copay-WAIVER DAY THRESHOLD (e.g. ER copay waived if admitted), not a count of allowed visits — do not interpret as visit limits.

| column | type | meaning |
|---|---|---|
| contract_id | string | Medicare Advantage contract ID (e.g. 'H0028'). 1,972 distinct. Part of the plan key; one contract holds many plans. Joins to other PBP/Stars/enrollment tables. |
| plan_id | string | Plan ID within the contract (3-char, e.g. '001','801'; 656 distinct). The (contract_id, plan_id, segment_id) triple identifies a unique benefit package. |
| segment_id | string | Plan segment (service-area split). '0' = non-segmented (181,424 rows / ~90%); empty-string '' is used in older years instead of '0' (5,074 rows); '1'-'8' for segmented plans. GOTCHA: '' vs '0' inconsistency breaks naive joins. |
| version | double | CMS PBP software/bid version number for the plan (double, e.g. 1.0, 3.0, 6.0). Plan-submission version, not a row-dedup field. Does NOT participate in the grain. |
| report_year | double | Contract/benefit year as a double (2001.0-2026.0). Equals the year of effective_period_start. The plan year the benefits apply to. |
| quarter | double | Which CMS quarterly PBP-PUF release this row came from (1.0-4.0). PART OF THE GRAIN: 2018-2024 plan-years are re-published each quarter (separate row per quarter, slightly different counts as plans update mid-year). Pre-2018 years are Q1-only. Maps 1:1 to source_url quarter. |
| bid_id | string | Composite plan-bid identifier = contract_id_plan_id_segment_id (e.g. 'H0028_001_0'). GOTCHA: NULL for all 2001-2006 rows (8,316 rows) — introduced later; do not use as a standalone key. |
| orgtype | string | CMS organization-type code (string). '01'=Local CCP/HMO-PPO (177,737, dominant), '08'=Regional PPO, '04'=PFFS, '11'=MSA, '06'=PSO/cost, '05','02','14'. Identifies the MA plan organizational structure. |
| pbp_a_ben_cov | string | Benefit-coverage indicator carried from PBP Section A. '1'=standard Original-Medicare benefits covered (196,773), '2'=alternative (4,373), NULL (342). Header context flag for the whole package. |
| pbp_a_plan_type | string | CMS plan-type code (string). '01'=HMO (101,510), '04'=Local PPO (55,909), '02'=HMOPOS (20,097), '20'=Regional PPO, '09'=PFFS, '31'=MSA, '18','48'. The marketed plan type. |
| pbp_b4a_bendec_emg | string |  |
| pbp_b4a_bendec_yesno | string |  |
| pbp_b4a_bendesc_amo | string |  |
| pbp_b4a_bendesc_emg | string |  |
| pbp_b4a_bendesc_yn | string |  |
| pbp_b4a_coins_cov_mc | string |  |
| pbp_b4a_coins_cov_mcia | string |  |
| pbp_b4a_coins_cov_mcww | string |  |
| pbp_b4a_coins_cov_ww | string |  |
| pbp_b4a_coins_pct_mc_in | double |  |
| pbp_b4a_coins_pct_mc_max | double |  |
| pbp_b4a_coins_pct_mc_min | double |  |
| pbp_b4a_coins_pct_mc_out | double |  |
| pbp_b4a_coins_pct_ww | double |  |
| pbp_b4a_coins_wavd_dh | double |  |
| pbp_b4a_coins_wavdia_dh | string |  |
| pbp_b4a_coins_wavdia_yn | string |  |
| pbp_b4a_coins_wavdww_yn | string |  |
| pbp_b4a_coins_yesno | string |  |
| pbp_b4a_coins_yn | string |  |
| pbp_b4a_copay_amt_mc_max | double |  |
| pbp_b4a_copay_amt_mc_min | double |  |
| pbp_b4a_copay_amt_ww | double |  |
| pbp_b4a_copay_mciaamt | double |  |
| pbp_b4a_copay_mcoa_amt | double |  |
| pbp_b4a_copay_mcww_amt | double |  |
| pbp_b4a_copay_wavd_dh | double |  |
| pbp_b4a_copay_wavdia_mi_dh | string |  |
| pbp_b4a_copay_wavdia_yn | string |  |
| pbp_b4a_copay_wavdww_yn | string |  |
| pbp_b4a_copay_yesno | string |  |
| pbp_b4a_copay_yn | string |  |
| pbp_b4a_ded_amt | double |  |
| pbp_b4a_ded_er_cstshrs | string |  |
| pbp_b4a_ded_er_cstshrs_yn | string |  |
| pbp_b4a_ded_yn | string |  |
| pbp_b4a_deduct_yn | string |  |
| pbp_b4a_max_visit | double |  |
| pbp_b4a_maxenr_amt | double |  |
| pbp_b4a_maxenr_per | string |  |
| pbp_b4a_maxenr_per_d | string |  |
| pbp_b4a_maxenr_yesno | string |  |
| pbp_b4a_maxenr_yn | string |  |
| pbp_b4a_refer_yn | string |  |
| pbp_b4a_wwc_maxplan_amt | double |  |
| pbp_b4a_wwc_maxplan_cov | string |  |
| pbp_b4a_wwc_maxplan_per | string |  |
| pbp_b4a_wwc_maxplan_yn | string |  |
| pbp_b4b_bendec_urg | string |  |
| pbp_b4b_bendec_yesno | string |  |
| pbp_b4b_bendesc_amo | string |  |
| pbp_b4b_bendesc_urg | string |  |
| pbp_b4b_bendesc_yn | string |  |
| pbp_b4b_coins_cov_mc_min | string |  |
| pbp_b4b_coins_cov_mc_ww | string |  |
| pbp_b4b_coins_cov_mcmin | string |  |
| pbp_b4b_coins_cov_mcww | string |  |
| pbp_b4b_coins_pct_mc_max | double |  |
| pbp_b4b_coins_pct_mc_min | double |  |
| pbp_b4b_coins_pct_ww | double |  |
| pbp_b4b_coins_wavd_mcdh | string |  |
| pbp_b4b_coins_wavdmc_dh | double |  |
| pbp_b4b_coins_wavdmc_yn | string |  |
| pbp_b4b_coins_wavdww_yn | string |  |
| pbp_b4b_coins_yesno | string |  |
| pbp_b4b_coins_yn | string |  |
| pbp_b4b_copay_amt_mc_max | double |  |
| pbp_b4b_copay_amt_mc_min | double |  |
| pbp_b4b_copay_amt_ww | double |  |
| pbp_b4b_copay_mciaamt | double |  |
| pbp_b4b_copay_mcoa_amt | double |  |
| pbp_b4b_copay_mcww_amt | double |  |
| pbp_b4b_copay_wavd_mcdh | string |  |
| pbp_b4b_copay_wavdia_yn | string |  |
| pbp_b4b_copay_wavdmc_dh | double |  |
| pbp_b4b_copay_wavdww_yn | string |  |
| pbp_b4b_copay_yesno | string |  |
| pbp_b4b_copay_yn | string |  |
| pbp_b4b_ded_amt | double |  |
| pbp_b4b_ded_yesno | string |  |
| pbp_b4b_ded_yn | string |  |
| pbp_b4b_deduct_yn | string |  |
| pbp_b4b_max_visit | double |  |
| pbp_b4b_maxenr_amt | double |  |
| pbp_b4b_maxenr_per | string |  |
| pbp_b4b_maxenr_per_d | string |  |
| pbp_b4b_maxenr_type | string |  |
| pbp_b4b_maxenr_yesno | string |  |
| pbp_b4b_maxenr_yn | string |  |
| pbp_b4b_refer_yn | string |  |
| pbp_b4c_bendesc_amo | string |  |
| pbp_b4c_bendesc_amo_wec | string |  |
| pbp_b4c_bendesc_amo_wet | string |  |
| pbp_b4c_bendesc_amo_wuc | string |  |
| pbp_b4c_bendesc_ehc | string |  |
| pbp_b4c_bendesc_yn | string |  |
| pbp_b4c_coins_ehc | string |  |
| pbp_b4c_coins_pct_max_ww | double |  |
| pbp_b4c_coins_pct_min_ww | double |  |
| pbp_b4c_coins_pct_wec_max | double |  |
| pbp_b4c_coins_pct_wec_min | double |  |
| pbp_b4c_coins_pct_wet_max | double |  |
| pbp_b4c_coins_pct_wet_min | double |  |
| pbp_b4c_coins_pct_wuc_max | double |  |
| pbp_b4c_coins_pct_wuc_min | double |  |
| pbp_b4c_coins_pct_ww | double |  |
| pbp_b4c_coins_wav_wec_yn | string |  |
| pbp_b4c_coins_wav_wet_yn | string |  |
| pbp_b4c_coins_wav_wuc_yn | string |  |
| pbp_b4c_coins_wavdww_yn | string |  |
| pbp_b4c_coins_yn | string |  |
| pbp_b4c_copay_amt_max_ww | double |  |
| pbp_b4c_copay_amt_min_ww | double |  |
| pbp_b4c_copay_amt_wec_max | double |  |
| pbp_b4c_copay_amt_wec_min | double |  |
| pbp_b4c_copay_amt_wet_max | double |  |
| pbp_b4c_copay_amt_wet_min | double |  |
| pbp_b4c_copay_amt_wuc_max | double |  |
| pbp_b4c_copay_amt_wuc_min | double |  |
| pbp_b4c_copay_amt_ww | double |  |
| pbp_b4c_copay_ehc | string |  |
| pbp_b4c_copay_wav_wec_yn | string |  |
| pbp_b4c_copay_wav_wet_yn | string |  |
| pbp_b4c_copay_wav_wuc_yn | string |  |
| pbp_b4c_copay_wavdww_yn | string |  |
| pbp_b4c_copay_yn | string |  |
| pbp_b4c_ded_amt | double |  |
| pbp_b4c_ded_yn | string |  |
| pbp_b4c_maxenr_amt | double |  |
| pbp_b4c_maxenr_per | string |  |
| pbp_b4c_maxenr_per_d | string |  |
| pbp_b4c_maxenr_yn | string |  |
| pbp_b4c_trns_yn | string |  |
| pbp_b4c_wwc_maxplan_amt | double |  |
| pbp_b4c_wwc_maxplan_per | string |  |
| pbp_b4c_wwc_maxplan_svcs_yn | string |  |
| pbp_b4c_wwc_maxplan_yn | string |  |
| pbp_b_4a_ded_amt | double |  |
| pbp_b_4a_ded_yesno | string |  |
| observed_period | date | Date (Jan-1) of the plan year the row was observed for. Equals effective_period_start in every row. Bitemporal 'as-of the data' dimension. |
| asserted_at | date | Date this row was loaded/asserted into the silver layer. Only 2 values: 2026-05-16 (Q1/single-quarter loads) and 2026-05-20 (multi-quarter backfill). A load-batch timestamp, NOT business time. |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int | Integer load-sequence (1-4). USUALLY tracks quarter-within-year but UNRELIABLY (e.g. 2021-Q1 has vintage_sequence=4, 2022-Q1 has 2). GOTCHA: do NOT use as a quarter proxy — use the quarter column. Per grain key there is exactly 1 vintage (no within-grain dedup needed). |
| parse_revision | int | Parser revision integer: 1 for single-quarter (pre-2018 + some) loads, 2 for multi-quarter loads. Provenance/lineage field. |
| parser_artifact_hash | string | SHA-256 of the parser code artifact that produced the row. Provenance — lets you tie a row to the exact extractor version. |
| source_url | string | CMS download URL of the source PBP-PUF zip. 40 distinct. Encodes year AND quarter (e.g. 'pbp-benefits-2023-quarter-1.zip' ... 'quarter-4.zip'; older years 'pbp-benefits-2016.zip'). Authoritative provenance for the quarter dimension. |
| sha256_content_hash | string | SHA-256 of the source file content. Provenance/integrity — identifies the exact source artifact ingested. |
| pbp_b4a_*  (subsection B4a = EMERGENCY CARE) |  | All ~45 pbp_b4a_ columns describe EMERGENCY-care cost sharing. Key fields: copay_amt_mc_min/max (Medicare-covered ER copay $; med $90, range $0-200), coins_pct_mc_min/max (ER coinsurance %; med 20%), coins_yn/copay_yn (1=Yes this plan uses it, 2=No, NULL=N/A), ded_amt (ER-specific deductible $, rare 655 rows), max_visit (copay-waiver day threshold, NOT a visit count; med 90, values 75-120), maxenr_amt/per (max enrollee out-of-pocket for ER), wavd_* (copay-waived-if-admitted flags), refer_yn (referral required), wwc_maxplan_* (worldwide max-plan coverage tie-in). |
| pbp_b4b_*  (subsection B4b = URGENTLY NEEDED SERVICES) |  | ~37 pbp_b4b_ columns describe URGENTLY-NEEDED-CARE cost sharing (urgent care, lower acuity than ER). Parallel structure to b4a: copay_amt_mc_min/max ($; med ~$30-40, lower than ER as expected), coins_pct_mc_min/max, coins_yn/copay_yn (1/2/NULL), ded_amt, maxenr_*, max_visit, refer_yn, wavd_* waiver flags. bendec_urg/bendesc_urg = benefit-declared/described text flags. |
| pbp_b4c_*  (subsection B4c = WORLDWIDE / FOREIGN-TRAVEL emergency & urgent) |  | ~40 pbp_b4c_ columns describe WORLDWIDE (outside-US) emergency+urgent coverage — a supplemental benefit. Suffixes: _ww=worldwide, _wec=worldwide emergency-care, _wet=worldwide emergency-transport, _wuc=worldwide urgent-care. copay_amt_min/max_ww (med $75), coins_pct, wwc_maxplan_amt (max plan $ for foreign coverage; med $50,000, up to $1M), trns_yn (transportation). GOTCHA: heavily NULL (~45-90k rows null) — many plans/years have no worldwide benefit. |
| pbp_b_4a_ded_amt / pbp_b_4a_ded_yesno |  | Legacy/alternate-named emergency-deductible columns (note the extra underscore 'b_4a'). Nearly always NULL; duplicate/legacy of pbp_b4a_ded_amt from older PBP schema versions. Prefer pbp_b4a_ded_amt. |
| effective_period_start / effective_period_end |  | Plan-year validity window — always Jan-1 to Dec-31 of report_year. THE primary business-time column (use effective_period_start for year filtering). Annual periodicity, 2001-2026. |

Tools that read it: get_pbp_benefit

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