HL7 OUL messages report unsolicited laboratory results — the record that a laboratory instrument or information system has produced results for a specimen, together with full specimen and container tracking data that the general-purpose ORU message was not designed to carry. An OUL message is sent from the laboratory system to every downstream system that records and acts on the results. This page explains what an OUL message represents, the four trigger events that carry it, every segment the message can contain and what each one holds, and how an OUL observation relates to FHIR. Sample content is constructed for illustration with fictional identifiers.
What an OUL message represents
An OUL message — OUL stands for Unsolicited Laboratory Observation — communicates that a laboratory has produced results for a specimen without a preceding query. The distinguishing feature of OUL against the older ORU message is its first-class support for specimen and container tracking: the SAC segment carries the specimen container barcode, container status, specimen volume, and separator type, and the message structure groups results explicitly under the specimen or container that produced them.
The sender is the laboratory information system (LIS) or an instrument manager, and the receivers are the systems that need to know results are available — the EHR, the ordering provider's application, billing, and any downstream clinical decision support system. OUL is purpose-built for laboratory workflows: where ORU^R01 is the general unsolicited observation message used across all clinical domains, OUL was introduced in HL7 v2.5 specifically for laboratories that need to convey specimen container identity and status alongside the observations. Because the container is the event that drives lab automation, the SAC — not the OBR — is the structural anchor of the OUL message.
When an OUL message is sent
An OUL message is sent when laboratory results are ready. A single patient encounter may generate a series of OUL messages as results are finalised across multiple specimens or time points. Each message stands alone: the receiving system does not need a prior order message to process an OUL, though results are typically linked back to an order through the filler order number carried in OBR.
Trigger events
The OUL message type carries four trigger events, each reflecting a different grouping axis for the results:
OUL^R21– Unsolicited specimen-oriented observation. Results are grouped by specimen; no container-level detail is required.OUL^R22– Unsolicited specimen container-oriented observation. Results are grouped by specimen container, with aSACsegment anchoring each container. This is the most commonly implemented OUL variant in automated laboratory environments.OUL^R23– Unsolicited order-oriented observation. Results are grouped by order, mirroring the structure ofORU^R01.OUL^R24– Unsolicited order-oriented observation with specimen in container. Results are grouped by order, with container detail included.
The trigger event in MSH-9 tells the receiver which grouping axis to use for parsing the SPECIMEN and ORDER groups. OUL^R22 is the canonical form for lab automation because container identity drives instrument routing, result pairing, and chain-of-custody tracking.
Integration topology
The diagram shows the laboratory instrument or LIS emitting a result event through the integration engine to the systems that record and act on it.
{{diagram: laboratory instrument / LIS → OUL message → integration engine → EHR / ordering provider app / billing / clinical decision support}}
Typical senders: laboratory information system, instrument manager, middleware, or point-of-care device.
Typical receivers: EHR or clinical application, ordering provider system, billing / charge capture, and result routing or notification services.
Direction: unidirectional notification from the laboratory source to the systems that record, present, and act on the results.
Segments in an OUL message
The OUL_R22 message is organised into an optional PATIENT group (PID through AL1) and one or more repeating SPECIMEN groups, each opened by a SAC container segment. Within each SPECIMEN group, one or more ORDER groups carry the results for that container. 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 OUL message. It names the sending and receiving applications and facilities, stamps the creation time, declares the trigger event in MSH-9 (e.g. OUL^R22^OUL_R22), carries the message control id in MSH-10, and pins the HL7 version. Receivers route on MSH-9 to select the correct grouping structure and deduplicate on MSH-10. |
[{SFT}] | Software Segment. Identifies the software product behind the sender — vendor, product, and version. Useful when result encoding or container identification behaviour differs across LIS or instrument-manager releases. |
[PID] | Patient Identification. Identifies the patient the specimen belongs to — the identifier list in PID-3, the name in PID-5. Required when the PATIENT group is present; the group as a whole is optional, allowing point-of-care or anonymous specimen messages to omit it. |
[PD1] | Patient Additional Demographic. Supplements PID with data such as the patient's primary-care facility. Present only when the PATIENT group is included. |
[{OBX}] | Observation/Result. Patient-level observations — for example, a clinical indication or a patient-level note — carried before the specimen groups. Optional and repeating. |
[{AL1}] | Allergy Information. Patient allergies carried with the result message. Optional and repeating. |
{SAC} | Specimen Container. Opens each SPECIMEN group and is the structural anchor of OUL_R22. It carries the container barcode or accession number (SAC-3), the container identifier (SAC-4), the specimen type (SAC-6), specimen volume and units (SAC-9, SAC-10), container status (SAC-13), and separator type (SAC-16). Every ORDER group within the SPECIMEN group contains results produced from this container. This is the key segment that differentiates OUL from ORU. Required and repeating — one per physical container. |
[SPS] | Specimen Source. Legacy segment carrying specimen source detail — body site, additive, and collection method. Superseded by SAC and specimen detail in OBR in v2.5+, but retained for backward compatibility with systems that expect it. |
ORC | Common Order. Opens each ORDER group within a SPECIMEN group and ties the results to their originating order. For unsolicited results the ORC typically carries the order control code RE and the filler order number, linking the results back to the originating order in OML or ORM. Required within each ORDER group, and the ORDER group repeats once per ordered test panel or battery. |
OBR | Observation Request. The test or panel the results belong to — the universal service identifier in OBR-4, the observation date and time in OBR-7, the result status in OBR-25, and the principal result interpreter in OBR-32. Required within each ORDER group. |
[{TQ1}] | Timing/Quantity. The scheduled timing for the observation. Optional and repeating; introduced as the v2.5 replacement for the deprecated quantity/timing fields. |
[{OBX}] | Observation/Result. The individual test results — the observation identifier in OBX-3, the observation value in OBX-5, units in OBX-6, reference range in OBX-7, abnormal flag in OBX-8, observation result status in OBX-11, and the observation date and time in OBX-14. One OBX per discrete result within the panel. Optional and repeating. |
[{TCD}] | Test Code Detail. Test-specific detail for the observation — dilution factor, reflex allowed flag, and autoclaving information. Optional and repeating; used when instrument-level processing parameters need to be communicated alongside the result. |
[{SID}] | Substance Identifier. Identifies the reagent lot, substrate, or substance used to produce a result — lot number and expiry date. Optional and repeating; supports traceability requirements for regulated laboratory environments. |
[{NTE}] | Notes and Comments. Result-level or order-level comments — pathologist notes, interpretation text, or collection comments. Optional and repeating; may appear after OBR (order-level) or after individual OBX segments (result-level). |
[ ] = optional, { } = repeating
The SPECIMEN group from SAC through its contained ORDER groups repeats once per physical container, and the ORDER group from ORC through NTE repeats once per ordered panel within that container. A single OUL message can therefore carry results for multiple containers and multiple panels per container. The canonical segment pages carry the full field-by-field detail.
Sample OUL message
Note. Constructed for illustration. Patient identifiers, accession numbers, dates, and names are fictional.
MSH|^~&|LIS|MERCYGEN|EHR|MERCYGEN|20260604083000||OUL^R22^OUL_R22|MSG00047|P|2.5.1
PID|1||MR98765^^^MERCYGEN^MR||SMITH^JANE^A||19750315|F
SAC|||ACC20260604001^LIS|CTR001||EDTA_WHOLE_BLOOD||||5.0|mL|||ACTIVE||K2EDTA
ORC|RE|ORD1122^EHR|RES8899^LIS|||||||^JONES^ROBERT^^^^MD
OBR|1|ORD1122^EHR|RES8899^LIS|58410-2^CBC WITH DIFFERENTIAL^LN|||20260604080500|||||||||^JONES^ROBERT^^^^MD||||||20260604083000|||F
OBX|1|NM|6690-2^Leukocytes [#/volume] in Blood^LN||7.2|10*3/uL|4.5-11.0|N||F|||20260604083000
OBX|2|NM|789-8^Erythrocytes [#/volume] in Blood^LN||4.85|10*6/uL|4.20-5.40|N||F|||20260604083000
OBX|3|NM|718-7^Hemoglobin [Mass/volume] in Blood^LN||13.9|g/dL|12.0-16.0|N||F|||20260604083000
OBX|4|NM|4544-3^Hematocrit [Volume Fraction] of Blood^LN||41.2|%|37.0-47.0|N||F|||20260604083000
NTE|1||Results verified by automated differential.
What this sample shows
The OUL^R22 in MSH-9 marks an unsolicited specimen container-oriented observation. PID carries the medical record number MR98765. The SAC opens the SPECIMEN group: accession number ACC20260604001 in SAC-3, container identifier CTR001 in SAC-4, specimen type EDTA_WHOLE_BLOOD in SAC-6, volume 5.0 mL in SAC-9 and SAC-10, container status ACTIVE in SAC-13, and separator type K2EDTA in SAC-16. Within the SPECIMEN group, ORC carries order control code RE and the filler order number RES8899, linking results to the originating order. OBR identifies the CBC With Differential panel (LOINC 58410-2) with a final result status F in OBR-25. Four OBX segments carry the discrete results — WBC, RBC, Hemoglobin, and Hematocrit — each with a value, units, reference range, and abnormal flag. The NTE carries a result-level comment.
Working with OUL messages
Parse the structure from the trigger event in MSH-9
The four OUL trigger events produce structurally different messages. OUL^R22 groups results under a SAC container segment; OUL^R21 groups under a specimen segment; OUL^R23 and OUL^R24 group under the order. Confirm the trigger event in MSH-9 before parsing the message body — a parser written for R22 will misread an R23 message if the grouping level is not checked first.
Idempotency and deduplication
Use MSH-10, the message control id, as the deduplication key, and treat the accession number in SAC-3 together with the filler order number in OBR-3 and the result status in OBR-25 as the natural business key for a result set. Laboratory feeds are replayed after outages and result corrections can generate a second message for the same accession; treating a repeated control id as a duplicate prevents a corrected result from creating a second record rather than updating the first.
Result status and corrections
OBR-25 carries the result status for the panel, and OBX-11 carries the status for each individual observation — F for final, C for correction, P for preliminary. A corrected result arrives as a new OUL message with OBX-11 set to C; the receiver must replace the prior value for that observation rather than append it. Surface corrections visibly on the result record rather than silently overwriting, so clinicians are aware a value changed.
SAC is the container, not the specimen
The SAC segment describes the physical container — tube, vial, or well — not the specimen itself. A single patient draw may produce multiple aliquot containers, each with its own SAC and its own SPECIMEN group. Link containers to each other through the parent container identifier in SAC-5 rather than assuming one SAC per patient.
Vendor variance. The
SPSspecimen source segment is optional and is included only for backward compatibility; some older LIS vendors send it betweenSACandORCwhile others omit it entirely. Confirm a partner's field usage against their interface specification rather than assuming the base standard.
FHIR equivalent
An unsolicited laboratory observation corresponds to a FHIR DiagnosticReport resource referencing one or more Observation resources and a Specimen resource, with the patient as a Patient resource and, for a messaging exchange, a MessageHeader at the head of a Bundle.
There is, however, no published mapping to lean on. The HL7 v2-to-FHIR Implementation Guide provides no message map for any OUL variant — only ORU^R01 has an official message-level Bundle map in that guide. A FHIR DiagnosticReport produced from an OUL message is therefore mapped manually: the container identity and specimen type from SAC populate the Specimen resource; the panel identity and result status from OBR populate the DiagnosticReport; and each OBX row maps to an individual Observation resource referenced by the DiagnosticReport.
Common pitfalls
Pitfall. Using a parser written for
ORU^R01on an OUL message. The grouping hierarchy is different — OUL nests ORDER groups inside SPECIMEN groups, not the other way around — so an ORU parser silently misidentifies which results belong to which container.
Pitfall. Ignoring the result status in
OBX-11. A preliminary result (P) and a final result (F) for the same observation identifier represent different clinical states; storing both as equivalent results can surface a superseded value to a clinician.
Pitfall. Treating the
SACaccession number as globally unique without scoping it to the sending facility. Accession numbers are unique within a laboratory, not across all laboratories, so two senders may produce the same accession string. Namespace the accession by the sending application or facility inMSH-3andMSH-4.
How Vorro handles OUL messages
Vorro ingests the OUL feed over MLLP or another transport, inspects MSH-9 to determine the trigger event, and applies the matching group-parsing logic for R21, R22, R23, or R24. Vorro 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, billing, and any notification service. Vorro reads the container identity and specimen detail from SAC, links each ORDER group back to its originating order through the filler order number in ORC, 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 maps the observation to a DiagnosticReport + Observation + Specimen Bundle — composed manually, since the v2-to-FHIR Implementation Guide publishes no map for any OUL variant.
Related messages
- ORU — the general unsolicited observation message used across all clinical domains; OUL is the laboratory-specific successor when specimen and container tracking are required.
- OML — the laboratory order message that typically precedes an OUL result; carries specimen collection and test request detail.
- ORM — the general order message; an older predecessor to OML for lab orders, still common in legacy environments.
Sources
- HL7 v2-to-FHIR IG — message maps index — confirms no message map for any OUL variant
- HL7 v2-to-FHIR IG — segment maps index — confirms no ConceptMap for SAC
- HL7 Messaging Standard Version 2.5.1 product brief
