# PBP emergency urgent (cleaned view)

`medicare_semantic.vw_pbp_emergency_urgent` · Medicare Advantage, Part D, Medicaid · status live

Cleaned source-faithful PBP emergency urgent rows: era-normalized, CMS codes decoded, with offered_status/numeric_amount_observability/null_amount_reason/annualization_policy/combined_limit_policy/confidence_tier. The agent reasoning surfac

**Grain.** One row per (MA plan-segment, report year, quarter, emergency-vs-urgent sub-benefit). Concretely: each distinct (contract_id, plan_id, segment_id, report_year, quarter) appears exactly twice — once for the emergency_room sub-benefit (from PBP section B4A) and once for urgent_care (from B4B). There are 201,488 such plan-period keys, each producing 2 rows = 402,976 total rows (verified: max rows per key = 1, zero duplicate keys). network_type and benefit_category are NOT part of the key — they are constants for the whole table.

**How to use it.** To compare ER vs urgent-care member cost exposure for current MA plans: SELECT emergency_urgent_sub_benefit, approx_percentile(copay_amount,0.5) AS median_copay, count_if(coinsurance_pct IS NOT NULL) AS plans_using_coinsurance FROM vw_pbp_emergency_urgent WHERE report_year = 2026 AND quarter = 1 GROUP BY emergency_urgent_sub_benefit. This returns ~$127 median ER copay vs ~$35 median urgent-care copay (2026), and how many plans use coinsurance instead of a flat copay. Always pin report_year (and quarter for 2018+) and split by emergency_urgent_sub_benefit. To look up one plan: filter contract_id, plan_id, segment_id, report_year, quarter and you get the two rows (ER and urgent care) with copay_amount/coinsurance_pct plus copay_waived_if_admitted.

