Medicare Advantage, Part D, Medicaid

MA pbp section b6 home health

medicare_silver.pbp_section_b6_home_health·partial·silver·quarterly·Medicare Advantage Plan Benefit Packages (PBP)
Rows
N/A
Columns
165
History
2001 to 2026
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1CMS Medicare Advantage Plan Benefit Package (PBP) Section B-6: the home-health cost-sharing and access rules each MA / MA-PD plan files with CMS.
  2. 2One row states, for a given plan-year snapshot, whether home-health visits carry a copay/coinsurance/deductible (and the dollar/percent amounts), whether prior auth or referral is required, any benefit caps, and any added non-Medicare-covered in-home services.
  3. 3It is the authoritative cost-sharing benchmark for Medicare Advantage home-health benefits.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per Medicare Advantage plan segment per CMS quarterly PBP snapshot of a plan year — i.e. one row per (contract_id, plan_id, segment_id, report_year, quarter).
  2. 2Verified unique: 201,488 distinct = 201,488 total rows. report_year is the year the benefits are in effect (= year(observed_period) = year(effective_period_start)); quarter is which CMS quarterly release of that plan year the row came from.
  3. 3Because 2018+ plan-years are re-published up to 4 times a year, the SAME plan-year benefit appears once per published quarter — so the table is NOT one-row-per-plan-per-year; you must pick a quarter (or dedup on it) to get plan-year grain.

How to read it

  1. 1To benchmark Medicare Advantage home-health cost-sharing for the latest plan year, pin to one snapshot per plan and read the master flags + mc amounts.
  2. 2Example: SELECT contract_id, plan_id, segment_id, pbp_a_plan_type, pbp_b6_auth_yn, pbp_b6_copay_yn, pbp_b6_copay_mc_amt_min, pbp_b6_copay_mc_amt_max, pbp_b6_coins_yn, pbp_b6_coins_pct_mc FROM medicare_silver.pbp_section_b6_home_health WHERE report_year = 2026 AND quarter = 1 — answers 'which MA plans require prior auth for home health, and what copay/coinsurance do they charge?' To trend over time, GROUP BY report_year using a single quarter per year (e.g. quarter = 1, or MAX(quarter)) to avoid quarterly double-counting.

Traps

  1. 1NOT one-row-per-plan-per-year. quarter is part of the grain: 2001-2017 publish Q1 only, but 2018+ publish up to 4 quarterly snapshots of the SAME plan-year (e.g. 2023 has Q1-Q4). Naively counting rows or joining without pinning quarter double/quadruple-counts recent plan-years. For a per-plan-year view, filter to one quarter (e.g. MAX(quarter) per report_year) or to quarter=1.
  2. 2There is NO is_current column and no within-grain dedup is needed — each (contract,plan,segment,report_year,quarter) has exactly one row / one cms_vintage_sequence (verified 0 multi-vintage groups). cms_vintage_sequence (1-4) and parse_revision are provenance/ingest-batch markers, NOT version flags to filter on; asserted_at (only 2026-05-16 / 2026-05-20) is the lake LOAD date, not a benefit date.
  3. 3bid_id LOOKS like a primary key but is not: it is the derived concat contract_id_plan_id_segment_id and is NULL for 8,316 early-year rows, so DISTINCT bid_id (23,191) under-counts the real plan population (26,631 contract+plan+segment combos). Use the three ID columns, not bid_id.
  4. 4_yn flags follow CMS convention '1'=Yes, '2'=No, and NULL = not collected in that year's PBP version (PBP schema changed over 25 years) — NULL does not mean 'No'. The flag gates its amount columns: copay/coins/deductible dollar+percent fields are only populated when the matching *_yn='1'. Deductible is essentially always '2'/No (Original-Medicare home health has no deductible; only 3 rows carry an amount).
  5. 5Most measure columns are extremely sparse and benefit-specific. The entire pbp_b6_mm_* sub-block (additional / Non-Medicare-Covered in-home support services) is NULL in ~200,350 of 201,488 rows (mm_nmc_yn set in just 1,138). Many _pos (point-of-service/out-of-network) columns are vestigial (e.g. pbp_b6_copay_amtv_pos is 100% NULL). Suffixes encode home-health sub-categories: mc=Medicare-covered (the main one), hs/rc/cc=other sub-services; pull the mc and the *_yn columns for the core cost-sharing story.
  6. 6Sibling-table caveat: this is ONLY PBP Section B-6 (home health). Other pbp_section_b* tables hold other benefit categories (B-1 inpatient, B-7 professional, etc.) at the SAME plan grain — do not assume a plan's home-health cost-share generalizes. report_year/observed_period/effective_period_start are all the same year (redundant); effective_period_end is always Dec 31 of that year.

Columns (165)

