FHIR Observation Resource (R4)
Observation records a measurement or assertion about a patient: vital signs, laboratory results, social history, survey answers. Element table, search parameters, example JSON and FHIRPath for FHIR R4.
- FHIR Observation Resource (R4) — part of the free FHIR Toolbox library.
- Runs entirely in your browser: your FHIR data is never uploaded to a server.
Overview
Observation records a measurement or assertion about a patient: vital signs, laboratory results, social history, survey answers. What was measured lives in code; the result lives in a value[x] choice element (Quantity, CodeableConcept, string and more). Panels such as blood pressure use component for the individual readings.
Elements
| Element | Type | Cardinality | Description |
|---|---|---|---|
| Observation.identifier | Identifier | 0..* | Business Identifier for observation |
| Observation.basedOn | Reference | 0..* | Fulfills plan, proposal or order |
| Observation.partOf | Reference | 0..* | Part of referenced event |
| Observation.status | code | 1..1 | registered | preliminary | final | amended + |
| Observation.category | CodeableConcept | 0..* | Classification of type of observation |
| Observation.code | CodeableConcept | 1..1 | Type of observation (code / type) |
| Observation.subject | Reference | 0..1 | Who and/or what the observation is about |
| Observation.focus | Reference | 0..* | What the observation is about, when it is not about the subject of record |
| Observation.encounter | Reference | 0..1 | Healthcare event during which this observation is made |
| Observation.effective[x] | dateTime | Period | Timing | instant | 0..1 | Clinically relevant time/time-period for observation |
| Observation.issued | instant | 0..1 | Date/Time this version was made available |
| Observation.performer | Reference | 0..* | Who is responsible for the observation |
| Observation.value[x] | Quantity | CodeableConcept | string | boolean | integer | Range | Ratio | SampledData | time | dateTime | Period | 0..1 | Actual result |
| Observation.dataAbsentReason | CodeableConcept | 0..1 | Why the result is missing |
| Observation.interpretation | CodeableConcept | 0..* | High, low, normal, etc. |
| Observation.note | Annotation | 0..* | Comments about the observation |
| Observation.bodySite | CodeableConcept | 0..1 | Observed body part |
| Observation.method | CodeableConcept | 0..1 | How it was done |
| Observation.specimen | Reference | 0..1 | Specimen used for this observation |
| Observation.device | Reference | 0..1 | (Measurement) Device |
| Observation.referenceRange | BackboneElement | 0..* | Provides guide for interpretation |
| Observation.referenceRange.id | String | 0..1 | Unique id for inter-element referencing |
| Observation.referenceRange.extension | Extension | 0..* | Additional content defined by implementations |
| Observation.referenceRange.modifierExtension | Extension | 0..* | Extensions that cannot be ignored even if unrecognized |
| Observation.referenceRange.low | Quantity | 0..1 | Low Range, if relevant |
| Observation.referenceRange.high | Quantity | 0..1 | High Range, if relevant |
| Observation.referenceRange.type | CodeableConcept | 0..1 | Reference range qualifier |
| Observation.referenceRange.appliesTo | CodeableConcept | 0..* | Reference range population |
| Observation.referenceRange.age | Range | 0..1 | Applicable age range, if relevant |
| Observation.referenceRange.text | string | 0..1 | Text based reference range in an observation |
| Observation.hasMember | Reference | 0..* | Related resource that belongs to the Observation group |
| Observation.derivedFrom | Reference | 0..* | Related measurements the observation is made from |
| Observation.component | BackboneElement | 0..* | Component results |
| Observation.component.id | String | 0..1 | Unique id for inter-element referencing |
| Observation.component.extension | Extension | 0..* | Additional content defined by implementations |
| Observation.component.modifierExtension | Extension | 0..* | Extensions that cannot be ignored even if unrecognized |
| Observation.component.code | CodeableConcept | 1..1 | Type of component observation (code / type) |
| Observation.component.value[x] | Quantity | CodeableConcept | string | boolean | integer | Range | Ratio | SampledData | time | dateTime | Period | 0..1 | Actual component result |
| Observation.component.dataAbsentReason | CodeableConcept | 0..1 | Why the component result is missing |
| Observation.component.interpretation | CodeableConcept | 0..* | High, low, normal, etc. |
| Observation.component.referenceRange | 0..* | Provides guide for interpretation of component result |
Example JSON (R4)
{
"resourceType": "Observation",
"id": "blood-pressure",
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "85354-9",
"display": "Blood pressure panel"
}
]
},
"subject": {
"reference": "Patient/example"
},
"effectiveDateTime": "2024-05-01T09:30:00Z",
"component": [
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}
]
},
"valueQuantity": {
"value": 120,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
},
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8462-4",
"display": "Diastolic blood pressure"
}
]
},
"valueQuantity": {
"value": 80,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}
]
}
FHIRPath
Observation.code.coding.where(system='http://loinc.org').code— LOINC code of the observationObservation.component.where(code.coding.code='8480-6').value.ofType(Quantity).value— Systolic value from a blood-pressure panelObservation.component.value.ofType(Quantity).unit— Units of every component readingObservation.effective.ofType(dateTime)— Effective time, narrowed to dateTime with ofType()
Common validation errors
- Using value instead of the concrete choice name. In JSON it is valueQuantity, valueString, valueCodeableConcept and so on, never a bare value.
- Setting more than one value[x]. Only one may be present.
- Omitting status, a required element. Use final, preliminary, amended and so on.
- Quantity without a coded unit. Set system http://unitsofmeasure.org and a UCUM code alongside the human-readable unit.
- Putting a panel's readings in separate top-level Observations without linking them, or forgetting that a panel result belongs in component (or hasMember).
FHIR Toolbox is a free, privacy-first collection of HL7 FHIR utilities by Omindra Labs. Every tool performs zero-server processing — your health data never leaves your device.