NHS Digital FHIR Implementation Guide (Retired - 2.1.50)

This guidance is under active development by NHS Digital and content may be added or updated on a regular basis.

NHSDigital-PractitionerRole

Conformance Url
https://fhir.nhs.uk/StructureDefinition/NHSDigital-PractitionerRole

A specific set of Roles/Locations/specialties/services that a practitioner may perform at an organization for a period of time. This also links together the Practitioner, the Organisation (NHS Trust or GP Practice) and in secondary care the HealthcareService (clinic).



UK Core PractitionerRole

idΣ0..1string
metaΣ0..1Meta
implicitRulesΣ ?!0..1uri
language0..1codeBinding
text0..1Narrative
contained0..*Resource
extensionI0..*Extension
modifierExtension?! I0..*Extension
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uriFixed Value
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uriFixed Value
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
activeΣ0..1boolean
periodΣ I0..1Period
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ0..1uri
valueΣ0..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
id0..1string
extensionI0..*Extension
systemΣ1..1uri
versionΣ0..1string
codeΣ1..1code
displayΣ0..1string
userSelectedΣ0..1boolean
id0..1string
extensionI0..*Extension
systemΣ0..1uriFixed Value
versionΣ0..1string
codeΣ0..1code
displayΣ0..1string
userSelectedΣ0..1boolean
textΣ0..1string
id0..1string
extensionI0..*Extension
id0..1string
extensionI0..*Extension
systemΣ1..1uri
versionΣ0..1string
codeΣ1..1code
displayΣ1..1string
userSelectedΣ0..1boolean
id0..1string
extensionI0..*Extension
systemΣ0..1uriFixed Value
versionΣ0..1string
codeΣ0..1code
displayΣ0..1string
userSelectedΣ0..1boolean
id0..1string
extensionI0..*Extension
systemΣ0..1uriFixed Value
versionΣ0..1string
codeΣ0..1code
displayΣ0..1string
userSelectedΣ0..1boolean
textΣ0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
systemΣ I0..1codeBinding
valueΣ1..1string
useΣ ?!1..1codeBinding
rankΣ0..1positiveInt
periodΣ I0..1Period
id0..1string
extensionI0..*Extension
modifierExtensionΣ ?! I0..*Extension
daysOfWeek0..*codeBinding
allDay0..1boolean
availableStartTime0..1time
availableEndTime0..1time
id0..1string
extensionI0..*Extension
modifierExtensionΣ ?! I0..*Extension
description1..1string
duringI0..1Period
availabilityExceptions0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ0..1uri
valueΣ0..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string

from UK Core PractitionerRole
idΣ0..1string
metaΣ0..1Meta
implicitRulesΣ ?!0..1uri
language0..1codeBinding
text0..1Narrative
contained0..*Resource
extensionI0..*Extension
modifierExtension?! I0..*Extension
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uriFixed Value
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uriFixed Value
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
activeΣ0..1boolean
periodΣ I0..1Period
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ0..1uri
valueΣ0..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
id0..1string
extensionI0..*Extension
systemΣ1..1uri
versionΣ0..1string
codeΣ1..1code
displayΣ0..1string
userSelectedΣ0..1boolean
id0..1string
extensionI0..*Extension
systemΣ0..1uriFixed Value
versionΣ0..1string
codeΣ0..1code
displayΣ0..1string
userSelectedΣ0..1boolean
textΣ0..1string
id0..1string
extensionI0..*Extension
id0..1string
extensionI0..*Extension
systemΣ1..1uri
versionΣ0..1string
codeΣ1..1code
displayΣ1..1string
userSelectedΣ0..1boolean
id0..1string
extensionI0..*Extension
systemΣ0..1uriFixed Value
versionΣ0..1string
codeΣ0..1code
displayΣ0..1string
userSelectedΣ0..1boolean
id0..1string
extensionI0..*Extension
systemΣ0..1uriFixed Value
versionΣ0..1string
codeΣ0..1code
displayΣ0..1string
userSelectedΣ0..1boolean
textΣ0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ1..1uri
valueΣ1..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string
id0..1string
extensionI0..*Extension
systemΣ I0..1codeBinding
valueΣ1..1string
useΣ ?!1..1codeBinding
rankΣ0..1positiveInt
periodΣ I0..1Period
id0..1string
extensionI0..*Extension
modifierExtensionΣ ?! I0..*Extension
daysOfWeek0..*codeBinding
allDay0..1boolean
availableStartTime0..1time
availableEndTime0..1time
id0..1string
extensionI0..*Extension
modifierExtensionΣ ?! I0..*Extension
description1..1string
duringI0..1Period
availabilityExceptions0..1string
id0..1string
extensionI0..*Extension
referenceΣ I0..1string
typeΣ0..1uriBinding
id0..1string
extensionI0..*Extension
useΣ ?!0..1codeBinding
typeΣ0..1CodeableConceptBinding
systemΣ0..1uri
valueΣ0..1string
periodΣ I0..1Period
assignerΣ I0..1Reference()
displayΣ0..1string