**Traps.**
- Grain is per-sub-benefit, NOT per-plan: every (contract, plan, segment, year, quarter) yields TWO rows (emergency_room + urgent_care). Always filter emergency_urgent_sub_benefit (or source_pbp_section B4A/B4B) before reasoning about cost — otherwise you double-count plans and blend ~$127 ER copays with ~$35 urgent-care copays. 201,488 plan-period keys -> 402,976 rows.
- A large block of columns is 100% NULL placeholders inherited from a shared PBP template and must NOT be used here: auth_required, referral_required, max_oop_applies, the entire limit_* family (limit_text/quantity/unit/period_code/period_label/quantity_per_year), the entire benefit_amount_* family (incl. benefit_amount_pmpm/annualized), normalization_status, normalization_basis, aggregation_policy. The real payload is copay_amount, coinsurance_pct (+min/max), cost_share_string, the copay/coinsurance waiver fields, and the has_* flags.
- Many 'metadata' columns are single-value constants across all 402,976 rows and cannot be used as filters/dimensions: benefit_category='emergency_urgent', network_type='in_network', offered_status='offered', numeric_amount_observability='offered_without_numeric_amounts', null_amount_reason='unknown_requires_crosswalk', annualization_policy='not_numeric', combined_limit_policy='none_detected', consumer_document_reconciliation_status='not_checked', confidence_tier='source_faithful', source_silver_table, lmi_authorities. network_type='in_network' for ALL rows because emergency/urgent care is covered at in-network rates by law — there is no out-of-network cost-share dimension to query.
- has_deductible NULL carries meaning: it is NULL for every report_year <= 2016 (flag not derivable then) and only true/false from 2017+. Treat pre-2017 NULL as 'unknown', never as 'no deductible'. Similarly has_copay/has_coinsurance are NULL on the oldest rows (~22K) where the flag set could not be derived.
- 'version' looks like a snapshot key but is already collapsed: exactly one distinct version per plan-period key, so the view is pre-deduped to the winning filing iteration — do NOT add version to your grain or try to filter to a 'latest version'. There is no is_current column; snapshot identity is (report_year, quarter) and source_url/sha256 (40 distinct releases).
- Type traps in the waiver fields: copay_waiver_days_per_year, coinsurance_waiver_days_per_year, and max_visits_per_period are STRINGS holding float text like '24.0' (cast before arithmetic), whereas copay_waiver_max_visits_within is a proper double. segment_id has an empty-string '' value (10,148 rows) that is a real key value distinct from '0' — do not coalesce it to NULL. Time axis: the profiler tags 'quarter' as the time column but report_year is the real history (2001-2026); quarter is the intra-year refresh (always 1 pre-2018, 1-4 after, with some genuine missing year/quarter snapshots e.g. 2020-Q3, 2024-Q2).

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS MA contract identifier (H/R/E/S-prefixed, e.g. H0084, E5088). 1,972 distinct. First component of the plan key. |
| plan_id | string | Plan benefit package ID within the contract (zero-padded 3-char, e.g. '001','801'). 656 distinct values. Unique only in combination with contract_id (and segment_id). |
| segment_id | string | Plan segment (service-area sub-division). Mostly '0' (363K rows = single-segment plans). Note: empty string '' also occurs (10,148 rows) as a distinct value alongside '0','1','2'... — treat '' as its own key value, not as NULL. |
| version | double | PBP filing iteration that this row came from (double, 0-27; lower-numbered versions dominate). Snapshot/provenance metadata only — NOT part of the grain. There is exactly one distinct version per plan-period key; the view has already collapsed to the winning iteration, so you do NOT need to (and should not) filter or dedup on version. |
| report_year | double | MA benefit/contract year the cost-share applies to (double, 2001-2026). This is the primary time axis; row volume grows over time (~1.5K rows in 2001 to ~62K in 2023). |
| quarter | double | Intra-year PBP refresh quarter (double 1-4). Always 1 for years <=2017 (annual filings); 1-4 from 2018+ when CMS went quarterly. Part of the snapshot identity, not a fiscal quarter of cost. The profiler mislabels this as the 'time column' — report_year is the real history axis. |
| benefit_category | string | Constant = 'emergency_urgent' for every row. A view-level tag identifying this slice of the PBP semantic layer; carries no per-row information. |
| cost_share_string | string | Human-readable cost-share as parsed from the PBP, e.g. '$50.0 copay', '20.0%', '$0 copay'. NULL on ~35.6K rows where no structured cost-share was extracted. Convenience/display field; the machine-usable values live in copay_amount / coinsurance_pct. |
| copay_amount | double | Flat-dollar copay the enrollee pays for the visit (double). Populated when the plan uses a copay; NULL when the plan uses coinsurance instead (or neither). Economically distinct by sub-benefit: 2026 ER median ~ $127 (max $150), urgent_care median ~ $35 (max $65). |
| coinsurance_pct | double | Percent-of-cost coinsurance the enrollee pays (double, 0-50; median 20). Populated when the plan charges coinsurance instead of a flat copay; mutually-exclusive-ish with copay_amount (some plans have both). |
| limit_text | string | ALWAYS NULL in this table (0 non-null rows). Placeholder column inherited from the shared PBP semantic template; emergency/urgent benefits carry no quantity-limit text. Do not use. |
| auth_required | boolean | ALWAYS NULL (0 non-null). Prior-authorization flag is not captured for emergency/urgent benefits (CMS does not allow PA for emergencies). Schema-conformance placeholder. |
| referral_required | boolean | ALWAYS NULL (0 non-null). Referral flag not applicable/captured for this benefit. Placeholder. |
| network_type | varchar(10) | Constant = 'in_network' for every row. Emergency/urgent care is covered at the in-network level by law regardless of where rendered, so there is no out-of-network split here. Not a usable filter. |
| max_oop_applies | boolean | ALWAYS NULL (0 non-null). Whether the benefit counts toward the plan MOOP is not populated in this view. Placeholder. |
| limit_quantity | double | ALWAYS NULL (0 non-null). No visit/quantity caps modeled for emergency/urgent. Placeholder. |
| limit_unit | string | ALWAYS NULL (0 non-null). Companion to limit_quantity; unused here. |
| limit_period_code | string | ALWAYS NULL (0 non-null). Period code for a quantity limit; unused for this benefit. |
| limit_period_label | string | ALWAYS NULL (0 non-null). Human label for limit_period_code; unused. |
| limit_quantity_per_year | double | ALWAYS NULL (0 non-null). Annualized quantity limit; unused for this benefit. |
| benefit_amount | double | ALWAYS NULL (0 non-null). This view models enrollee cost-SHARE (what the member pays), not a plan benefit allowance, so the benefit_amount family is empty. Placeholder from the template. |
| benefit_amount_kind | string | ALWAYS NULL (0 non-null). Placeholder; see benefit_amount. |
| benefit_amount_period_code | string | ALWAYS NULL (0 non-null). Placeholder. |
| benefit_amount_period_label | string | ALWAYS NULL (0 non-null). Placeholder. |
| benefit_amount_annualized | double | ALWAYS NULL (0 non-null). Placeholder. |
| benefit_amount_pmpm | double | ALWAYS NULL (0 non-null). Per-member-per-month benefit value; not applicable to a cost-share view. Placeholder. |
| normalization_status | string | ALWAYS NULL (0 non-null). Numeric-normalization status field from the template; this view did not run amount normalization (annualization_policy='not_numeric'). Placeholder. |
| normalization_basis | string | ALWAYS NULL (0 non-null). Placeholder. |
| aggregation_policy | string | ALWAYS NULL (0 non-null). Placeholder. |
| offered_status | varchar(15) | Constant = 'offered' for every row. Every row represents a benefit the plan offers; there are no 'not_offered' rows in this view. |
| numeric_amount_observability | varchar(31) | Constant = 'offered_without_numeric_amounts'. A provenance tag meaning: the benefit is offered and cost-share copay/coinsurance are captured, but no normalized numeric benefit allowance exists (consistent with the empty benefit_amount family). |
| null_amount_reason | varchar(30) | Constant = 'unknown_requires_crosswalk'. Explains why the benefit_amount fields are null (would need an external crosswalk to value). Constant, so informational only. |
| annualization_policy | varchar(17) | Constant = 'not_numeric'. No annualization was applied because there is no numeric benefit amount. Constant. |
| combined_limit_policy | varchar(29) | Constant = 'none_detected'. No combined/shared limit across sub-benefits was detected. Constant. |
| consumer_document_reconciliation_status | varchar(11) | Constant = 'not_checked'. These rows have not been reconciled against consumer-facing plan documents (EOC/SB). Constant — signals the cost-share is source-faithful to the PBP, not independently verified. |
| confidence_tier | varchar(23) | Constant = 'source_faithful'. Data is faithfully reproduced from the CMS PBP source (the highest-fidelity tier here); no inference/imputation applied. Constant. |
| coinsurance_max_per_visit_amount | double |  |
| coinsurance_pct_max | double | Upper bound of the coinsurance percent when the source expresses a range; equals coinsurance_pct when it is a single value. Populated only when coinsurance_pct is populated. |
| coinsurance_pct_min | double | Lower bound of the coinsurance range; equals coinsurance_pct for single values. ~1,213 rows have min != max (true ranges). |
| coinsurance_waived_if_admitted | boolean | Boolean: the coinsurance is waived if the ER visit results in inpatient admission. Populated only on coinsurance rows; NULL on copay-only rows. |
| coinsurance_waiver_admit_window | double |  |
| coinsurance_waiver_admit_window_unit | string |  |
| coinsurance_waiver_days_per_year | string | STRING (not numeric) holding the number of days within which admission waives the coinsurance, e.g. '24.0'. Populated on ~80,241 rows. Note the float-in-string typing — cast if used numerically. |
| copay_amount_max | double | Upper bound of the copay when expressed as a range; equals copay_amount for single values. Populated only when copay_amount is populated. |
| copay_amount_min | double | Lower bound of the copay range; equals copay_amount for single values. |
| copay_waived_if_admitted | boolean | Boolean: the ER copay is waived if the visit leads to inpatient admission (a common MA provision). TRUE on the majority of copay rows; NULL on coinsurance-only rows; FALSE where the plan does not waive. |
| copay_waiver_admit_window | double |  |
| copay_waiver_admit_window_unit | string |  |
| copay_waiver_days_per_year | string | STRING holding the days-window for the copay waiver, e.g. '24.0','0.0','72.0'. NULL where not applicable. Float-in-string — cast for arithmetic. |
| copay_waiver_max_visits_within | double | Double: max number of visits within the waiver window for which the copay is waived (commonly 1.0 or 2.0). Populated alongside the copay waiver fields. |
| counts_toward_plan_deductible | boolean |  |
| emergency_urgent_package_id | string |  |
| emergency_urgent_package_match_basis | string |  |
| emergency_urgent_package_name | string |  |
| emergency_urgent_package_type_code | string |  |
| emergency_urgent_package_type_label | string |  |
| emergency_urgent_sub_benefit | string | THE row discriminator: 'emergency_room' (from PBP B4A) or 'urgent_care' (from B4B). Exactly splits the table 201,488 / 201,488. Always filter on this to separate ER cost-share from urgent-care cost-share; deterministically 1:1 with source_pbp_section. |
| emergency_urgent_targeting | string |  |
| has_coinsurance | boolean | Boolean convenience flag: plan charges coinsurance for this benefit. Can be NULL on the oldest rows where the flag set wasn't derivable. |
| has_copay | boolean | Boolean convenience flag: plan charges a flat copay. ~195K rows are copay-only (has_copay=true, has_coinsurance=false). NULL on the ~22K oldest rows where flags weren't derivable. |
| has_deductible | boolean | Boolean: a deductible applies to this benefit. NULL-MEANS-SOMETHING: it is NULL for ALL years <=2016 (the deductible flag was not tracked/extractable then) and only populated true/false from report_year 2017 onward. Do not interpret a pre-2017 NULL as 'no deductible'. |
| has_max_enrollee_oop | boolean | Boolean: a max enrollee out-of-pocket applies to this benefit. Almost always FALSE; a small number TRUE. |
| max_visits_per_period | string | STRING holding a visit cap per period where one exists (float-in-string). Populated on ~78,013 rows; NULL otherwise. Distinct from the (always-null) limit_quantity family. |
| supplemental_benefit_type | string |  |
| supplemental_benefit_type_code | string |  |
| worldwide_max_plan_benefit_yn | boolean |  |
| source_pbp_section | varchar(3) | CMS PBP section the row came from: 'B4A' (=emergency_room) or 'B4B' (=urgent_care). Deterministically redundant with emergency_urgent_sub_benefit (1:1). 3-char varchar. |
| source_silver_table | varchar(56) | Constant = 'medicare_silver.pbp_section_b4_emerg_urgent'. The upstream silver table this view is built from; lineage pointer. |
| lmi_authorities | string | Constant: pipe-delimited LMI authority document URLs (CY2026 PBP Service Category Descriptions PDF + Part C Bid Review Memorandum) used to define/validate this benefit category. Provenance/citation, identical on every row. |
| source_url | string | CMS PBP PUF download URL for the year's release (e.g. .../pbp-benefits-2012.zip). 40 distinct URLs = 40 distinct source releases (one per year/quarter snapshot). Provenance of the raw file. |
| sha256_content_hash | string | SHA-256 of the source release file content (40 distinct, 1:1 with source_url). Content-integrity / dedup fingerprint of the ingested PBP file. |

Tools that read it: get_pbp_benefit

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