# MA plan networks: plan year x CMS plan x NPI x listed location (2026, 2027)

`medicare_bronze.ma_directory_plan_npi_site_v1` · Medicare Advantage, Part D, Medicaid · status partial

The Data Tracker's plan-network build (docs/data-tracker/SERVING-HANDOFF-PLAN-NETWORKS.md): which NPIs each Medicare Advantage plan lists, from the payer's own Plan-Net API, the printed directory, a name match to NPPES, or the Medicare Plan Finder export (npi_basis), with a grade on matched rows (A name+ZIP unique, B name+state unique, N name unique nationally: name-matched, never presented as printed) and plan_key_basis saying how the row reached its CMS plan id (the publisher's own id, a network map, or the CMS crosswalk carry-back: 2027 rows carrying plan_key_basis cy2026_directory_2027_not_yet_posted: 42 contracts / 1,132,045 members at stage 21 whose 2026 directory stands in; label or exclude them). A contract with no rows is UNCOVERED (the handoff's open-gap list), never "no network"; absence of an NPI is a claim only for a covered contract and only "not listed in the published directory". Typed tools (get_plan_network, is_provider_in_plan, get_network_change) are proposed and start on Ben's go.

**Grain.** One row per listing observation: plan_year x cms_plan_id (H1234-001-000) x npi x the location as listed (location_name, city, state, zip5, phone) x the source page (url, page, raw_sha256). No unique row key: the membership grain is (plan_year, cms_plan_id, npi), served DISTINCT, never as raw row counts. Stage 20 (dataset_id 7bceef45cc9e5910e64caa428a1f3e40869f91d149c4e19f08cc55f5e468ba7c, 2026-11-02): 2026 218,950,666 rows / 645 contracts / 3,581 plans / 2,437,003 NPIs; 2027 289,906,332 / 614 / 4,305 / 2,421,994; plan_year unknown 826,292 rows (4 contracts), excluded from answers.

| column | type | meaning |
|---|---|---|
| plan_year | string |  |
| cms_plan_id | string |  |
| contract_id | string |  |
| plan_key_basis | string |  |
| npi | string |  |
| npi_basis | string |  |
| grade | string |  |
| provider_name_printed | string |  |
| specialty | string |  |
| location_name | string |  |
| city | string |  |
| state | string |  |
| zip5 | string |  |
| phone | string |  |
| page | string |  |
| source_group | string |  |
| url | string |  |
| raw_sha256 | string |  |

Tools that read it: get_network_change, get_plan_network, is_provider_in_plan

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