ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

Observation — Atomic clinical measurement

The elementary unit of clinical data in FHIR. Every vital sign, lab result, anthropometry, social-history item, and clinical score flows through Observation.

Purpose

Observation represents an atomic clinical measurement or assertion made about a patient, a specimen, a device or a group. Typical usages:

  • vital signs (blood pressure, heart rate, temperature, SpO₂, weight…);
  • lab results (CBC, biochemistry, serology);
  • quantitative imaging (lesion measurement);
  • scored clinical assessments (Glasgow, ECOG, NIHSS);
  • social determinants of health (smoking status, education);
  • patient-reported outcomes (PROMs).

An Observation can be atomic (one value) or composite via component (blood pressure, cardiac cycles, differential counts).

Key fields

FieldTypeCardinalityRole
identifierIdentifier[]0..*External identifiers (lab accession number…).
statuscode1..1registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown.
categoryCodeableConcept[]0..*Observation category (vital-signs, laboratory, imaging, survey, social-history…).
codeCodeableConcept1..1What is being observed. Typically a LOINC code.
subjectReference0..1Subject (Patient, Group, Device, Location).
encounterReference(Encounter)0..1Care context.
effective[x]dateTime | Period | Timing | instant0..1Measurement date/time or interval.
issuedinstant0..1When the result was made available.
performerReference[]0..*Who performed the measurement (Practitioner, Organization, Patient, Device).
value[x]Quantity | CodeableConcept | string | boolean | integer | Range | Ratio | SampledData | time | dateTime | Period | Attachment | Reference0..1The observed value. Very broad choice type.
dataAbsentReasonCodeableConcept0..1Why value[x] is absent (unknown, not-performed, error…).
interpretationCodeableConcept[]0..*Abnormal flag (v2 OBX-8 equivalent).
noteAnnotation[]0..*Free-text comments.
bodySiteCodeableConcept0..1Anatomical site (SNOMED CT).
methodCodeableConcept0..1Method (auscultation, palpation, instrument…).
specimenReference(Specimen)0..1Analysed specimen.
deviceReference(Device)0..1Device used.
referenceRangeBackboneElement[]0..*Reference range with low, high, appliesTo.
hasMemberReference[]0..*Sub-observations (panel).
derivedFromReference[]0..*Observations this one derives from (computation, aggregation).
componentBackboneElement[]0..*Sub-measurements of the same act (systolic/diastolic components of a BP).

JSON example

A blood pressure measurement, 122/78 mmHg, taken on the right arm, status final:

json observation-bp-example.json
{
  "resourceType": "Observation",
  "id": "blood-pressure",
  "status": "final",
  "category": [{
    "coding": [{
      "system": "http://terminology.hl7.org/CodeSystem/observation-category",
      "code": "vital-signs",
      "display": "Vital Signs"
    }]
  }],
  "code": {
    "coding": [{
      "system": "http://loinc.org",
      "code": "85354-9",
      "display": "Blood pressure panel with all children optional"
    }],
    "text": "Blood pressure"
  },
  "subject": { "reference": "Patient/example" },
  "encounter": { "reference": "Encounter/example" },
  "effectiveDateTime": "2026-05-14T10:30:00+01:00",
  "performer": [{ "reference": "Practitioner/example" }],
  "bodySite": {
    "coding": [{
      "system": "http://snomed.info/sct",
      "code": "368209003",
      "display": "Right arm"
    }]
  },
  "component": [{
    "code": {
      "coding": [{
        "system": "http://loinc.org",
        "code": "8480-6",
        "display": "Systolic blood pressure"
      }]
    },
    "valueQuantity": {
      "value": 122,
      "unit": "mmHg",
      "system": "http://unitsofmeasure.org",
      "code": "mm[Hg]"
    },
    "interpretation": [{
      "coding": [{
        "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation",
        "code": "N",
        "display": "Normal"
      }]
    }]
  }, {
    "code": {
      "coding": [{
        "system": "http://loinc.org",
        "code": "8462-4",
        "display": "Diastolic blood pressure"
      }]
    },
    "valueQuantity": {
      "value": 78,
      "unit": "mmHg",
      "system": "http://unitsofmeasure.org",
      "code": "mm[Hg]"
    }
  }]
}
  • code = LOINC 85354-9 (Blood pressure panel).
  • Two component entries: systolic (LOINC 8480-6) and diastolic (LOINC 8462-4), each with valueQuantity and UCUM unit mm[Hg].
  • bodySite = SNOMED CT 368209003 (Right arm).

REST API

  • GET /Observation/blood-pressure — fetch by id.
  • GET /Observation?patient=example&code=loinc|85354-9 — all BPs for a patient.
  • GET /Observation?patient=example&category=vital-signs&date=ge2026-05-01 — recent vital signs.
  • GET /Observation?patient=example&code=loinc|2339-0&value-quantity=gt7.0|http://unitsofmeasure.org|mmol/L — glycaemias > 7 mmol/L.
  • POST /Observation — creation.
  • $lastn — SMART operation that returns the last N observations grouped by code.

Profiles

ProfileRegulatorRestrictions
Vital Signs ProfileHL7 — Core specMandatory base profile for any category=vital-signs. Minimum cardinality on code, valueQuantity, effectiveDateTime.
US Core Observation LabHL7 US Realmlaboratory category, mandatory LOINC code, status in final/amended/corrected/cancelled/entered-in-error.
IPS Results (UV)HL7 + CEN/TC 251Cross-border European / global profile. Covers lab, radiology, pathology results.
FR Core ObservationANSFrench profiles — biology results (NABM/LOINC codes), vital signs.

Common pitfalls

  • value[x] + dataAbsentReason: invariant obs-6 forbids having both at once. Pick one.
  • Display unit vs UCUM: valueQuantity.unit is free-text but valueQuantity.code must be a strict UCUM code. mmHg is the display unit, mm[Hg] is the official UCUM code.
  • component vs hasMember: use component for intrinsically-linked measurements (BP syst/diast); use hasMember for a panel where each member is itself a stand-alone Observation (CBC).
  • Wrong category: for US Core Lab, missing category=laboratory drops the resource out of profile. Query layers stop finding it.
  • Status final for unvalidated data: instrument-raw values should be preliminary until biologist validation, then promoted to final. Posting everything as final bypasses validation workflow.
  • Absolute vs relative reference: "reference": "Patient/example" inside a relative Bundle vs "reference": "https://example.com/fhir/Patient/example" in direct REST. Mixing both breaks strict servers.
  • DiagnosticReport — wrapper for a complete report, references one or more Observations plus any images.
  • Patient — observation subject.
  • Encounter — care context.
  • Practitioner — who performed the measurement.
  • Specimen — analysed specimen for biology observations.
  • Device — measurement device (analyser, monitor).
  • HL7 v2 equivalentORU^R01 segment OBX.