How this is built
Two sources, one monthly and one live, and a set of counting decisions that change the numbers enough to be worth writing down.
The sources
- Aggregate counts
- CMS NPPES Data Dissemination file, npidata_pfile_20050523-20260712.csv. Public domain, no key. 9,671,888 rows, 9,322,332 of them active.
- Individual records
- NPPES public API, read when you load a provider page and cached for a day.
- Taxonomy definitions
- NUCC Health Care Provider Taxonomy code set 25.1, quoted verbatim.
- Built
- 2026-08-09
Why the monthly file for counts and the API for records
The dissemination file is 11.6GB and a month stale the day it ships. For a count of physical therapists in Ohio, a month of drift moves the figure by a fraction of a percent and nothing anyone does depends on it. For one provider, a month of drift is the difference between an active identifier and a deactivated one, which is the single thing this site cannot afford to be wrong about. So counts come from the file and records come from the API.
Three counting decisions
Deactivated identifiers are excluded
NPPES never deletes. A retired or deceased provider keeps their row forever, with a deactivation date. 349,556 of 9,671,888 rows are dead identifiers. Counting them would inflate every figure here, and unevenly, because deactivation rates differ by provider type.
Primary taxonomy only
A provider can list up to fifteen taxonomies. Counting all of them double-counts anyone with more than one and stops state totals summing to the provider count. Exactly one is flagged primary, and that is the one counted. Where no flag is set, the first listed taxonomy is used, which is what NPPES itself displays.
Practice location, not mailing address
Providers file both and they are frequently different, because the mailing address is often a billing company or a head office. State counts use the practice location.
Deactivated numbers, and why they need their own list
The NPPES API does not return deactivated records. Query one and you get an empty result, byte for byte the same empty result you get for a number CMS never issued. The API alone cannot tell a retired provider apart from a typo.
That is a bad answer to give someone holding a real NPI off an old claim, so this site ships the full list of 349,556 deactivated identifiers from the monthly file and checks it whenever the API comes back empty. Only the numbers are stored, not the names: an NPI packs into a 32-bit integer, so the whole set is 1.4MB rather than the 17MB it would take with names attached.
What this site cannot tell you
- Whether a licence is current. NPPES records the licence number a provider supplied at registration. Nobody re-checks it. Only the state board knows.
- Whether a provider has been disciplined. There is no disciplinary field in this data at all.
- Whether they are accepting patients, or take your insurance. Not in the registry.
- Whether the address is where they actually work today. Providers are required to update within 30 days of a change. Compliance is uneven, and the record shows its own last-updated date so you can judge.
A quirk worth knowing
The largest single taxonomy in the registry is Behavior Technician, and the largest in New York is Student in an Organized Health Care Education/Training Program. Neither is a specialty in the way most people mean it. An NPI is required to bill, so anyone who appears on a claim gets one, including students and paraprofessionals. Provider counts are counts of billable identifiers, not of doctors.
Corrections
If a count here disagrees with the official registry, the official registry is right and this is a bug. The rebuild runs monthly against the new dissemination file.