Medicare Advantage, Part D, Medicaid

PBP emergency urgent (cleaned view)

medicare_semantic.vw_pbp_emergency_urgent·live·semantic_view·Hybrid annual-then-quarterly: report_year is the true benefit-year axis (2001 -> 2026). Through 2017 there is one annual filing (quarter is always 1). From 2018 onward CMS issues quarterly PBP refreshes, so quarter takes values 1-4 within a year (some year/quarter combos are missing, e.g. 2020 has no Q3, 2024 has no Q2 — these gaps are real source gaps, not dedup artifacts). Treat report_year as the period for trend analysis and (report_year, quarter) as the snapshot identity.
Rows
N/A
Columns
71
History
2001 (report_year 2001, single annual snapshot) to 2026 (report_year 2026, Q1)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A semantic, analysis-ready view of Medicare Advantage (Part C) enrollee cost-sharing for emergency and urgent-care benefits, derived from CMS Plan Benefit Package (PBP) Public Use Files sections B4A (emergency room) and B4B (urgently needed services).
  2. 2One view row tells you, for a given MA plan in a given year/quarter, what an enrollee pays out-of-pocket (copay dollar amount and/or coinsurance percent) for an ER visit or an urgent-care visit, plus the copay-waived-if-admitted rules.
  3. 3It is part of the Local Market Intelligence (LMI) Medicare benefit substrate used to benchmark plan generosity and member cost exposure.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarteremergency_urgent_sub_benefit
  1. 1One row per (MA plan-segment, report year, quarter, emergency-vs-urgent sub-benefit).
  2. 2Concretely: 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).
  3. 3There 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 read it

  1. 1To 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.
  2. 2This returns ~$127 median ER copay vs ~$35 median urgent-care copay (2026), and how many plans use coinsurance instead of a flat copay.
  3. 3Always pin report_year (and quarter for 2018+) and split by emergency_urgent_sub_benefit.
  4. 4To 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

  1. 1Grain 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.
  2. 2A 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.
  3. 3Many '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.
  4. 4has_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.
  5. 5'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).
  6. 6Type 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).

Columns (71)

ColumnTypeMeaning
contract_idstringCMS MA contract identifier (H/R/E/S-prefixed, e.g. H0084, E5088). 1,972 distinct. First component of the plan key.
plan_idstringPlan 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_idstringPlan 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.
versiondoublePBP 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_yeardoubleMA 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).
quarterdoubleIntra-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_categorystringConstant = 'emergency_urgent' for every row. A view-level tag identifying this slice of the PBP semantic layer; carries no per-row information.
cost_share_stringstringHuman-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_amountdoubleFlat-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_pctdoublePercent-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_textstringALWAYS 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_requiredbooleanALWAYS 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_requiredbooleanALWAYS NULL (0 non-null). Referral flag not applicable/captured for this benefit. Placeholder.
network_typevarchar(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_appliesbooleanALWAYS NULL (0 non-null). Whether the benefit counts toward the plan MOOP is not populated in this view. Placeholder.
limit_quantitydoubleALWAYS NULL (0 non-null). No visit/quantity caps modeled for emergency/urgent. Placeholder.
limit_unitstringALWAYS NULL (0 non-null). Companion to limit_quantity; unused here.
limit_period_codestringALWAYS NULL (0 non-null). Period code for a quantity limit; unused for this benefit.
limit_period_labelstringALWAYS NULL (0 non-null). Human label for limit_period_code; unused.
limit_quantity_per_yeardoubleALWAYS NULL (0 non-null). Annualized quantity limit; unused for this benefit.
benefit_amountdoubleALWAYS 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_kindstringALWAYS NULL (0 non-null). Placeholder; see benefit_amount.
benefit_amount_period_codestringALWAYS NULL (0 non-null). Placeholder.
benefit_amount_period_labelstringALWAYS NULL (0 non-null). Placeholder.
benefit_amount_annualizeddoubleALWAYS NULL (0 non-null). Placeholder.
benefit_amount_pmpmdoubleALWAYS NULL (0 non-null). Per-member-per-month benefit value; not applicable to a cost-share view. Placeholder.
normalization_statusstringALWAYS NULL (0 non-null). Numeric-normalization status field from the template; this view did not run amount normalization (annualization_policy='not_numeric'). Placeholder.
normalization_basisstringALWAYS NULL (0 non-null). Placeholder.
aggregation_policystringALWAYS NULL (0 non-null). Placeholder.
offered_statusvarchar(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_observabilityvarchar(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_reasonvarchar(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_policyvarchar(17)Constant = 'not_numeric'. No annualization was applied because there is no numeric benefit amount. Constant.
combined_limit_policyvarchar(29)Constant = 'none_detected'. No combined/shared limit across sub-benefits was detected. Constant.
consumer_document_reconciliation_statusvarchar(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_tiervarchar(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_amountdouble
coinsurance_pct_maxdoubleUpper 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_mindoubleLower bound of the coinsurance range; equals coinsurance_pct for single values. ~1,213 rows have min != max (true ranges).
coinsurance_waived_if_admittedbooleanBoolean: 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_windowdouble
coinsurance_waiver_admit_window_unitstring
coinsurance_waiver_days_per_yearstringSTRING (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_maxdoubleUpper bound of the copay when expressed as a range; equals copay_amount for single values. Populated only when copay_amount is populated.
copay_amount_mindoubleLower bound of the copay range; equals copay_amount for single values.
copay_waived_if_admittedbooleanBoolean: 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_windowdouble
copay_waiver_admit_window_unitstring
copay_waiver_days_per_yearstringSTRING 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_withindoubleDouble: 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_deductibleboolean
emergency_urgent_package_idstring
emergency_urgent_package_match_basisstring
emergency_urgent_package_namestring
emergency_urgent_package_type_codestring
emergency_urgent_package_type_labelstring
emergency_urgent_sub_benefitstringTHE 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_targetingstring
has_coinsurancebooleanBoolean convenience flag: plan charges coinsurance for this benefit. Can be NULL on the oldest rows where the flag set wasn't derivable.
has_copaybooleanBoolean 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_deductiblebooleanBoolean: 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_oopbooleanBoolean: a max enrollee out-of-pocket applies to this benefit. Almost always FALSE; a small number TRUE.
max_visits_per_periodstringSTRING 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_typestring
supplemental_benefit_type_codestring
worldwide_max_plan_benefit_ynboolean
source_pbp_sectionvarchar(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_tablevarchar(56)Constant = 'medicare_silver.pbp_section_b4_emerg_urgent'. The upstream silver table this view is built from; lineage pointer.
lmi_authoritiesstringConstant: 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_urlstringCMS 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_hashstringSHA-256 of the source release file content (40 distinct, 1:1 with source_url). Content-integrity / dedup fingerprint of the ingested PBP file.

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_emergency_urgent")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_emergency_urgent WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' AND emergency_urgent_sub_benefit = '<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_emergency_urgent")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_emergency_urgent
NoteCleaned PBP reasoning surface (categories/emergency_urgent/contract.yaml); raw is pbp_section_*.

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