keyhumanseverityexpression
role-spuriousSpurious Code format must be G6NNNNNN or G7NNNNNNwarningidentifier.where(system='https://fhir.hl7.org.uk/Id/nhsbsa-spurious-code').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/nhsbsa-spurious-code').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/nhsbsa-spurious-code').value.matches('^[G]{1}[67]{1}[0-9]{6}$'))
role-sds-role-profileSDS Role Profile Id must be 12 digitswarningidentifier.where(system='https://fhir.nhs.uk/Id/sds-role-profile-id').exists().not() or (identifier.where(system='https://fhir.nhs.uk/Id/sds-role-profile-id').exists() and identifier.where(system='https://fhir.nhs.uk/Id/sds-role-profile-id').value.matches('^[0-9]{12}$'))
nhsd-2PractitionerRole.practitioner - An identifier reference plus a display name or resource reference must be providederror(reference.exists() or (identifier.exists() and display.exists()))
role-nmcNMC must be of the format NNANNNNAwarningidentifier.exists().not() or identifier.where(system='https://fhir.hl7.org.uk/Id/nmc-number').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/nmc-number').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/nmc-number').value.matches('^[0-9]{2}[A-Z]{1}[0-9]{4}[A-Z]{1}$'))
role-gmpGMP must be of the format GNNNNNNN and not be a spurious code (starts with G6 or G7)warningidentifier.exists().not() or identifier.where(system='https://fhir.hl7.org.uk/Id/gmp-number').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/gmp-number').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/gmp-number').value.matches('^[G]{1}[01234589]{1}[0-9]{6}$'))
role-gmcGMC must be of the format CNNNNNNNwarningidentifier.exists().not() or identifier.where(system='https://fhir.hl7.org.uk/Id/gmc-number').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/gmc-number').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/gmc-number').value.matches('^[C]{1}[0-9]{7}$'))
role-gphcGPHC must be of the format NNNNNNNwarningidentifier.exists().not() or identifier.where(system='https://fhir.hl7.org.uk/Id/gphc-number').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/gphc-number').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/gphc-number').value.matches('^[0-9]{7}$'))
role-hcpcHCPC must be of the format AANNNNNNwarningidentifier.exists().not() or identifier.where(system='https://fhir.hl7.org.uk/Id/hcpc-number').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/hcpc-number').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/hcpc-number').value.matches('^[A-Z]{2}[0-9]{6}$'))
role-dinDIN format must be NNNNNNwarningidentifier.exists().not() or identifier.where(system='https://fhir.hl7.org.uk/Id/din-number').exists().not() or (identifier.where(system='https://fhir.hl7.org.uk/Id/din-number').exists() and identifier.where(system='https://fhir.hl7.org.uk/Id/din-number').value.matches('^[0-9]{6}$'))
role-sds-userProfessional code (GMC, GMP, NMC, etc) is preferred.warningidentifier.exists().not() or identifier.where(system='https://fhir.nhs.uk/Id/sds-user-id').exists().not()
nhsd-1PractitionerRole.organization - An identifier reference plus a display name or resource reference must be providederror(reference.exists() or (identifier.exists() and display.exists()))
nhsd-3PractitionerRole.location - An identifier or resource reference must be providederror(reference.exists() or identifier.exists())
nhsd-4PractitionerRole.healthcareService - An identifier reference plus a display name or resource reference must be providederror(reference.exists() or (identifier.exists() and display.exists()))



