FHIR Terminology Ecosystem IG, published by HL7 FHIR Product Director. This guide is not an authorized publication; it is the continuous build for version 1.6.6 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/fhir-tx-ecosystem-ig/ and changes regularly. See the Directory of published versions
This document describes the requirements for all servers that are part of the HL7 terminology ecosystem. Note that systems do not need to conform to these requirements to be described as 'FHIR Terminology servers', but they do not need to conform to these requirements to be part of the ecosystem.
All systems need to conform to the following requirements:
{root}/metadata
CapabilityStatement.fhirVersion
and CapabilityStatement.rest[mode = server].security.service properties
CapabilityStatement.instantiates
value of http://hl7.org/fhir/CapabilityStatement/terminology-server
{root}/metadata?mode=terminology
A 'supported
' CodeSystem is any code system that the server supports correctly for calls to $expand
, $validate-code
, and $lookup
.
A 'pre-defined
' CodeSystem is any value set that the server makes available through the /CodeSystem
endpoint.
There are two kinds of servers that are made available to the ecosystem: general purpose terminology servers that support arbitrary CodeSystem resources, and servers that are code system specific - they only support one code system (or a select short list of CodeSystems).
Servers are encouraged to make all the code systems that they support available on the /CodeSystem
endpoint (search/read) but
they do not have to, and code systems such as SNOMED CT and LOINC often are not. But they must be listed in the
TerminologyCapabilities statement so that the ecosystem knows which code systems the server supports.
TerminologyCapabilities.codeSystem.uri
, and all the versions in TerminologyCapabilities.codeSystem.version.code
. Code systems SHALL be listed here whether or not they are available through code system search/CodeSystem
endpoint for search and read operationsurl
and version
search parametersNote that it's the bigger code systems such as SNOMED CT and LOINC that might not be available through /CodeSystem
. Also note that the
terminology ecosystem does not make use of any search parameters
/CodeSystem
/CodeSystem
MAY have content = not-present
; the tools will not consider this when choosing whether to try using the code system (uses TerminologyCapabilities.codeSystem.uri
)Servers are encouraged to ensure that all code systems conform to the ShareableCodeSystem Profile found in the CRMI specification, but this is not a technical requirement for being part of the ecosystem.
It's up to the server how to manage what content they support and implement. Servers can choose to support update/create if they want, though it SHOULD only do so for authenticated clients.
Servers SHALL ensure that they only send correct results for the code systems for which it is registered as 'authoritative' (e.g., not allow not appropriately authorised users to change the results by posting resources)
All predefined code systems SHALL have a web representation that is appropriate for a human to look at (see below)
Terminology servers can choose to accept CodeSystems in the tx-resource parameter. General purpose servers SHALL do this (and are required to do this to pass the general tests).
Terminology servers SHOULD support passing CodeSystem supplements, particularly language packs. Servers that don't support language packs should only choose not to support language packs when there is governance over the use of language translations, and only by negotiation with the terminology ecosystem managers (see also notes below)
Servers SHALL indicate their support or not for passing CodeSystem supplements in the tx-resource parameter using [tbd]
Servers intended to be used as the primary server for the validator and IG publisher SHALL accept CodeSystems in the tx-resource parameter. (e.g. this rule does not apply servers registered with the ecosystem)
Servers are required to support code system supplements. Specifically, this means:
Servers are required to support the following properties in the CodeSystem resource:
CodeSystem.caseSensitive
SHALL be supported: validation SHALL correctly check case. In the case of non-case sensitive code systems, expansions SHOULD just contain the code as defined (in the code system or the value set enumeration), and not all the case variants that could be generated.
CodeSystem.valueSet
. Tbd what this means
CodeSystem.hierarchyMeaning
. If the code system defines a hierarchy, both $expand
and $validate
SHALL correctly handle the hierarchy when interpreting filters and validating codes
CodeSystem.compositional
. A server SHALL not accept compositional grammars for codes unless the CodeSystem is marked as Compositional. Servers that do not know the grammar for a CodeSystem that is marked as compositional SHALL note this in validation errors for the CodeSystem
CodeSystem.versionNeeded
. If a CodeSystem says that version is needed, the $validate-code
operation SHALL check that version is populated, and return an error if it's not
CodeSystem.content
. Servers SHALL not process $expand
or $validate-code
requests on CodeSystems that have content = not-present
or example
. Servers SHALL reflect content = fragment
in an error message if the code is not valid against a fragment.
CodeSystem.supplements
. Servers SHALL not mistake supplements and code systems for each other.
A 'supported
' value set is any value set that can be used in $expand
or $validate-code
operations, including value sets imported into other value sets, and including implicit value sets. A 'pre-defined
' value set is any value set that the server makes available through the /ValueSet
endpoint.
All servers are required to fully support value sets as defined in this document (per below).
/ValueSet
endpoints for search and read operationsurl
and version
search parameters_summary
search parameterServers are encouraged to ensure that all value sets conform to the ShareableValueSet Profile found in the CRMI specification, but this is not a technical requirement for being part of the ecosystem.
It's up to the server how to manage what content they support and implement. Servers can choose to support update/create if they want, though it SHOULD only do so for authenticated clients.
$expand
and $validate-code
operations.TerminologyCapabilities.expansion.parameter
ValueSet.compose
ValueSet.compose.include
and ValueSet.compose.exclude
Servers SHALL support extensionally defined value sets (by enumerating codes in ValueSet.compose.in | exclude.concept) |
The ecosystem makes no rules - at this time - about the handling of value sets that have an expansion with no definition.
The content on that page MAY be static or active; it is at the discretion of the server to decide what's on the page, but it SHOULD be more than just the json/xml for the resource (and it isn't limited to information in the resource, e.g. the server MAY choose to make additional process/provenance/context information available)
The server MAY choose to make this content available at the end-point for the relevant resource. e.g. a request for {root}/CodeSystem/123
with an Accept
header of 'application/fhir+json' returns the resource, and the same URL with an Accept
header of 'text/html' returns a web page suitable for human consumption. Servers are not required to do this; they MAY choose to make the content available elsewhere.
If the server chooses to make them available elsewhere, it SHALL populate the extension http://hl7.org/fhir/tools/StructureDefinition/web-source
in any resources it makes available with a valueUrl
where the web view can be found. This SHALL be populated when the CodeSystem and ValueSet are read, and also in any $expand
of the value set (just for the root value set in this case).
If a server receives a terminology resource it does not process correctly, it SHALL return an error
If it does, it SHALL report so in TerminologyCapabilities.expansion.parameter.name
(this parameter makes a big difference to performance for clients, significantly reducing network utilization)
count
parameter (offset
is used, but will always be 0)system-version
, check-system-version
, and force-system-version
displayLanguage
parameter and Accept-Language header, as specified in Languages)excludeNested
, includeDesignations
, activeOnly
, includeDefinition
, property
, designation
parametersCoding
, and CodeableConcept
$expand
)issues
parameter when there are issues to returnx-caused-by-unknown-system
parameter for each code system it did not supportnormalized-code
parameter where appropriate (e.g. case insensitive code systems, code systems with complex grammars)processing-note
when it has not fully validated the code e.g. an SCT expression against the MRCMThe following extensions SHALL be supported:
http://hl7.org/fhir/StructureDefinition/codesystem-alternate
- if code system has alternate codes (TODO: this is subject to further discussion)http://hl7.org/fhir/StructureDefinition/codesystem-conceptOrder
- if code system has order, then this SHOULD be echoed (nothing else needed)http://hl7.org/fhir/StructureDefinition/codesystem-label
- if code system supports 'labels', then this SHOULD be echoed (nothing else needed)http://hl7.org/fhir/StructureDefinition/coding-sctdescid
- if sct is in scope (exact use cases need discussion)http://hl7.org/fhir/StructureDefinition/itemWeight
- echo in value set if defined in code system or value sethttp://hl7.org/fhir/StructureDefinition/rendering-style
- echo in value set if defined in code system or value sethttp://hl7.org/fhir/StructureDefinition/rendering-xhtml
- echo in value set if defined in code system or value sethttp://hl7.org/fhir/StructureDefinition/valueset-concept-definition
- populate if requested in expansion requesthttp://hl7.org/fhir/StructureDefinition/valueset-deprecated
- populate in the response if code system concept is deprecatedhttp://hl7.org/fhir/StructureDefinition/valueset-supplement
- check for this, blow up if supplement is properly supportedhttp://hl7.org/fhir/StructureDefinition/valueset-label
- echo in value set if defined in code system or value sethttp://hl7.org/fhir/StructureDefinition/valueset-conceptOrder
- echo in value set if defined in code system or value setNote that some of these extensions may be supported by rejecting instances that contain them, depending on the specific use cases that the server supports. E.g., if the server does not support externally derived code systems then the code system extensions are not relevant.