ColumnTypeMeaning
contract_idstringCMS Medicare Advantage/Part C contract ID (e.g. H0028). Prefix encodes program: H=local MA/MA-PD (1,933 contracts), R=regional PPO (37), E=employer/EGWP (2). All rows are MA contracts. Part of the grain key.
plan_idstring3-char plan benefit package ID within the contract (e.g. '001','007'). 656 distinct values. A contract sells many plans. Part of the grain key.
segment_idstringPlan segment (service-area sub-division). '0' = non-segmented plan (181,424 rows, the norm); '1'-'27' = segmented plans; empty-string '' for 5,074 early-year rows (never NULL). Part of the grain key — needed because the same contract+plan can have multiple segments.
versiondoubleCMS bid/PBP submission version number for that plan-year (double, 0-27). Resets each report_year (e.g. 2023 plans show v3, 2024 v6). Identifies which iteration of the plan's bid the snapshot reflects; NOT a lake-side dedup version and NOT part of the minimal grain.
report_yeardoublePlan/benefit year the row describes (double, 2001-2026). Equals year(observed_period)=year(effective_period_start)=year(effective_period_end) exactly. Part of the grain key (stands in for observed_period). This is the year the benefits are IN EFFECT, not when filed.
quarterdoubleCMS PBP quarterly release the snapshot came from (double, 1-4). Part of the grain key. CRITICAL: 2001-2017 have Q1 only; 2018+ have up to 4 quarterly re-publications of the SAME plan year. A given plan-year appears once per published quarter.
bid_idstringDerived plan key = contract_id||'_'||plan_id||'_'||segment_id (verified: equals that concat in 100% of non-null rows). NULL for 8,316 early-year rows. Redundant with the three ID columns; do NOT use as a standalone key (its nulls make it non-unique).
orgtypestringCMS organization type code (string): '01'=Local CCP/HMO-PPO (177,737, plurality), '08'=Regional PPO, '04'=PFFS, '11'=MSA, '06'=1876 Cost, '05'=PDP-ish, etc. Describes the MA organization structure.
pbp_a_ben_covstringSection A benefit-coverage indicator (string): '1'=plan covers Original Medicare benefits (196,773), '2'=does not (4,373), NULL (342). Carried from PBP Section A.
pbp_a_plan_typestringCMS 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'=Cost, '48'=Special. Carried from PBP Section A; classifies the plan product.
pbp_b6_authstring
pbp_b6_auth_posstring
pbp_b6_auth_ynstring
pbp_b6_bendec_hhstring
pbp_b6_bendec_yesnostring
pbp_b6_bendesc_amostring
pbp_b6_bendesc_amo_hsstring
pbp_b6_bendesc_amo_rcstring
pbp_b6_bendesc_amohsstring
pbp_b6_bendesc_amorcstring
pbp_b6_bendesc_hhstring
pbp_b6_bendesc_ynstring
pbp_b6_coins_cov_ccstring
pbp_b6_coins_cov_hsstring
pbp_b6_coins_cov_mcstring
pbp_b6_coins_cov_posstring
pbp_b6_coins_cov_rcstring
pbp_b6_coins_pct_ccdouble
pbp_b6_coins_pct_cc_maxdouble
pbp_b6_coins_pct_cc_mindouble
pbp_b6_coins_pct_ccmaxdouble
pbp_b6_coins_pct_hsdouble
pbp_b6_coins_pct_hs_maxdouble
pbp_b6_coins_pct_hs_mindouble
pbp_b6_coins_pct_hsmaxdouble
pbp_b6_coins_pct_max_posdouble
pbp_b6_coins_pct_mcdouble
pbp_b6_coins_pct_mc_maxdouble
pbp_b6_coins_pct_mc_mindouble
pbp_b6_coins_pct_mcmaxdouble
pbp_b6_coins_pct_posdouble
pbp_b6_coins_pct_rcdouble
pbp_b6_coins_pct_rc_maxdouble
pbp_b6_coins_pct_rc_mindouble
pbp_b6_coins_pct_rcmaxdouble
pbp_b6_coins_yesnostring
pbp_b6_coins_yesno_posstring
pbp_b6_coins_ynstring
pbp_b6_copay_amtv_posdouble
pbp_b6_copay_cc_amtdouble
pbp_b6_copay_cc_amt_maxdouble
pbp_b6_copay_cc_amt_mindouble
pbp_b6_copay_cc_amtmaxdouble
pbp_b6_copay_hs_amtdouble
pbp_b6_copay_hs_amt_maxdouble
pbp_b6_copay_hs_amt_mindouble
pbp_b6_copay_hs_amtmaxdouble
pbp_b6_copay_max_amtv_posdouble
pbp_b6_copay_mc_amt_maxdouble
pbp_b6_copay_mc_amt_mindouble
pbp_b6_copay_mcamtdouble
pbp_b6_copay_mcamtmaxdouble
pbp_b6_copay_rc_amtdouble
pbp_b6_copay_rc_amt_maxdouble
pbp_b6_copay_rc_amt_mindouble
pbp_b6_copay_rc_amtmaxdouble
pbp_b6_copay_yesnostring
pbp_b6_copay_yesno_posstring
pbp_b6_copay_ynstring
pbp_b6_ded_amtdouble
pbp_b6_ded_amt_posdouble
pbp_b6_ded_yesno_posstring
pbp_b6_ded_ynstring
pbp_b6_maxenr_amtdouble
pbp_b6_maxenr_amt_posdouble
pbp_b6_maxenr_perstring
pbp_b6_maxenr_per_dstring
pbp_b6_maxenr_yesnostring
pbp_b6_maxenr_ynstring
pbp_b6_maxenr_yn_posstring
pbp_b6_maxplan_yesno_posstring
pbp_b6_maxpln_amt_posdouble
pbp_b6_maxpln_cov_posstring
pbp_b6_maxpln_per_posstring
pbp_b6_mm_addl_service_other1string
pbp_b6_mm_addl_service_other2string
pbp_b6_mm_authstring
pbp_b6_mm_auth_ynstring
pbp_b6_mm_coins_addl_maxdouble
pbp_b6_mm_coins_addl_mindouble
pbp_b6_mm_coins_other1_maxdouble
pbp_b6_mm_coins_other1_mindouble
pbp_b6_mm_coins_other2_maxdouble
pbp_b6_mm_coins_other2_mindouble
pbp_b6_mm_coins_pcs_maxdouble
pbp_b6_mm_coins_pcs_mindouble
pbp_b6_mm_coins_servicesstring
pbp_b6_mm_coins_ynstring
pbp_b6_mm_copay_addl_maxdouble
pbp_b6_mm_copay_addl_mindouble
pbp_b6_mm_copay_other1_maxdouble
pbp_b6_mm_copay_other1_mindouble
pbp_b6_mm_copay_other2_maxdouble
pbp_b6_mm_copay_other2_mindouble
pbp_b6_mm_copay_pcs_maxdouble
pbp_b6_mm_copay_pcs_mindouble
pbp_b6_mm_copay_servicesstring
pbp_b6_mm_copay_ynstring
pbp_b6_mm_lim_unit_type_ahc_dstring
pbp_b6_mm_lim_unit_type_oth1_dstring
pbp_b6_mm_lim_unit_type_oth2_dstring
pbp_b6_mm_limit_servicesstring
pbp_b6_mm_limit_unit_num_ahcdouble
pbp_b6_mm_limit_unit_num_oth1double
pbp_b6_mm_limit_unit_num_oth2double
pbp_b6_mm_limit_unit_num_pcdouble
pbp_b6_mm_limit_unit_per_ahcstring
pbp_b6_mm_limit_unit_per_ahc_dstring
pbp_b6_mm_limit_unit_per_oth1string
pbp_b6_mm_limit_unit_per_oth2string
pbp_b6_mm_limit_unit_per_pcstring
pbp_b6_mm_limit_unit_per_pc_dstring
pbp_b6_mm_limit_unit_type_ahcstring
pbp_b6_mm_limit_unit_type_oth1string
pbp_b6_mm_limit_unit_type_oth2string
pbp_b6_mm_limit_unit_type_pcstring
pbp_b6_mm_limit_unit_type_pc_dstring
pbp_b6_mm_limit_ynstring
pbp_b6_mm_limt_unit_per_oth1_dstring
pbp_b6_mm_limt_unit_per_oth2_dstring
pbp_b6_mm_maxplan_amtdouble
pbp_b6_mm_maxplan_perstring
pbp_b6_mm_maxplan_per_dstring
pbp_b6_mm_maxplan_ynstring
pbp_b6_mm_nmc_ynstring
pbp_b6_mm_refer_ynstring
pbp_b6_mm_servicesstring
pbp_b6_mmp_waiver_srvcstring
pbp_b6_mmp_waiver_ynstring
pbp_b6_refer_ynstring
pbp_b_6_ded_amtdouble
pbp_b_6_ded_yesnostring
observed_perioddate
asserted_atdate
effective_period_startdate
effective_period_enddate
cms_vintage_sequenceint
parse_revisionint
parser_artifact_hashstring
source_urlstring
sha256_content_hashstring
pbp_b6_auth_yn / pbp_b6_refer_ynWhether prior authorization (auth) / referral (refer) is required for home health. CMS yes/no convention: '1'=Yes, '2'=No, NULL=not asked that PBP version. Auth: 120,706 Yes; Refer: 53,884 Yes. pbp_b6_auth/pbp_b6_auth_pos hold free-text/POS auth detail (mostly NULL).
pbp_b6_copay_yn / pbp_b6_coins_yn / pbp_b6_ded_ynMaster flags for whether the plan charges a copay / coinsurance / deductible on Medicare-covered home health. '1'=Yes, '2'=No, NULL=n/a. Copay Yes=79,803; Coins Yes=39,227; Deductible almost always '2'=No (only 3 rows Yes — Original-Medicare home health has no deductible). These gate the corresponding amount columns.
pbp_b6_copay_{mc,hs,rc,cc}_amt[_min/_max] / pbp_b6_copay_mcamt[max]Home-health copay DOLLAR amounts by sub-category: mc=Medicare-covered home health (primary), hs/rc/cc=other home-health sub-services. _min/_max give the range; the bare/_mcamt is a point value. Observed range $0-$65 (mostly $0 — MA home health rarely charges). Populated only when copay_yn='1'.
pbp_b6_coins_pct_{mc,hs,rc,cc}[_min/_max] + pbp_b6_coins_cov_*Home-health coinsurance PERCENT by sub-category (double, 0-35, median 0). coins_cov_* are coverage-descriptor codes (1-6) for what the coinsurance applies to. Populated only when coins_yn='1' (very sparse for mc: ~12 non-null).
pbp_b6_ded_amt / pbp_b_6_ded_amt / pbp_b6_ded_amt_posHome-health deductible dollar amount. Essentially always NULL (deductible_yn is overwhelmingly No); only 3 rows carry a value ($124). pbp_b_6_ded_amt / pbp_b_6_ded_yesno are legacy duplicate spellings (underscore-6) of the same concept, nearly all NULL.
pbp_b6_maxenr_* (amt, per, per_d, yn) / pbp_b6_maxpln_* / pbp_b6_maxplan_yesno_posMaximum enrollee out-of-pocket / maximum plan benefit caps on home health: yn flag ('2'=No in 191,273 rows — caps rare), amt=dollar cap, per/per_d=period the cap applies over (coded + decoded). _pos variants are for the POS/out-of-network side. Almost entirely No/NULL for this benefit.
pbp_b6_mm_* (services, nmc_yn, auth_yn, refer_yn, coins_*, copay_*, limit_*, maxplan_*)The 'MM' sub-block = additional / Non-Medicare-Covered (NMC) in-home support & supplemental home-health services a plan may add. VERY sparse: ~200,350 of 201,488 rows NULL. mm_nmc_yn='1' in only 1,138 rows. mm_services is a 4-bit service-category bitmask ('0100','0111',...). mm_limit_* encode visit/unit limits (num + period + unit-type, with _d decoded text). Use only for the small set of plans offering expanded home health.
pbp_b6_*_pos suffix columnsPoint-of-service / out-of-network cost-share variants (copay_amtv_pos, coins_*_pos, maxpln_*_pos, ded_*_pos, etc.). Largely vestigial here — e.g. pbp_b6_copay_amtv_pos is 100% NULL. Present for schema symmetry with POS-capable plan types.
observed_period (date)The plan year as a date — always Jan 1 of report_year. Constant within a (report_year, quarter). Bitemporal 'valid-time' anchor; redundant with report_year.
effective_period_start / effective_period_end (date)Benefit validity window: Jan 1 -> Dec 31 of report_year (effective_period_end is ALWAYS Dec 31, verified). Defines the plan year the cost-sharing is in force.
asserted_at (date)Bitemporal 'transaction-time' — the date this row was loaded/asserted into the lake. Only 2 values (2026-05-16: 100,054 rows; 2026-05-20: 101,434). It is an INGEST date, NOT a benefit date; do not confuse with effective_period.
cms_vintage_sequence (int)Sequence (1-4) of the CMS quarterly release within ingestion. Maps 1:1 to the quarterly source file batch (v1=Q1 load of 100,054, etc.). Each grain row has exactly ONE vintage (verified 0 multi-vintage groups) — so it is NOT a within-grain dedup/is_current marker.
parse_revision (int)Version of the parser/pipeline that produced the row (1 or 2 observed). Provenance for reproducibility; not a business key.
parser_artifact_hash / source_url / sha256_content_hashProvenance trio: parser_artifact_hash = code-artifact fingerprint; source_url = the exact CMS PBP zip (e.g. .../pbp-benefits-2022-quarter-2.zip, 40 distinct = 40 year-quarter files); sha256_content_hash = content hash of the source file. Enables full lineage back to the CMS download.

Query it

describe_data_source(source_fqn="medicare_silver.pbp_section_b6_home_health")     # the card, live
query_substrate(sql="SELECT * FROM medicare_silver.pbp_section_b6_home_health WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id
Joinhow_to_join(source_fqn="medicare_silver.pbp_section_b6_home_health")
Raw doorAthena (read-only via query_substrate): medicare_silver.pbp_section_b6_home_health
NoteGrain-governed; live in Glue / query_substrate. Source family pbp_benefits.

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