Must Support, Optional and Not Supported

Elements marked with a S MUST be supported by both producing and receiving systems. They should be populated if the data exists or the profile has made them mandatory.

The following elements SHOULD NOT are not expected to be supported by consuming or receiving systems.

  • endpoint

Elements that are neither marked as Must Support or listed as unsupported, are optional.


identifier

FHIR identifier OID/HL7v3 HL7v2 ITK Format Description Professional Code Prescribing Code
https://fhir.hl7.org.uk/Id/nhsbsa-spurious-code G[67]NNNNNN NHS BSA Spurious Code GENERAL MEDICAL PRACTITIONER PPD CODE No Yes
https://fhir.nhs.uk/Id/sds-role-profile-id 1.2.826.0.1285.0.2.0.67 12 digits SDS Role Profile Code No No

The SDS Role Profile Code should be sourced from NHS Identity (SmartCard), this is also held within the Spine Directory Service LDAP database.

Holds NHS BSA spurious codes which are role specific Doctor Index Number (DIN)) codes. NHS BSA spurious codes are issued when a doctor issues medication outside of their normal role, normally at another organisation. In the example below, the doctor is working in a secondary role (with SDS Role Id of 100102238986), as this a has a spurious code of 2345213. If the doctor was prescribing in their primary role this spurious code would be absent.

{
  "resourceType": "PractitionerRole",
  ...
  "identifier": [
          {
            "system": "https://fhir.nhs.uk/Id/sds-role-profile-id",
            "value": "100102238986"
          },
          {
            "system": "https://fhir.hl7.org.uk/Id/nhsbsa-spurious-code",
            "value": "2345213"
          }
        ],
  ...
}

practitioner

This MUST either be a reference to a Practitioner resource or an identifier reference plus a display. In both cases the referenced resource or identfier reference should contain a professional code.

It is recommended an identifier reference and display (practioner full name) is included. This identifier should be the Practitioner's primary professional code (see NHSDigital-Practitioner for details on professional codes).

"practitioner": {
        "display": "Dr Smith",
        "identifier": {
            "system": "https://fhir.hl7.org.uk/Id/gmc-number",
            "value": "C9876543"
          }
    },

For EPS, currently a Resource reference is required.

"practitioner": {
        "reference": "urn:uuid:1557E58E-3B1E-41DD-B3B5-D4D393DC5A3D",
        "display": "Dr Smith"
    },

organisation

This MUST either be a reference to a Organization resource or an identifier reference. In both cases the reference must contain an ANANA/ODS organisation code.

organisation resource references

It is recommended an identifier reference is included.

"organization": {
        "identifier": {
            "system": "https://fhir.nhs.uk/Id/ods-organization-code",
            "value": "RBA"
          },
        "display": "TAUNTON AND SOMERSET NHS FOUNDATION TRUST"
    }

Optionally Resource reference can be provided. This is required in the current version of EPS but this will be changed to supporting the identifier reference only.

"organization": {
        "reference": "urn:uuid:17c4270d-6966-4788-8cbc-1d1d63536b25",
        "identifier": {
            "system": "https://fhir.nhs.uk/Id/ods-organization-code",
            "value": "RBA"
          },
        "display": "TAUNTON AND SOMERSET NHS FOUNDATION TRUST"
    }

(role) code

A code from UKCoreSDSJobRoleName. Only supply if this is known (e.g. sourced from smartcard or SDS API).

"code":  [
        {
            "coding":  [
                {
                    "system": "https://fhir.hl7.org.uk/CodeSystem/UKCore-SDSJobRoleName",
                    "code": "R0260",
                    "display": "General Medical Practitioner"
                }
            ]
        }
    ],

specialty

A code from NHSDataDictionaryMainClinicalSpecialty which is a FHIR representation of NHS Data Dictionary - MAIN SPECIALTY CODE. This is also the CodeSystem used (when applicable) in the Organisation Data Downloads

This is should be the specialty linked to the role and is not necessarily the practitioners main specialty.

