# Methodology: Physician email list: what the NPI registry shows

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 individual physician NPIs, total

- **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; never updated = the last-update date equals the enumeration date; a practice location with a non-US country code or no state 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; 1252140 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 1 AS one
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", 10]`

### Methodology: Active physician NPIs by primary specialty (top 15)

- **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; never updated = the last-update date equals the enumeration date; a practice location with a non-US country code or no state 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; 1252140 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 37 of 37 groups meet it; the largest 15 are listed.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "primary_classification"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "primary_classification", COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "primary_classification"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", 10]`

### Methodology: Active physician NPIs by practice state (top 15)

- **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; never updated = the last-update date equals the enumeration date; a practice location with a non-US country code or no state 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; 1252140 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 59 of 61 groups meet it (1 below the threshold, 1 withheld so a withheld group cannot be worked out from the totals); the largest 15 are listed.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "practice_state"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "practice_state", COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "practice_state"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", 10]`

### Methodology: Time since the last update of active physician NPI records

- **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; never updated = the last-update date equals the enumeration date; a practice location with a non-US country code or no state 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; 1252140 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 5 of 5 groups meet it.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "update_age"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
),
rows AS (
  SELECT *,
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "age_label",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "age_entity",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "age_order",
    CASE "update_age" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "age_group"
  FROM filtered
)
SELECT "update_age", "age_label", "age_entity", "age_order", "age_group", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "update_age", "age_label", "age_entity", "age_order", "age_group"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", "<1 yr", "under 1 year", "1-3 yr", "1 to 3 years", "3-5 yr", "3 to 5 years", "5-10 yr", "5 to 10 years", "10+ yr", "10 years or more", "an unrecorded time", "<1 yr", "Under 1 year", "1-3 yr", "1 to 3 years", "3-5 yr", "3 to 5 years", "5-10 yr", "5 to 10 years", "10+ yr", "10 years or more", "Not recorded", "<1 yr", "1", "1-3 yr", "2", "3-5 yr", "3", "5-10 yr", "4", "10+ yr", "5", "6", "<1 yr", "last updated within five years of 1 October 2026", "1-3 yr", "last updated within five years of 1 October 2026", "3-5 yr", "last updated within five years of 1 October 2026", "5-10 yr", "last updated five or more years before 1 October 2026", "10+ yr", "last updated five or more years before 1 October 2026", "with no recorded update date", 10]`

### Methodology: Active physician NPI records never updated after enumeration

- **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; never updated = the last-update date equals the enumeration date; a practice location with a non-US country code or no state 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; 1252140 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 "never_updated"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
),
rows AS (
  SELECT *,
    CASE "never_updated" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "update_history",
    CASE "never_updated" WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "history_entity"
  FROM filtered
)
SELECT "update_history", "history_entity", COUNT(*) AS "records", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "update_history", "history_entity"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", "1", "never updated after enumeration", "0", "updated at least once", "unknown", "1", "Never updated after enumeration", "0", "Updated at least once", "Unknown", 10]`

