# Methodology: Primary care physician email list: what NPPES 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 NPIs under the four primary care generalist codes, 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; 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; 399949 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_code" IN (?, ?, ?, ?)
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "207Q00000X", "207R00000X", "208000000X", "208D00000X", 10]`

### Methodology: Primary care physician NPIs by generalist code

- **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; 399949 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 4 of 4 groups meet it.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "primary_code"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_code" IN (?, ?, ?, ?)
),
rows AS (
  SELECT *,
    CASE "primary_code" WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? WHEN ? THEN ? ELSE ? END AS "code_entity"
  FROM filtered
)
SELECT "primary_code", "code_entity", COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "primary_code", "code_entity"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "207Q00000X", "207R00000X", "208000000X", "208D00000X", "207Q00000X", "207Q00000X (Family Medicine)", "207R00000X", "207R00000X (Internal Medicine)", "208000000X", "208000000X (Pediatrics)", "208D00000X", "208D00000X (General Practice)", "Other code", 10]`

### Methodology: Active individual physician NPIs in Family Medicine, Internal Medicine and Pediatrics

- **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; 587621 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 3 of 3 groups meet it.
- **Query engine:** SQLite, read-only

```sql
WITH filtered AS (
  SELECT "primary_classification"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
    AND "primary_classification" IN (?, ?, ?)
),
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", "Family Medicine", "Internal Medicine", "Pediatrics", 10]`

### Methodology: Internal Medicine physician NPIs: general code vs subspecialty codes

- **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; 308743 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 "primary_code"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
    AND "primary_classification" = ?
),
rows AS (
  SELECT *,
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "code_kind",
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "kind_entity",
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "kind_order"
  FROM filtered
)
SELECT "code_kind", "kind_entity", "kind_order", COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "code_kind", "kind_entity", "kind_order"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", "Internal Medicine", "207R00000X", "the general internal medicine code 207R00000X", "an internal medicine subspecialty code", "207R00000X", "207R00000X (general internal medicine)", "Internal Medicine subspecialty codes", "207R00000X", "1", "2", 10]`

### Methodology: Pediatrics physician NPIs: general code vs subspecialty codes

- **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; 112163 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 "primary_code"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
    AND "primary_classification" = ?
),
rows AS (
  SELECT *,
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "code_kind",
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "kind_entity",
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "kind_order"
  FROM filtered
)
SELECT "code_kind", "kind_entity", "kind_order", COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "code_kind", "kind_entity", "kind_order"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", "Pediatrics", "208000000X", "the general pediatrics code 208000000X", "a pediatrics subspecialty code", "208000000X", "208000000X (general pediatrics)", "Pediatrics subspecialty codes", "208000000X", "1", "2", 10]`

### Methodology: Family Medicine physician NPIs: general code vs subspecialty codes

- **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; 166715 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 "primary_code"
  FROM "npi_facts"
  WHERE "entity" = ?
    AND "primary_grouping" = ?
    AND "primary_classification" = ?
),
rows AS (
  SELECT *,
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "code_kind",
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "kind_entity",
    CASE "primary_code" WHEN ? THEN ? ELSE ? END AS "kind_order"
  FROM filtered
)
SELECT "code_kind", "kind_entity", "kind_order", COUNT(*) AS "physicians", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "code_kind", "kind_entity", "kind_order"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Allopathic & Osteopathic Physicians", "Family Medicine", "207Q00000X", "the general family medicine code 207Q00000X", "a family medicine subspecialty code", "207Q00000X", "207Q00000X (general family medicine)", "Family Medicine subspecialty codes", "207Q00000X", "1", "2", 10]`

### Methodology: Primary care 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; 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; 399949 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_code" IN (?, ?, ?, ?)
),
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", "207Q00000X", "207R00000X", "208000000X", "208D00000X", 10]`

### Methodology: Time since the last update of primary care 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; 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; 399949 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_code" IN (?, ?, ?, ?)
),
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", "207Q00000X", "207R00000X", "208000000X", "208D00000X", "<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]`