This can be supplemented by SNOMED CT codes from PracticeSettingCodeValueSet, no ConceptMap currently exists for mapping between the two.

 "specialty": [
        {
            "coding": [
                {
                    "system": "https://fhir.nhs.uk/CodeSystem/NHSDataModelAndDictionary-clinical-specialty",
                    "code": "100",
                    "display": "GENERAL SURGERY"
                }
            ]
        }
    ],

location

The contact address for the practitioner for the service they are providing in this role. This will often be the surgery address, clinic or service address.

If using ODS Codes, the address on ODS must be checked to ensure it is correct. If the address is not correct, then Resource reference MUST be supplied.

"location":  [
         {
            "identifier": {
              "system": "https://fhir.nhs.uk/Id/ods-organization-code",
              "value": "RCB55"
            }
            "display": "YORK HOSPITAL"
          }
  ]

For EPS, currently a Resource reference is required.

"location":  [
         {
            "reference": "urn:uuid:ecc2db8e-3757-4758-a4f1-7f4c7e06662f",
            "display": "YORK HOSPITAL"
          }
  ]

healthcareService

SHOULD be provided for a practitioner in secondary care and will be a reference to clinic or service. This referenced resource or the identifier reference SHOULD contain a ODS/ANANA identifier. In secondary care Electronic Prescription Service (EPS) this will also be called prescribing cost centre. This is used for reimbursements from NHS BSA. In secondary care the healthchare/service cost centre may also be the ODS code for the clinic.

healthcareService Resource reference

An identifier reference MUST be included. For secondary care organisations this will be the ODS/ANANA Cost Centre code given to a clinic.

"healthcareService":  
    [
         {
            "identifier": {
              "system": "https://fhir.nhs.uk/Id/ods-organization-code",
              "value": "A99968"
            }
            "display": "SOMERSET BOWEL CANCER SCREENING CENTRE"
          }
    ]

Optionally Resource reference can be provided. This is required in the current version of EPS but this will be changed to supporting the identifier reference only.

"healthcareService":  
    [
         {
            "reference": "urn:uuid:54b0506d-49af-4245-9d40-d7d64902055e",
            "identifier": {
              "system": "https://fhir.nhs.uk/Id/ods-organization-code",
              "value": "A99968"
            }
            "display": "SOMERSET BOWEL CANCER SCREENING CENTRE"
          }
    ]

telecom

At least one telecom number MUST be provided. Contact details that are specific to the role/location/service. Often practitioners have a dedicated line for each location (or service) that they work at and need to be able to define separate contact details for each of these.

This is not the personnel contact number of the Practitioner, it the contact number for the practitioner in this role and may be the phone number of the clinic, main or branch surgery.

"telecom": [
          {
            "system": "phone",
            "value": "01234567890",
            "use": "work"
          }
        ]


Search Parameters

Name Type Description Conformance Path
identifier token A practitioner's Identifier SHOULD PractitionerRole.identifier
organization:identifier token The identity of the organisation the practitioner represents / acts on behalf of SHOULD PractitionerRole.organization (Organization)
practitioner:identifier token Practitioner that is able to provide the defined services for the organisation SHALL PractitionerRole.practitioner (Practitioner)

Additional parameters can be on PractitionerRole - Search Parameters

Mandatory Search Parameters

practitioner:identifier

SHALL support searching practitioner role by practitioner:identifier:

GET [base]/PractitionerRole?practitioner:identifier={system|}[code]

Example:

GET [base]/PractitionerRole?practitioner:identifier=https://fhir.hl7.org.uk/Id/gphc-number|97860456

Optional Search Parameters

identifier

SHOULD support searching practitioner role by identifier:

GET [base]/PractitionerRole?identifier={system|}[code]

Example:

GET [base]/PractitionerRole?identifier=https://fhir.nhs.uk/Id/sds-role-profile-id|100102238986

organization:identifier

SHOULD support searching practitioner role by organisation:identifier:

GET [base]/PractitionerRole?organization:identifier={system|}[code]

Example:

GET [base]/PractitionerRole?organization:identifier=https://fhir.nhs.uk/Id/ods-organization-code|RTG

back to top