---
title: "practitioner"
description: "The US Core Practitioner Profile inherits from the FHIR [Practitioner](https://hl7.org/fhir/R4/practitioner.html) resource; refer to it for scope and usage definitions."
---

The US Core Practitioner Profile inherits from the FHIR [Practitioner](https://hl7.org/fhir/R4/practitioner.html) resource; refer to it for scope and usage definitions. This profile sets minimum expectations for the Practitioner resource to record, search, and fetch basic demographics and administrative information about an individual practitioner. It specifies which core elements, extensions, vocabularies, and value sets **SHALL** be present and constrains how the elements are used. Providing the floor for standards development for specific use cases promotes interoperability and adoption.

## Source

| Model | Leg | Role |
|---|---|---|
| `us-core-practitioner` | FHIR | defines this table |
| `openEHR-EHR-CLUSTER.address.v1` | openEHR | merged in — Address |
| `openEHR-EHR-CLUSTER.electronic_communication.v1` | openEHR | merged in — Electronic communication |

> This table is the union of 3 source models. Columns carrying a **From** value came from a model that merged into it, so the same row satisfies both specifications.

## Columns

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Practitioner.id | — | — |
| `created_at` | `timestamptz` | no | Row creation timestamp. | — | — |
| `updated_at` | `timestamptz` | no | Row update timestamp; maintained by the application. | — | — |
| `created_by` | `text` | no | Actor who created the row. | — | — |
| `updated_by` | `text` | no | Actor who last updated the row. | — | — |
| `npi` | `text` | yes | An identifier for the person as this agent | — | `Practitioner.identifier` |
| `ncsbnid` | `text` | yes | An identifier for the person as this agent | — | `Practitioner.identifier` |
| `identifier_value`<br />`identifier_system` | text, text<br />`text`, `text` | yes | An identifier for the person as this agent | — | `Practitioner.identifier` |
| `name_text`<br />`name_prefix`<br />`name_family`<br />`name_given`<br />`name_suffix` | text, text, text, text, text<br />`text`, `text`, `text`, `text`, `text` | yes | The name(s) associated with the practitioner | — | `Practitioner.name` |
| `phone_number`<br />`phone_use_code`<br />`email`<br />`email_use_code` | text, text, text, text<br />`text`, `text`, `text`, `text` | yes | A contact detail for the practitioner (that apply to all roles) | — | `Practitioner.telecom` |
| `address_line`<br />`address_city`<br />`address_district`<br />`address_state`<br />`address_postal_code`<br />`address_country`<br />`address_use_code`<br />`address_type_code` | text, text, text, text, text, text, text, text<br />`text`, `text`, `text`, `text`, `text`, `text`, `text`, `text` | yes | Address(es) of the practitioner | — | `Practitioner.address` |
| `address_latitude_magnitude`<br />`address_latitude_units` | quantity<br />`numeric`, `text` | yes | Latitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0007]` |
| `address_longitude_magnitude`<br />`address_longitude_units` | quantity<br />`numeric`, `text` | yes | Longitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0008]` |
| `address_altitude_magnitude`<br />`address_altitude_units` | quantity<br />`numeric`, `text` | yes | Altitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0009]` |
| `address_comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0018]` |
| `address_map_url` | `text` | yes | Map URL | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0019]` |
| `address_geolocation_code` | `text` | yes | Geolocation code | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0021]` |
| `phone_comment`<br />`email_comment` | text, text<br />`text`, `text` | yes | Comment | `openEHR-EHR-CLUSTER.electronic_communication.v1` | `/items[at0004]` |

## Constraints

```sql
check (identifier_system is null or identifier_value is not null)
check ((address_latitude_magnitude is null and address_latitude_units is null) or (address_latitude_magnitude is not null and address_latitude_units is not null))
check (address_latitude_magnitude is null or (address_latitude_units = 'deg' and address_latitude_magnitude between -90 and 90))
check ((address_longitude_magnitude is null and address_longitude_units is null) or (address_longitude_magnitude is not null and address_longitude_units is not null))
check (address_longitude_magnitude is null or (address_longitude_units = 'deg' and address_longitude_magnitude between -180 and 180))
check ((address_altitude_magnitude is null and address_altitude_units is null) or (address_altitude_magnitude is not null and address_altitude_units is not null))
```

## Unique

- `npi`

## Referenced by

- [`care_team_participant`](/docs/tables/care_team_participant) via `member_practitioner_id`
- [`document_reference`](/docs/tables/document_reference) via `subject_practitioner_id`
- [`document_reference`](/docs/tables/document_reference) via `authenticator_practitioner_id`
- [`document_reference_author`](/docs/tables/document_reference_author) via `practitioner_id`
- [`encounter_participant`](/docs/tables/encounter_participant) via `individual_practitioner_id`
- [`person_link`](/docs/tables/person_link) via `target_practitioner_id`
- [`practitioner_other_identifier`](/docs/tables/practitioner_other_identifier) via `practitioner_id`
- [`practitioner_other_name`](/docs/tables/practitioner_other_name) via `practitioner_id`
- [`practitioner_other_telecom`](/docs/tables/practitioner_other_telecom) via `practitioner_id`
- [`practitioner_other_address`](/docs/tables/practitioner_other_address) via `practitioner_id`
- [`practitioner_role`](/docs/tables/practitioner_role) via `practitioner_id`

## Child tables

4 tables hang off `practitioner`, one row per repetition.

### `practitioner_other_identifier`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `practitioner_id` | `uuid` → [`practitioner`](/docs/tables/practitioner) | no | — | — | — |
| `identifier_value` | `text` | no | — | — | — |
| `identifier_system` | `text` | yes | — | — | — |
| `identifier_use` | `text` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |

#### Unique

- `practitioner_id, identifier_system, identifier_value`

#### References

| Columns | Target | On delete |
|---|---|---|
| `practitioner_id` | [`practitioner`](/docs/tables/practitioner) | cascade |

### `practitioner_other_name`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `practitioner_id` | `uuid` → [`practitioner`](/docs/tables/practitioner) | no | — | — | — |
| `use_code` | `text` | yes | — | — | — |
| `name_text` | `text` | yes | — | — | — |
| `name_prefix` | `text` | yes | — | — | — |
| `name_family` | `text` | yes | — | — | — |
| `name_given` | `text` | yes | — | — | — |
| `name_suffix` | `text` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |

#### References

| Columns | Target | On delete |
|---|---|---|
| `practitioner_id` | [`practitioner`](/docs/tables/practitioner) | cascade |

#### Indexes

- `practitioner_other_name_practitioner_id_idx` on `practitioner_id`

### `practitioner_other_telecom`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `practitioner_id` | `uuid` → [`practitioner`](/docs/tables/practitioner) | no | — | — | — |
| `system` | `text` | no | — | — | — |
| `value` | `text` | no | — | — | — |
| `use_code` | `text` | yes | — | — | — |
| `rank` | `integer` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |
| `comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.electronic_communication.v1` | `/items[at0004]` |

#### References

| Columns | Target | On delete |
|---|---|---|
| `practitioner_id` | [`practitioner`](/docs/tables/practitioner) | cascade |

#### Indexes

- `practitioner_other_telecom_practitioner_id_idx` on `practitioner_id`

### `practitioner_other_address`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `practitioner_id` | `uuid` → [`practitioner`](/docs/tables/practitioner) | no | — | — | — |
| `address_line` | `text` | yes | newline-delimited for multiple lines | — | — |
| `address_city` | `text` | yes | — | — | — |
| `address_district` | `text` | yes | — | — | — |
| `address_state` | `text` | yes | — | — | — |
| `address_postal_code` | `text` | yes | — | — | — |
| `address_country` | `text` | yes | — | — | — |
| `use_code` | `text` | yes | — | — | — |
| `type_code` | `text` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |
| `address_latitude_magnitude`<br />`address_latitude_units` | quantity<br />`numeric`, `text` | yes | Latitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0007]` |
| `address_longitude_magnitude`<br />`address_longitude_units` | quantity<br />`numeric`, `text` | yes | Longitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0008]` |
| `address_altitude_magnitude`<br />`address_altitude_units` | quantity<br />`numeric`, `text` | yes | Altitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0009]` |
| `address_comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0018]` |
| `address_map_url` | `text` | yes | Map URL | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0019]` |
| `address_geolocation_code` | `text` | yes | Geolocation code | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0021]` |

#### Constraints

```sql
check ((address_latitude_magnitude is null and address_latitude_units is null) or (address_latitude_magnitude is not null and address_latitude_units is not null))
check (address_latitude_magnitude is null or (address_latitude_units = 'deg' and address_latitude_magnitude between -90 and 90))
check ((address_longitude_magnitude is null and address_longitude_units is null) or (address_longitude_magnitude is not null and address_longitude_units is not null))
check (address_longitude_magnitude is null or (address_longitude_units = 'deg' and address_longitude_magnitude between -180 and 180))
check ((address_altitude_magnitude is null and address_altitude_units is null) or (address_altitude_magnitude is not null and address_altitude_units is not null))
```

#### References

| Columns | Target | On delete |
|---|---|---|
| `practitioner_id` | [`practitioner`](/docs/tables/practitioner) | cascade |

#### Indexes

- `practitioner_other_address_practitioner_id_idx` on `practitioner_id`

