# Methodology: NPI database download by state: record counts

Every figure on the page is an aggregate. No location-level row, address or phone number is published. Each block below gives the source, the exact query, the row counts and the minimum group size applied.

### Methodology: Active NPPES records, total, and those last updated five or more years ago

- **Asset:** NPPES September 2026 file, one de-identified row per NPI (entity type, practice state, enumeration year, update age, primary taxonomy) (sqlite, first-party data); owner Provyx.
- **Collection method:** CMS NPPES monthly full dissemination file (September 2026 release, V2; NPIs issued from 23 May 2005 to 12 September 2026), one de-identified row per NPI. Primary taxonomy = the taxonomy slot flagged primary, else slot 1, labelled with NUCC taxonomy 26.1; update age = time from the last-update date to 1 October 2026, in bands under 1 year, 1 to 3, 3 to 5, 5 to 10 and 10 years or more; a practice location with a non-US country code, no state, or a state not given as a two-letter code is counted as 'non-US or blank'; Puerto Rico, other US territories and military (APO/FPO) codes are kept as their own groups. Counts are Provyx aggregations of the public file; taxonomy codes are self-reported by providers.
- **As of:** 2026-09-13; cadence monthly; contribution type first-party data.
- **Rows:** 9798758 input; 9443429 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 1 of 1 groups meet it.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "entity", "update_age"
  FROM "npi_facts"
  WHERE "entity" IN (?, ?)
),
rows AS (
  SELECT *,
    CASE "entity" WHEN ? THEN ? ELSE ? END AS "is_org",
    CASE "entity" WHEN ? THEN ? ELSE ? END AS "is_ind",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "is_stale",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "stale_100"
  FROM filtered
)
SELECT COUNT(*) AS "records", SUM(CAST("is_stale" AS REAL)) AS "stale", AVG(CAST("stale_100" AS REAL)) AS "stale_pct", COUNT(*) AS "_n_rows"
FROM rows
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "organization", "organization", "1", "0", "individual", "1", "0", "5-10 yr", "1", "10+ yr", "1", "0", "5-10 yr", "100", "10+ yr", "100", "0", 10]`

### Methodology: Active NPPES records by entity type

- **Asset:** NPPES September 2026 file, one de-identified row per NPI (entity type, practice state, enumeration year, update age, primary taxonomy) (sqlite, first-party data); owner Provyx.
- **Collection method:** CMS NPPES monthly full dissemination file (September 2026 release, V2; NPIs issued from 23 May 2005 to 12 September 2026), one de-identified row per NPI. Primary taxonomy = the taxonomy slot flagged primary, else slot 1, labelled with NUCC taxonomy 26.1; update age = time from the last-update date to 1 October 2026, in bands under 1 year, 1 to 3, 3 to 5, 5 to 10 and 10 years or more; a practice location with a non-US country code, no state, or a state not given as a two-letter code is counted as 'non-US or blank'; Puerto Rico, other US territories and military (APO/FPO) codes are kept as their own groups. Counts are Provyx aggregations of the public file; taxonomy codes are self-reported by providers.
- **As of:** 2026-09-13; cadence monthly; contribution type first-party data.
- **Rows:** 9798758 input; 9443429 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 2 of 2 groups meet it.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "entity"
  FROM "npi_facts"
  WHERE "entity" IN (?, ?)
),
rows AS (
  SELECT *,
    CASE "entity" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "entity_label",
    CASE "entity" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "entity_entity"
  FROM filtered
)
SELECT "entity", "entity_label", "entity_entity", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "entity", "entity_label", "entity_entity"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "organization", "individual", "individual (NPI-1)", "organization", "organization (NPI-2)", "other", "individual", "Individual (NPI-1)", "organization", "Organization (NPI-2)", "Other", 10]`

### Methodology: Active NPPES records by practice-location state

