NPI and taxonomy correctness
Do NDH NPIs pass the Luhn check, exist in NPPES, and agree with NPPES on name and primary specialty? NUCC taxonomy validity + currency.
Headline
94.54% of 11.6M NDH NPIs clear NPPES (3.04% not enumerated, 0.29% deactivated). Practitioner name agreement: 89.6% exact → 90.1% normalized → 96.5% Jaro-Winkler ≥0.85. Organization name: 43.4% exact → 69.7% normalized → 77.6% Jaro-Winkler ≥0.85. Both taxonomy fields now speak NUCC: Practitioner.qualification is 99.86% valid against NUCC v17.0, and PractitionerRole.specialty, which carried CMS Medicare specialty codes through 2026-05-08, is 99.96% valid NUCC and 0.00% valid Medicare. They agree with each other on 100.0% of 5.8M Practitioner↔Role pairs. The NDH carries the NPPES taxonomy set, not a choice from it: 100.0% of practitioners hold a qualification matching NPPES's switch='Y' TRUE primary somewhere in the array. Position does not encode primacy, though. Reading qualification[0] alone, the earlier method here, matches the true primary for only 88.7% and any slot for 95.7%. On the NPPES side the same trap: slot_1 is not the true primary in 14.97% of rows. Neither file says which taxonomy is primary by where it sits.
5.8M / 5.8M = 100.00%
unit: percent
What this means
Payer data teams
When comparing NDH specialty to NPPES, match against all 15 NPPES taxonomy slots, NOT just slot 1. 15% of NPPES records have their TRUE primary (switch=Y) in a non-slot-1 position, and 6% of NDH Practitioners legitimately match only an NPPES secondary board (dual-specialists).
FHIR implementers
NDH uses TWO specialty code systems on two resources: NUCC on Practitioner.qualification, CMS Medicare Types on PractitionerRole.specialty. A consumer filtering on one won’t interoperate with one using the other. Apply the CMS-published Medicare/NUCC crosswalk (updated quarterly) to bridge.
Regulators
0.79% of NDH NPIs (86K) don’t exist in NPPES at all. 3.49% (379K) are deactivated in NPPES but still live in NDH. NDH’s update cadence lags NPPES by the gap window between releases.
Researchers
99.98% CMS structural validity + 99.83% NUCC validity = the underlying code quality is excellent. The interesting signal is inconsistency BETWEEN code systems for the same practitioner (14% fail the crosswalk check), not invalid codes themselves.
Null hypothesis
NPI structural validity is ≥99.9% and NDH-to-NPPES agreement on name and primary specialty is within documented drift thresholds.
Denominator
All `Practitioner` and `Organization` resources with an NPI identifier.
Data source
CMS NPD bulk export joined against the NPPES monthly full dissemination file (V.2) and the current NUCC quarterly code set.
Notes
METHOD CHANGE 2026-08-28. Three figures here read only the first entry of a repeating FHIR element and now read every entry. PractitionerRole.specialty is 0..* and 421,613 role records carry more than one, up to 17; Practitioner.qualification is 0..* as well. H12 role-specialty validity now covers 5759163 entries against 5275636 under the old method. H13 internal agreement is 100.0% of 5759162 pairs, against 100.0% of 5275635 pairs first-entry-only. H13b external agreement is reported across every taxonomy qualification; the qualification[0]-only figures were 88.7% true primary, 95.7% any slot and 7.0% secondary only, and 4908527 practitioners carry more than one taxonomy qualification. Both forms are computed so the previously published numbers stay reproducible. Source: bigquery-public-data.nppes.npi_raw (updated 2026-02-09, 9.37M NPIs) + .healthcare_provider_taxonomy_code_set_170 + CMS Medicare Provider and Supplier Taxonomy Crosswalk (2025-10, 565 rows, 1-to-many). H11 v2 methodology — three tiers: (1) exact match on UPPER(TRIM), (2) normalized match that strips business suffixes (LLC/INC/CORP/PC/PA/PLLC/LLP/LTD/CO/COMPANY/THE for Orgs; JR/SR/II–V/MD/DO/PHD/RN/NP/PA-C/FNP-BC/DMD/DDS/DVM/PHARMD for persons), drops non-alphanumeric, collapses whitespace, (3) Jaro-Winkler ≥0.85 via a BQ JS UDF. Practitioner name: 6,498,536/7,126,309 family exact, 6,420,103 normalized full match, 6,879,542 at JW≥0.85, 6,497,337 at JW≥0.95. Organization name: 1,679,807/3,866,592 exact, 2,693,913 normalized, 2,999,412 at JW≥0.85, 2,891,845 at JW≥0.95. H12: NUCC codes on Practitioner.qualification (7,357,424/7,368,037 valid in NUCC v17.0); Medicare codes on PractitionerRole.specialty (0/5,759,163 valid in the crosswalk). NDH PractitionerRole._specialty_code carries a leading 'NN-' prefix (e.g. '14-50'); stripping recovers the canonical Medicare code. H10's not-enumerated count is bounded by the reference data, not by the directory. bigquery-public-data.nppes.npi_raw is a static snapshot whose newest enumeration is 2026-02-07, so every provider the NDH lists who was enumerated after that date is counted as missing from NPPES. Eight sampled at random resolved to real, active providers in the live NPPES registry with enumeration dates between February and June 2026. Read the figure as an upper bound on ghost NPIs, and see the high-risk-cohort finding, which scores this signal at zero for the same reason. Organization name agreement is reported over the whole Organization file, half of which is now `ein` tax records rather than provider organizations. Split by record type, exact match is 46.4% on provider records and 40.6% on ein records, so the fall from the 2026-05-08 figure is not explained by the ein rows being dragged in. Source-side schema change at 2026-08-20: the provider-taxonomy coding system moved from 'http://nucc.org/provider-taxonomy' to 'http://hl7.org/fhir/us/ndh/ValueSet/HealthcareIndividualTaxonomyVS' (7,368,037 qualification codings under the new URL, 0 under the old one), and PractitionerRole.specialty moved from CMS Medicare specialty codes to NUCC taxonomy codes. The new URL is a ValueSet canonical in a field FHIR defines as a CodeSystem canonical. A parser matching the old literal returns zero rows and does not error, which is how the first run of this script against the August release reported 0% specialty validity. H13 internal: 5,759,162 Practitioner↔Role pairs, 5,759,067 where the role specialty code is also one of the practitioner's qualification codes. H13 confusion matrix — top 10 inconsistent (Medicare → qualification-NUCC) pairs: n/a. H13 external (v3 — switch-aware): NPPES stores 15 (taxonomy_code, primary_switch) pairs per NPI; exactly one should have switch='Y' (the TRUE primary). Four buckets: • Match NPPES true primary (switch='Y' slot): 6,318,249 (88.68%) • Match any slot: 6,820,062 (95.72%) • Match slot_1 specifically:6,465,092 (90.74%) • Match only a secondary (switch='N'): 501,813 (7.04%) • Disagree entirely (not in any slot): 304,895 (4.28%) Slot-ordering observation: 1,066,563 rows (14.97%) have the NPPES TRUE primary in a slot other than slot_1 — so the prior 'slot_1' proxy for 'primary' was slightly wrong. 0 rows (0.00%) have no switch='Y' at all (NPPES data-quality edge). Known caveats: NPPES vintage 2026-02-09 vs NDH 2026-08-20 — 8-week gap means taxonomy changes in that window show as disagreement; Jaro-Winkler ≥0.85 is a permissive threshold that recovers common variations (whitespace, DBA suffixes, casing) but also accepts some false positives (e.g. 'Smith Medical' vs 'Smith Medicare'); the 0.95 column is the strict signal. v2 upgrade candidates: pinned quarterly NUCC; NPPES secondary-taxonomy match; phonetic fallback (Soundex / Metaphone) for names where JW misses transpositions.
Get the next finding in your inbox. One email per release, no filler.