HL7 ORU messages return observation results — the values a laboratory, imaging department, or monitoring device produces and reports back to the systems that ordered them or need to record them. ORU^R01 is the general-purpose result message of HL7 v2, used across every clinical domain from chemistry panels to microbiology to vital signs. Where an ORM or OML message places an order, an ORU message returns the result. This page explains what an ORU message represents, when it is sent, every segment the message can carry and what each one holds, a deep-dive on the OBX result segment, and how an ORU message maps to a FHIR Bundle. Sample content is constructed for illustration with fictional identifiers.
What an ORU message represents
An ORU message — ORU stands for Observation Result, Unsolicited — communicates one or more observations produced for a patient. The message nests results under the order that requested them: each OBR observation request carries a set of OBX observation segments, and each OBX holds one discrete result value with its units, reference range, abnormal flag, and status. A single ORU can report a whole panel of results, several panels, or results for several patients.
The sender is the producing system — a laboratory information system, a radiology system, or an instrument — and the receivers are the systems that record and act on results: the EHR, the ordering provider's inbox, clinical decision support, and billing. Although the message name says "unsolicited", ORU^R01 is also the response to a query in solicited workflows; the trigger event is the same and the receiver handles the body identically. Because the OBX carries the result value and its status, OBX-11 is the field a receiver reads to know whether a value is preliminary, final, or a correction.
Every ORU message shares the same skeleton — an MSH header and one or more PATIENT_RESULT groups, each pairing an optional PATIENT group (PID) with one or more ORDER_OBSERVATION groups (OBR plus its OBX results).
When an ORU message is sent
An ORU message is sent when results are available. A single order may generate several ORU messages over time as results move from preliminary to final and as corrections are issued. Each message stands alone: the receiver does not need the original order message to process an ORU, though the result links back to its order through the filler and placer order numbers in OBR.
Trigger event
The ORU message type's principal trigger event is:
ORU^R01– Unsolicited transmission of an observation result.
Because the everyday result workflow uses one trigger event, the receiver's handling turns on the result status in OBR-25 and the per-observation status in OBX-11 — final, preliminary, corrected — rather than on the trigger code in MSH-9. A first result and a corrected result both arrive as ORU^R01; the status fields distinguish them.
Integration topology
The diagram shows the producing system emitting a result through the integration engine to the systems that record and act on it.
{{diagram: laboratory / radiology / device → ORU message → integration engine → EHR / ordering provider inbox / clinical decision support / billing}}
Typical senders: laboratory information system, radiology information system, instrument or device, and result repositories.
Typical receivers: EHR or clinical application, ordering provider's result inbox, clinical decision support, and billing / charge capture.
Direction: unidirectional notification from the producing system to the systems that record, present, and act on the results.
Segments in an ORU message
The ORU_R01 message is built from one or more repeating PATIENT_RESULT groups. Each PATIENT_RESULT group holds an optional PATIENT group (PID and companions) and one or more ORDER_OBSERVATION groups. Each ORDER_OBSERVATION group carries an OBR and the OBX results beneath it. Cardinality follows HL7 notation: [X] optional, {X} repeating, [{X}] optional and repeating; a bare code is required. Each segment code links to its canonical field-by-field reference.
| Segment | Description |
|---|---|
MSH | Message Header. Opens every ORU message. It names the sending and receiving applications and facilities, stamps the creation time, declares the trigger event in MSH-9 (ORU^R01), carries the message control id in MSH-10, and pins the HL7 version. Receivers route on MSH-9 and deduplicate on MSH-10. |
[{SFT}] | Software Segment. Identifies the software product behind the sender — vendor, product, and version. Useful when result encoding differs across LIS or instrument-manager releases. Optional and repeating. |
[PID] | Patient Identification. Opens the optional PATIENT group within each PATIENT_RESULT group — the identifier list in PID-3, the name in PID-5, birth date in PID-7. Required when the PATIENT group is present. |
[PD1] | Patient Additional Demographic. Supplements PID with data such as the patient's primary-care facility. Optional, within the PATIENT group. |
[{NTE}] | Notes and Comments. Patient-level notes within the PATIENT group. Optional and repeating. |
[{NK1}] | Next of Kin. Relatives or associated parties carried with the result. Optional and repeating, within the PATIENT group. |
[PV1] | Patient Visit. Opens the optional VISIT group inside the PATIENT group — the encounter the results belong to: patient class, assigned location, providers. |
[PV2] | Patient Visit Additional. Companion to PV1 with admit reason and expected dates. Optional, within the VISIT group. |
[ORC] | Common Order. Opens each ORDER_OBSERVATION group and ties the results to their originating order — typically the order control code RE (observations to follow) and the filler order number. Optional in ORU because a result can be reported without echoing the full order context. |
OBR | Observation Request. The test or panel the results belong to — the universal service identifier in OBR-4, the observation date/time in OBR-7, the filler order number in OBR-3, the result status in OBR-25, and the principal result interpreter in OBR-32. Required; anchors each ORDER_OBSERVATION group. |
[{NTE}] | Notes and Comments. Order-level comments — collection notes or interpretation text. Optional and repeating, after OBR. |
[{ TIMING_QTY }] | Timing/Quantity group. Optional and repeating scheduling context, opening with TQ1 and an optional repeating TQ2. Introduced as the v2.5 replacement for the deprecated quantity/timing fields. |
[CTD] | Contact Data. Contact detail for the order. Optional, within the ORDER_OBSERVATION group. |
[{OBX}] | Observation/Result. Opens the OBSERVATION group; one OBX per discrete result within the panel, each optionally followed by its own [{NTE}]. Carries the result value and status — see the OBX deep-dive below. Optional and repeating. |
[{FT1}] | Financial Transaction. Charges associated with the result. Optional and repeating, within the ORDER_OBSERVATION group. |
[{CTI}] | Clinical Trial Identification. Links the result to a clinical trial, phase, and study arm. Optional and repeating. |
[{ SPECIMEN }] | Specimen group. Optional and repeating specimen context, opening with an SPM specimen segment and an optional repeating OBX. Introduced in v2.5 to carry specimen detail alongside the result. |
[DSC] | Continuation Pointer. Supports continuation of a message too large for one transmission. Optional, closes the message. |
[ ] = optional, { } = repeating
The PATIENT_RESULT group repeats once per patient, the ORDER_OBSERVATION group repeats once per ordered panel, and the OBSERVATION group repeats once per discrete result within a panel. A single ORU message can therefore carry many results across several panels and patients. The canonical segment pages carry the full field-by-field detail.
The OBX observation/result segment
OBX — the Observation/Result segment — carries a single discrete result. It is the payload of the ORU message, and the fields an integration team reads most often:
| Field | Name | Holds |
|---|---|---|
OBX-1 | Set ID | Sequence number of this OBX within the ORDER_OBSERVATION group. |
OBX-2 | Value Type | The data type of OBX-5 — NM numeric, ST string, CE/CWE coded, TX text, SN structured numeric. Read this before parsing the value. |
OBX-3 | Observation Identifier | The code identifying what was measured — typically a LOINC code with its text. |
OBX-5 | Observation Value | The result value itself, in the type declared by OBX-2. |
OBX-6 | Units | The units of the value, ideally UCUM-coded. |
OBX-7 | Reference Range | The normal range for the observation. |
OBX-8 | Abnormal Flags | The interpretation — N normal, H high, L low, A abnormal, HH/LL critical. |
OBX-11 | Observation Result Status | The status of this result — F final, P preliminary, C correction, X cannot be obtained, D deleted. |
OBX-14 | Date/Time of the Observation | When the observation was made. |
OBX-16 | Responsible Observer | The observer or performer of the observation. |
OBX-17 | Observation Method | The method used to produce the result. |
The value type in OBX-2 governs how OBX-5 is parsed, and the result status in OBX-11 governs how the receiver stores it — a preliminary value is superseded by a later final, and a correction replaces the prior value rather than appending. These are the fields a result receiver acts on first. The full field list is on the canonical OBX page.
Sample ORU message
Note. Constructed for illustration. Patient identifiers, order numbers, dates, and names are fictional.
MSH|^~&|LIS|MERCYGEN|EHR|MERCYGEN|20260701101500||ORU^R01^ORU_R01|MSG00042|P|2.5.1
PID|1||MR12345^^^MERCYGEN^MR||DOE^JOHN^Q||19800101|M
PV1|1|O|LAB^^^MERCYGEN||||1234^SMITH^JANE^A^^^MD|||MED
ORC|RE|ORD5501^EHR|RES7788^LIS
OBR|1|ORD5501^EHR|RES7788^LIS|58410-2^CBC WITH DIFFERENTIAL^LN|||20260701100000|||||||||1234^SMITH^JANE^A^^^MD||||||20260701101500|||F
OBX|1|NM|6690-2^Leukocytes [#/volume] in Blood^LN||7.2|10*3/uL|4.5-11.0|N||F|||20260701101500
OBX|2|NM|718-7^Hemoglobin [Mass/volume] in Blood^LN||13.9|g/dL|12.0-16.0|N||F|||20260701101500
OBX|3|NM|777-3^Platelets [#/volume] in Blood^LN||245|10*3/uL|150-400|N||F|||20260701101500
NTE|1||Specimen received without incident.
What this sample shows
The ORU^R01 in MSH-9 marks an observation result. PID carries the medical record number MR12345, and PV1 supplies the visit context. The ORC carries the order control code RE and links to the originating order through the placer number ORD5501 and filler number RES7788. The OBR identifies the CBC With Differential panel (LOINC 58410-2) with a final result status F in OBR-25. Three OBX segments carry the discrete results — WBC, Hemoglobin, and Platelets — each declaring a numeric value type (NM) in OBX-2, a value in OBX-5, units in OBX-6, a reference range in OBX-7, an abnormal flag N in OBX-8, and a final status F in OBX-11. The NTE carries an order-level comment.
Working with ORU messages
Read the result status before storing
The panel status in OBR-25 and the per-observation status in OBX-11 govern how a result is stored. A preliminary result (P) is provisional and will be followed by a final (F); a correction (C) must replace the prior value for that observation identifier rather than append a second row. Storing every result as final, or appending corrections, surfaces superseded values to clinicians.
Parse the value by its type
OBX-2 declares the type of OBX-5 — numeric, string, coded, or structured. A numeric result parses to a number; a coded result (CE/CWE) carries a code and text; a structured numeric (SN) carries a comparator and value. Reading OBX-5 without checking OBX-2 misparses non-numeric results such as "POSITIVE" or "<0.01".
Idempotency and deduplication
Use MSH-10, the message control id, as the deduplication key, and treat the filler order number in OBR-3 together with the observation identifier in OBX-3 and the result status as the natural business key for a result. Result feeds are replayed after outages and corrections generate a second message for the same order; deduplicating on the control id prevents a replay from creating a second result record.
Nest results under the right order
The OBSERVATION group nests inside the ORDER_OBSERVATION group, which nests inside the PATIENT_RESULT group. Attribute each OBX to the OBR that precedes it within the same ORDER_OBSERVATION group, not to the first OBR in the message — a multi-panel ORU carries several OBR segments and misattribution assigns results to the wrong test.
Vendor variance. Senders differ in how they populate
OBX-2value types, whether they include the v2.5 SPECIMEN group, and how they encode reference ranges and abnormal flags. Confirm a partner's field usage against their interface specification rather than assuming the base standard.
FHIR equivalent
An ORU message maps to a FHIR Bundle whose backbone is a MessageHeader plus the Patient, one DiagnosticReport per order, and one Observation per result. The v2-to-FHIR Implementation Guide derives the MessageHeader and Provenance from MSH, the Patient from PID, a DiagnosticReport from each OBR, and an Observation from each OBX that the DiagnosticReport references, with optional Encounter from the visit segments, Specimen from the SPM group, ServiceRequest from ORC/OBR, and RelatedPerson from NK1.
The Implementation Guide publishes an official Bundle map for ORU_R01.
| Trigger event | FHIR Bundle contents | Official IG map |
|---|---|---|
ORU_R01 | MessageHeader + Patient + DiagnosticReport + Observation + Provenance (+ optional Encounter, Specimen, ServiceRequest, PractitionerRole, RelatedPerson, Coverage, Device) | yes |
Common pitfalls
Pitfall. Ignoring the result status in
OBX-11. A preliminary result (P) and a final result (F) for the same observation represent different clinical states; storing both as equivalent can surface a superseded value to a clinician, and treating a correction (C) as a new result appends a duplicate.
Pitfall. Reading
OBX-5without checkingOBX-2. The value type governs parsing; a numeric parser applied to a coded or structured value silently corrupts the result.
Pitfall. Attributing every
OBXto the firstOBR. A multi-panel ORU nests each OBSERVATION group under its own ORDER_OBSERVATION group; misattribution assigns results to the wrong test.
How Vorro handles ORU messages
Vorro ingests the ORU feed over MLLP or another transport, deduplicates on MSH-10, and routes each result set to every subscribed destination in the format that system expects — the EHR, the ordering provider's result inbox, clinical decision support, and billing. Vorro attributes each OBX to the OBR that anchors its ORDER_OBSERVATION group, parses each value by its OBX-2 type, and handles result corrections by updating the existing record when OBX-11 carries C rather than appending a duplicate. Where a FHIR destination is configured, Vorro emits the corresponding Bundle using the Implementation Guide's published ORU_R01 map — one DiagnosticReport per order and one Observation per result.
Related messages
- ORM — the general order message that places the order an ORU returns results against.
- OML — the laboratory order message that precedes an ORU result in modern lab workflows.
- OBR — the observation request segment that anchors each ORDER_OBSERVATION group and links results to their order.
Sources
- HL7 v2-to-FHIR IG — message maps index
- HL7 v2-to-FHIR IG — ORU_R01 to Bundle ConceptMap
- HL7 Messaging Standard Version 2.5.1 product brief
- HAPI HL7v2 v2.5.1 ORU_R01 message structure
- HAPI HL7v2 v2.5.1 ORU_R01_PATIENT_RESULT group structure
- HAPI HL7v2 v2.5.1 ORU_R01_ORDER_OBSERVATION group structure
- HAPI HL7v2 v2.5.1 ORU_R01_OBSERVATION group structure
