# Methodology: Dental email list: how many US dental providers are in NPPES

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 in the Dental Providers grouping, 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; 294428 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 "providers", COUNT(*) AS "_n_rows"
FROM rows
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Dental Providers", 10]`

### Methodology: Active individual dental-provider NPIs by classification

- **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; 294428 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 7 of 7 groups meet it.
- **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 "providers", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "primary_classification"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Dental Providers", 10]`

### Methodology: Active individual dentist NPIs by taxonomy 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; 274573 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 14 of 14 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 ? 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 "code_entity"
  FROM filtered
)
SELECT "primary_code", "code_entity", COUNT(*) AS "dentists", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "primary_code", "code_entity"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Dental Providers", "Dentist", "1223G0001X", "1223G0001X (General Practice)", "122300000X", "122300000X (Dentist, no specialization)", "1223X0400X", "1223X0400X (Orthodontics and Dentofacial Orthopedics)", "1223P0221X", "1223P0221X (Pediatric Dentistry)", "1223S0112X", "1223S0112X (Oral and Maxillofacial Surgery)", "1223E0200X", "1223E0200X (Endodontics)", "1223P0300X", "1223P0300X (Periodontics)", "1223P0700X", "1223P0700X (Prosthodontics)", "1223D0001X", "1223D0001X (Dental Public Health)", "1223P0106X", "1223P0106X (Oral and Maxillofacial Pathology)", "1223D0004X", "1223D0004X (Dental Anesthesiology)", "1223X0008X", "1223X0008X (Oral and Maxillofacial Radiology)", "1223X2210X", "1223X2210X (Orofacial Pain)", "125Q00000X", "125Q00000X (Oral Medicine)", "Other code", 10]`

### Methodology: Active individual dentist 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; 274573 after filters and de-duplication.
- **Threshold:** a group is published only when it covers at least 10 source rows; 60 of 60 groups meet it; 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" = ?
    AND "primary_classification" = ?
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT "practice_state", COUNT(*) AS "dentists", COUNT(*) AS "_n_rows"
FROM rows
GROUP BY "practice_state"
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Dental Providers", "Dentist", 10]`

### Methodology: Active individual dentist NPIs outside the 50 states and DC

- **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; 3128 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" = ?
    AND "primary_classification" = ?
    AND "practice_state" NOT IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
),
rows AS (
  SELECT *
  FROM filtered
)
SELECT COUNT(*) AS "dentists", COUNT(*) AS "_n_rows"
FROM rows
HAVING COUNT(*) >= ?
```
Parameters: `["individual", "Dental Providers", "Dentist", "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY", 10]`

### Methodology: Active dentist-coded NPIs: individuals and organizations

- **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; 385355 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 (?, ?)
    AND "primary_grouping" = ?
    AND "primary_classification" = ?
),
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", "Dental Providers", "Dentist", "individual", "individual (NPI-1)", "organization", "organization (NPI-2)", "other", "individual", "Individual (NPI-1)", "organization", "Organization (NPI-2)", "Other", 10]`

### Methodology: Time since the last update of individual dentist 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; 274573 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" = ?
    AND "primary_classification" = ?
),
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", "Dental Providers", "Dentist", "<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]`

