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

ElementTypeCardinalityDescription
Observation.identifierIdentifier0..*Business Identifier for observation
Observation.basedOnReference0..*Fulfills plan, proposal or order
Observation.partOfReference0..*Part of referenced event
Observation.statuscode1..1registered | preliminary | final | amended +
Observation.categoryCodeableConcept0..*Classification of type of observation
Observation.codeCodeableConcept1..1Type of observation (code / type)
Observation.subjectReference0..1Who and/or what the observation is about
Observation.focusReference0..*What the observation is about, when it is not about the subject of record
Observation.encounterReference0..1Healthcare event during which this observation is made
Observation.effective[x]dateTime | Period | Timing | instant0..1Clinically relevant time/time-period for observation
Observation.issuedinstant0..1Date/Time this version was made available
Observation.performerReference0..*Who is responsible for the observation
Observation.value[x]Quantity | CodeableConcept | string | boolean | integer | Range | Ratio | SampledData | time | dateTime | Period0..1Actual result
Observation.dataAbsentReasonCodeableConcept0..1Why the result is missing
Observation.interpretationCodeableConcept0..*High, low, normal, etc.
Observation.noteAnnotation0..*Comments about the observation
Observation.bodySiteCodeableConcept0..1Observed body part
Observation.methodCodeableConcept0..1How it was done
Observation.specimenReference0..1Specimen used for this observation
Observation.deviceReference0..1(Measurement) Device
Observation.referenceRangeBackboneElement0..*Provides guide for interpretation
Observation.referenceRange.idString0..1Unique id for inter-element referencing
Observation.referenceRange.extensionExtension0..*Additional content defined by implementations
Observation.referenceRange.modifierExtensionExtension0..*Extensions that cannot be ignored even if unrecognized
Observation.referenceRange.lowQuantity0..1Low Range, if relevant
Observation.referenceRange.highQuantity0..1High Range, if relevant
Observation.referenceRange.typeCodeableConcept0..1Reference range qualifier
Observation.referenceRange.appliesToCodeableConcept0..*Reference range population
Observation.referenceRange.ageRange0..1Applicable age range, if relevant
Observation.referenceRange.textstring0..1Text based reference range in an observation
Observation.hasMemberReference0..*Related resource that belongs to the Observation group
Observation.derivedFromReference0..*Related measurements the observation is made from
Observation.componentBackboneElement0..*Component results
Observation.component.idString0..1Unique id for inter-element referencing
Observation.component.extensionExtension0..*Additional content defined by implementations
Observation.component.modifierExtensionExtension0..*Extensions that cannot be ignored even if unrecognized
Observation.component.codeCodeableConcept1..1Type of component observation (code / type)
Observation.component.value[x]Quantity | CodeableConcept | string | boolean | integer | Range | Ratio | SampledData | time | dateTime | Period0..1Actual component result
Observation.component.dataAbsentReasonCodeableConcept0..1Why the component result is missing
Observation.component.interpretationCodeableConcept0..*High, low, normal, etc.
Observation.component.referenceRange0..*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 observation
  • Observation.component.where(code.coding.code='8480-6').value.ofType(Quantity).value — Systolic value from a blood-pressure panel
  • Observation.component.value.ofType(Quantity).unit — Units of every component reading
  • Observation.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.