Practitioner phone-number reachability
Can you associate a practitioner in the NDH bulk export with a phone number? A phone can live on the Practitioner record (`Practitioner.telecom`), the role (`PractitionerRole.telecom`), or the referenced location (`Location.telecom`). H43 resolves all three. Result on the 2026-05-08 release: 7,195,270 of 7,196,385 active practitioners (99.98%) carry a phone directly on the Practitioner record; the role/location traversal adds nothing; 1,115 (0.015%) have no phone on any path. A "call this provider" feature can read `Practitioner.telecom` directly.
Headline
Of 7,196,385 active Practitioner resources in the 2026-05-08 NDH release, 7,195,270 (99.985%) can be associated with at least one phone number through FHIR. Where does that phone live? 7,195,270 (99.985%) carry a phone directly on the Practitioner record; 1,788,763 (24.9%) have one on PractitionerRole; 0 (0.0%) reach one via a traversed Location. 0 of the 7,195,270 are reachable ONLY by traversing role or location (i.e. the Practitioner record itself does not carry a phone). 1,115 (0.015%) have no phone on any of the three resources.
7.2M / 7.2M = 99.98%
unit: count
What this means
Startups + integrators
Read `Practitioner.telecom` directly — 99.98% of active practitioners carry a phone there. Keep the role → location traversal only as a fallback for the ~1,115 records with nothing on file.
FHIR implementers
On-record telecom is phone + fax only in this release — email and url came back empty. Don't assume those channels exist without checking the source.
CMS publishing the data
Practitioner phone coverage is effectively complete. Release-to-release watch items: the Location layer (May deduped −61%) and the empty email/url channels if those are intended to be populated.
Methodology readers
The pre-registered prior (sparse `Practitioner.telecom`, NPPES-style) was wrong; the measurement corrected it. On-record share and any-path share coincide in this release.
Null hypothesis
`Practitioner.telecom` is sparse — fewer than half of active practitioners carry an on-record phone, and reachability requires the PractitionerRole → Location traversal (the NPPES pattern, where practice phone lives on the location). Rejected: 99.98% carry an on-record phone and the traversal adds nothing.
Denominator
All active Practitioner resources in the pinned NDH bulk export (7,196,385 at 2026-05-08, `_active = TRUE`). The numerator (7,195,270) counts those with a `system='phone'` telecom entry on the Practitioner record, on any active PractitionerRole resolving to that practitioner, or on any Location referenced by such a role — unioned, then intersected back to the active set so dangling references drop out.
Data source
BigQuery scan of `cms_npd.practitioner`, `cms_npd.practitioner_role`, and `cms_npd.location` — JSON-extracting the `telecom[]` array on each resource and joining roles to locations via the pipe-joined `_location_ids` reference list. Compute script: `analysis/h43_practitioner_phone.py` (capped at the project default `maximum_bytes_billed` via `bq_job_config()`).
Notes
Three resolution paths, evaluated independently then unioned: (1) Practitioner.telecom (system='phone'); (2) PractitionerRole.telecom on any active role whose practitioner reference resolves to this NPI; (3) Location.telecom on any Location referenced by such a role (PractitionerRole.location -> Location). The union is intersected with the active Practitioner set, so the numerator never exceeds the denominator and dangling references drop out. Per-path reachability at the practitioner level: 7,195,270 via Practitioner, 1,788,763 via PractitionerRole, 0 via traversed Location. Seven-region overlap across {P, R, L}: P-only 5,406,507, R-only 0, L-only 0, P∩R 1,788,763, P∩L 0, R∩L 0, P∩R∩L 0, none 1,115. On-record contact points break down as: phone 7,195,270, fax 2,871,690, email 0, url 0; 7,195,397 active practitioners carry any telecom entry at all on the Practitioner resource. Before de-duplication against the active set, 1,790,830 practitioner references are reachable via a role-level phone and 0 via a location-level phone. Caveat — the May 2026-05-08 release deduped Location resources sharply (-61% vs April), which mechanically lowers path-3 reachability relative to the April release; compare across releases with that in mind. Upstream context: NPPES (the source of ~90% of these fields) keeps practice phone on the practice location, not the individual, so a sparse Practitioner.telecom is expected and is not itself a data quality defect — the operational takeaway is that a 'call this provider' feature must read PractitionerRole/Location, not Practitioner.telecom alone. Full Venn breakdown with raw counts at /api/v1/findings/practitioner-phone-reachability-detail.json.
Get the next finding in your inbox. One email per release, no filler.