This page is part of the FHIR Specification (v1.2.0: STU 3 Draft). The current version which supercedes this version is 5.0.0. For a full list of available versions, see the Directory of published versions . Page versions: R5 R4B R4 R3 R2
This specification defines a series of different types of resource that can be used to exchange and/or store data in order to solve a wide range of healthcare related problems, both clinical and administrative. In addition, this specification defines several different ways of exchanging the resources.
A resource is an entity that:
Resources have multiple representations.
The following optional elements and properties are defined for all resources:
Most resources are derived from Domain Resources - so they also can contain text, contained resources, extensions, and data elements specific to the particular domain of the resource. There is a special type of resource called Bundle for collections of resources.
Note: there is documentation for the Structure, UML, XML, and JSON representations of the resource structure.
Structure
Name | Flags | Card. | Type | Description & Constraints |
---|---|---|---|---|
Resource | n/a | Base Resource | ||
id | Σ | 0..1 | id | Logical id of this artifact |
meta | Σ | 0..1 | Meta | Metadata about the resource |
implicitRules | ?! Σ | 0..1 | uri | A set of rules under which this content was created |
language | 0..1 | code | Language of the resource content Language (Required) | |
Documentation for this format |
UML Diagram
XML Template
<[name] xmlns="http://hl7.org/fhir"> <!-- from Element: extension --> <id value="[id]"/><!-- 0..1 Logical id of this artifact --> <meta><!-- 0..1 Meta Metadata about the resource --></meta> <implicitRules value="[uri]"/><!-- 0..1 A set of rules under which this content was created --> <language value="[code]"/><!-- 0..1 Language of the resource content --> </[name]>
JSON Template
{ "resourceType" : "[name]", "id" : "<id>", // Logical id of this artifact "meta" : { Meta }, // Metadata about the resource "implicitRules" : "<uri>", // A set of rules under which this content was created "language" : "<code>" // Language of the resource content }
Structure
Name | Flags | Card. | Type | Description & Constraints |
---|---|---|---|---|
Resource | n/a | Base Resource | ||
id | Σ | 0..1 | id | Logical id of this artifact |
meta | Σ | 0..1 | Meta | Metadata about the resource |
implicitRules | ?! Σ | 0..1 | uri | A set of rules under which this content was created |
language | 0..1 | code | Language of the resource content Language (Required) | |
Documentation for this format |
XML Template
<[name] xmlns="http://hl7.org/fhir"> <!-- from Element: extension --> <id value="[id]"/><!-- 0..1 Logical id of this artifact --> <meta><!-- 0..1 Meta Metadata about the resource --></meta> <implicitRules value="[uri]"/><!-- 0..1 A set of rules under which this content was created --> <language value="[code]"/><!-- 0..1 Language of the resource content --> </[name]>
JSON Template
{ "resourceType" : "[name]", "id" : "<id>", // Logical id of this artifact "meta" : { Meta }, // Metadata about the resource "implicitRules" : "<uri>", // A set of rules under which this content was created "language" : "<code>" // Language of the resource content }
Path | Definition | Type | Reference |
---|---|---|---|
Resource.language | A human language. | Required | IETF language tag |
Each resource has an "id" element which contains the logical identity of the resource assigned by the server responsible for storing it. Resources always have a known identity except for the special case when a new resources is being sent to a server to assign an identity (create interaction). The logical identity is unique within the space of all resources of the same type on the same server. Once assigned, the identity is never changed. Note that if the resource is copied to another server, the copy might not be able to retain the same logical identity.
The literal identity of a resource - the actual HTTP address it which it can be accessed - is an absolute URL constructed from the server base address at which it is found, the resource type, and the Logical Id, such as http://test.fhir.org/rest/Patient/123 (where 123 is the Logical Id). Note that implementations SHOULD NOT assume that the identity of a resource is always resolvable to a literal server - it may be temporarily unavailable, or not available by policy (e.g. firewalls) or in some cases, it may not actually exist (e.g. use of resource outside a RESTful environment). Resources reference each other by their identity. These references are allowed to be absolute or relative (see Resource References for further discussion). Copying or moving resources from one server to another means that resources acquire a new identity. For further details, see Managing Resource Identity.
Logical ids (and therefore literal identities) are case sensitive. Logical Ids are always opaque, and external systems need not and should not attempt to determine their internal structure. A logical id SHALL always be represented in the same way in resource references and URLs. Ids can be up to 64 characters long, and contain any combination of upper and lowercase ASCII letters, numerals, "-" and ".".
In addition to the logical id and literal identity discussed above, many resources contain an element named "identifier", which, if populated, contains a different kind of identifier. As resources are copied from server to server, their literal identity will change, and their logical id may change.
However, all copies of the resource refer to the same underlying concept, and this concept may also be represented in other formats (variously, HL7 v2 , CDA , XDS, and many more). Each representation carries the same identifier that identifies it consistently across all contexts of use. This is known as the business identifier, and is found in the identifier element. In a few resources, there is a url element that serves a similar purpose, but is constrained to be a literal URL for implementation reasons.
All resources that have an identifier
element support searching
by the identifier, so that records can located by that method. So if
an HL7 v2 message has the following OBR:
OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE^LN|||200202150730|...
Then the DiagnosticReport it represents can be located using the following query:
GET [base]/DiagnosticReport?identifier=1045813
If a FHIR server is a stable server that is the canonical master source for the definition of a concept, the business identifier for all systems may be the same as the literal identity of the resource on the master server.
Each resource contains an element "meta", of type "Meta", which is a set of metadata that provides technical and workflow context to the resource. The metadata items are all optional, though some of all of them may be required in particular implementations or contexts of use.
Metadata Item | Type | Usage |
---|---|---|
versionId (0..1) | id | Changes each time the content of the resource changes. Can be referenced in a resource reference.
Can be used to ensure that updates are based on the latest version of the resource.
The version can be globally unique, or scoped by the Logical Id of the resource. Version identifiers are generally either a serially incrementing id scoped by the logical id, or a uuid, though neither of these approaches is required. There is no fixed order for version ids - clients cannot assume that a versionId that comes after another one either numerically or alphabetically represents a later version. The same versionId can never be used for more than one version of the same resource. Note that servers SHOULD support versions, but some are unable to |
lastUpdated (0..1) | instant | If populated, this value changes each time the content of the resource changes. it can be used by a system or a human to judge the currency of the resource content. Note that version aware updates do not use this element |
profile (0..*) | uri | An assertion that the content conforms to a resource profile (a StructureDefinition). See Extending and Restricting Resources for further discussion. Can be changed as profiles and value sets change or the system rechecks conformance |
security (0..*) | Coding | Security labels applied to this resource. These tags connect resources in specific ways to the overall security policy and infrastructure. Security tags can be updated when the resource changes, or whenever the security sub-system chooses to |
tag (0..*) | Coding | Tags applied to this resource. Tags are used to relate resources to process and workflow. Applications are not required to consider the tags when interpreting the meaning of a resource. |
Structure
Name | Flags | Card. | Type | Description & Constraints |
---|---|---|---|---|
Meta | Σ | Element | Metadata about a resource | |
versionId | Σ | 0..1 | id | Version specific identifier |
lastUpdated | Σ | 0..1 | instant | When the resource version last changed |
profile | Σ | 0..* | uri | Profiles this resource claims to conform to |
security | Σ | 0..* | Coding | Security Labels applied to this resource All Security Labels (Extensible) |
tag | Σ | 0..* | Coding | Tags applied to this resource |
Documentation for this format |
UML Diagram
XML Template
<meta xmlns="http://hl7.org/fhir"> <!-- from Element: extension --> <versionId value="[id]"/><!-- 0..1 Version specific identifier --> <lastUpdated value="[instant]"/><!-- 0..1 When the resource version last changed --> <profile value="[uri]"/><!-- 0..* Profiles this resource claims to conform to --> <security><!-- 0..* Coding Security Labels applied to this resource --></security> <tag><!-- 0..* Coding Tags applied to this resource --></tag> </meta>
JSON Template
{ // from Element: extension "versionId" : "<id>", // Version specific identifier "lastUpdated" : "<instant>", // When the resource version last changed "profile" : ["<uri>"], // Profiles this resource claims to conform to "security" : [{ Coding }], // Security Labels applied to this resource "tag" : [{ Coding }] // Tags applied to this resource }
Structure
Name | Flags | Card. | Type | Description & Constraints |
---|---|---|---|---|
Meta | Σ | Element | Metadata about a resource | |
versionId | Σ | 0..1 | id | Version specific identifier |
lastUpdated | Σ | 0..1 | instant | When the resource version last changed |
profile | Σ | 0..* | uri | Profiles this resource claims to conform to |
security | Σ | 0..* | Coding | Security Labels applied to this resource All Security Labels (Extensible) |
tag | Σ | 0..* | Coding | Tags applied to this resource |
Documentation for this format |
XML Template
<meta xmlns="http://hl7.org/fhir"> <!-- from Element: extension --> <versionId value="[id]"/><!-- 0..1 Version specific identifier --> <lastUpdated value="[instant]"/><!-- 0..1 When the resource version last changed --> <profile value="[uri]"/><!-- 0..* Profiles this resource claims to conform to --> <security><!-- 0..* Coding Security Labels applied to this resource --></security> <tag><!-- 0..* Coding Tags applied to this resource --></tag> </meta>
JSON Template
{ // from Element: extension "versionId" : "<id>", // Version specific identifier "lastUpdated" : "<instant>", // When the resource version last changed "profile" : ["<uri>"], // Profiles this resource claims to conform to "security" : [{ Coding }], // Security Labels applied to this resource "tag" : [{ Coding }] // Tags applied to this resource }
Note that the RESTful API defines some Operations that provide direct read and write access to the meta element.
All resources are conceptually versioned, and each resource sits at the head of a linear list of past versions. The past versions are superseded by the current version, and only available for audit/integrity purposes. The current version is e.g. http://acme.org/fhir/ResourceType/id123, and a past version would be http://acme.org/fhir/ResourceType/id123/_history/v2.
Note that there's no requirement for servers to keep a history. The history interaction is provided for where this is an appropriate service to provide. However, whether a server keeps them or not, past versions are dead and gone. The current version of the resource is in the Resource.meta.versionId. For a value set this would be:
<ValueSet> <meta> <versionId value="v2"/> </meta> </ValueSet>
That version changes every time the server updates the resource and writes a new version over the top of an existing one.
Some resources have another version marker in them. For instance, ValueSet has another version in it:
<ValueSet> <url value="http://acme.com/fhir/ValueSet/example"/> <version value="2.0"/> </ValueSet>
This says that this is version 2.0 of the 'example' value set. This is the business version of the value set, the one that humans get involved with. These 2 versions elements have quite different lifecycles. To illustrate, take these cases:
A reference to a custom agreement about how the resources are used that was followed when the resource was constructed, and which must be understood when processing the content.
Asserting this rule set restricts the content to be only understood by a limited set of trading partners. This inherently limits the usefulness of the data in the long term, and should be avoided where possible. However, the existing health eco-system is highly fractured, and not yet ready to define, collect, and exchange data in a generally exchangeable sense.
Note that resources are almost always constructed following some custom agreement. Best practice is that such agreements make all knowledge about the content of the resource explicit; if custom agreements do this, and declare their extensions as required, then it is not necessary to understand the agreement when processing the resource content.
Each resource may have a language element that specifies the base language of the content using a code defined in BCP 47 . The language element is provided to support indexing and accessibility (e.g. text-to-speech use the language tag).
There is no default language, though one may be inferred from the context of use. Not all of the content of the resource has to be in the specified language.
If a language is specified, it should also be specified on the Narrative Text. The html language tag in the narrative is used when processing the narrative. The language tag on the resource is provided so that applications processing the data in the resource can specify the language of any alternate presentations generated from the data.
These 3 metadata attributes are part of the resource, but are never used to keep information that needs to be understood when interpreting the content of a resource; their function is limited to finding and controlling access to the resource, and connecting resources to technical or clinical workflow.
Tags are used to associate additional operational information with the Resources, including such as workflow management. A typical use of tagging would be to maintain an informal list of resources that need review.
In a general tag, the coded concept may be a reference to a healthcare vocabulary, including ones defined in this specification, or vocabularies such as those defined by HL7 for other purposes (e.g. HL7 v2 and HL7 v3 /CDA ), LOINC, or SNOMED CT. Alternatively, the concept may be one defined by the implementation in the local context.
The list of tags on a resource is a set, where each tag is unique based on the
system
+code
combination.
A profile assertion represents a claim that the resource conforms to the identified StructureDefinition, which makes rules about what content is allowed to be in a resource. In a profile tag, the term is a URL that references an identified StructureDefinition resource.
It's always possible to determine whether a resource conforms to any profile simply by testing it against the profile (the validation tools provide the functionality to perform this test in a variety of contexts). However there are several circumstances where simply examining whether a resource conforms to a particular profile as needed is impractical:
Profile Tags serve these use cases - a client/creator of a resource can tag the resource with an assertion that the resource conforms to a particular structure definition. The server/receiver of the resource can choose to take this assertion at face value, or to assist in locating the correct StructureDefinition against which to validate the resource.
Note: resources can conform to multiple profiles at once. A resource can conform to a profile without ever being labeled that it does, or a resource may falsely claim to conform to a profile. For this reason, applications processing resources SHOULD always depend on the contents of the resource when processing them, and/or check resources against the StructureDefinitions directly rather than relying the existence of profile tags for meaning. Profile Tags are provided as a method of finding resources that conform to a particular StructureDefinition, not statements of meaning about the resource.
Many trading partner agreements will make rules about what claims can be made and when they must be tested, which will make the profile assertion more reliable.
The list of profiles on a resource is a set, where each profile is unique based the value
of the URI.
A security label is attached to a resource to provide specific security metadata about the information in the resource. For further information, see Security Labels.
The list of security on a resource is a set, where each tag is unique based on the
system
+code
combination.
When a resource is updated (e.g. on the RESTful interface), servers generally follow this pattern:
However, in some cases, an update may invalidate existing tags. Servers may update or remove previously existing recognized tags if this is known to be appropriate.
All resources in this specification are assigned a "Maturity Level", known as FMM (after the well known CMM grades). The FMM level can be used by implementers to judge how advanced - and therefore stable - a resource is. The following FMM levels are defined:
The Maturity level is strongly related to stability; the higher the maturity level, the more controls are enforced to restrict breaking changes to the resource. For further information, and discussion, see the FHIR Wiki .
Common search parameters defined by this resource. See Searching for more information about searching in REST, messaging, and services.
Name | Type | Description | Paths |
_content | string | Search on the entire content of the resource | |
_id | token | Logical id of this artifact | Resource.id |
_lastUpdated | date | When the resource version last changed | Resource.meta.lastUpdated |
_profile | uri | Profiles this resource claims to conform to | Resource.meta.profile |
_query | token | A custom search profile that describes a specific defined query operation | |
_security | token | Security Labels applied to this resource | Resource.meta.security |
_tag | token | Tags applied to this resource | Resource.meta.tag |
_text | string | Search on the narrative of the resource |