- **Asset:** NPPES September 2026 file, one de-identified row per NPI (entity type, practice state, enumeration year, update age, primary taxonomy) (sqlite, first-party data); owner Provyx.
- **Collection method:** CMS NPPES monthly full dissemination file (September 2026 release, V2; NPIs issued from 23 May 2005 to 12 September 2026), one de-identified row per NPI. Primary taxonomy = the taxonomy slot flagged primary, else slot 1, labelled with NUCC taxonomy 26.1; update age = time from the last-update date to 1 October 2026, in bands under 1 year, 1 to 3, 3 to 5, 5 to 10 and 10 years or more; a practice location with a non-US country code, no state, or a state not given as a two-letter code is counted as 'non-US or blank'; Puerto Rico, other US territories and military (APO/FPO) codes are kept as their own groups. Counts are Provyx aggregations of the public file; taxonomy codes are self-reported by providers.
- **As of:** 2026-09-13; cadence monthly; contribution type first-party data.
- **Rows:** 9798758 input; 9443429 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 61 of 66 groups meet it (5 below the threshold).
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "entity", "practice_state", "update_age"
  FROM "npi_facts"
  WHERE "entity" IN (?, ?)
),
rows AS (
  SELECT *,
    CASE "entity" WHEN ? THEN ? ELSE ? END AS "is_org",
    CASE "entity" WHEN ? THEN ? ELSE ? END AS "is_ind",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "is_stale",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "stale_100",
    CASE "practice_state" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "state_label"
  FROM filtered
)
SELECT "practice_state", "state_label", COUNT(*) AS "records", SUM(CAST("is_ind" AS REAL)) AS "individuals", SUM(CAST("is_org" AS REAL)) AS "organizations", SUM(CAST("is_stale" AS REAL)) AS "stale", AVG(CAST("stale_100" AS REAL)) AS "stale_pct", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "practice_state", "state_label"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "organization", "organization", "1", "0", "individual", "1", "0", "5-10 yr", "1", "10+ yr", "1", "0", "5-10 yr", "100", "10+ yr", "100", "0", "AL", "Alabama (AL)", "AK", "Alaska (AK)", "AZ", "Arizona (AZ)", "AR", "Arkansas (AR)", "CA", "California (CA)", "CO", "Colorado (CO)", "CT", "Connecticut (CT)", "DE", "Delaware (DE)", "DC", "District of Columbia (DC)", "FL", "Florida (FL)", "GA", "Georgia (GA)", "HI", "Hawaii (HI)", "ID", "Idaho (ID)", "IL", "Illinois (IL)", "IN", "Indiana (IN)", "IA", "Iowa (IA)", "KS", "Kansas (KS)", "KY", "Kentucky (KY)", "LA", "Louisiana (LA)", "ME", "Maine (ME)", "MD", "Maryland (MD)", "MA", "Massachusetts (MA)", "MI", "Michigan (MI)", "MN", "Minnesota (MN)", "MS", "Mississippi (MS)", "MO", "Missouri (MO)", "MT", "Montana (MT)", "NE", "Nebraska (NE)", "NV", "Nevada (NV)", "NH", "New Hampshire (NH)", "NJ", "New Jersey (NJ)", "NM", "New Mexico (NM)", "NY", "New York (NY)", "NC", "North Carolina (NC)", "ND", "North Dakota (ND)", "OH", "Ohio (OH)", "OK", "Oklahoma (OK)", "OR", "Oregon (OR)", "PA", "Pennsylvania (PA)", "RI", "Rhode Island (RI)", "SC", "South Carolina (SC)", "SD", "South Dakota (SD)", "TN", "Tennessee (TN)", "TX", "Texas (TX)", "UT", "Utah (UT)", "VT", "Vermont (VT)", "VA", "Virginia (VA)", "WA", "Washington (WA)", "WV", "West Virginia (WV)", "WI", "Wisconsin (WI)", "WY", "Wyoming (WY)", "PR", "Puerto Rico (PR)", "VI", "US Virgin Islands (VI)", "GU", "Guam (GU)", "AS", "American Samoa (AS)", "MP", "Northern Mariana Islands (MP)", "FM", "Federated States of Micronesia (FM)", "MH", "Marshall Islands (MH)", "PW", "Palau (PW)", "AE", "Armed Forces Europe, Middle East, Africa and Canada (AE)", "AP", "Armed Forces Pacific (AP)", "AA", "Armed Forces Americas (AA)", "UM", "US Minor Outlying Islands (UM)", "Non-US or blank", 10]`

