Home / Resources / HL7 sample messages

Sample result messages: HL7 ORU^R01, ASTM and POCT1-A2

Fictional point-of-care and laboratory result messages in the three formats analysers and clinical systems use: HL7 v2.5.1 ORU^R01 for a generic LIS or EHR, an NHS trust integration engine and Epic; ASTM E1394 with its E1381 serial framing; and a complete POCT1-A2 device conversation. Each is explained field by field, with a free checker for your own HL7 messages.

Resource · Interface analysts · Updated October 2026

Every sample is wholly fictional. The patient, identifiers and results are invented, and 9990000018 is an NHS test-range number that belongs to no one. Segments are shown one per line for reading; on the wire HL7 v2 separates segments with a carriage return.

Generic LIS or EHR

The plain form most receivers accept: one local record number in PID-3, the order in OBR, one OBX per result.

MSH|^~\&|Catenix|Catenix|TIE|RXX|20261020091500||ORU^R01^ORU_R01|C0A1B2C3D4E5|P|2.5.1|||AL|NE
PID|1||CTX-000123^^^CATENIX^MR||Testpatient^Alex||19800412|F
PV1|1|O
OBR|1|ORD-55012|POCT-7F3A9C21|59261-8^HbA1c^LN|||20261020091500|||||||||||||||20261020091500|||F
OBX|1|NM|59261-8^HbA1c^LN||48|mmol/mol|20-41|H|||F|||20261020091500|AFINION2-01^Catenix|OP-17
NTE|1|L|Sample collected in clinic.
OBX|2|NM|1988-5^C-reactive protein^LN||3.2|mg/L|0-5|N|||F|||20261020091500|AFINION2-01^Catenix|OP-17
NTE|2|L|Sample collected in clinic.
Download .txt

NHS trust integration engine

Adds the NHS number as a second PID-3 identifier (type code NH) and an ORC segment, which most trust engines expect before OBR.

MSH|^~\&|Catenix|Catenix|TIE|RXX|20261020091500||ORU^R01^ORU_R01|C0A1B2C3D4E5|P|2.5.1|||AL|NE
PID|1||CTX-000123^^^CATENIX^MR~9990000018^^^NHS^NH||Testpatient^Alex||19800412|F
PV1|1|O
ORC|RE|ORD-55012|POCT-7F3A9C21
OBR|1|ORD-55012|POCT-7F3A9C21|59261-8^HbA1c^LN|||20261020091500|||||||||||||||20261020091500|||F
OBX|1|NM|59261-8^HbA1c^LN||48|mmol/mol|20-41|H|||F|||20261020091500|AFINION2-01^Catenix|OP-17
NTE|1|L|Sample collected in clinic.
OBX|2|NM|1988-5^C-reactive protein^LN||3.2|mg/L|0-5|N|||F|||20261020091500|AFINION2-01^Catenix|OP-17
NTE|2|L|Sample collected in clinic.
Download .txt

Epic ancillary results

As the NHS form, with the local identifier typed MRN, and the ORC carrying the placer and filler order numbers Epic uses to match the result to its order.

MSH|^~\&|Catenix|Catenix|TIE|RXX|20261020091500||ORU^R01^ORU_R01|C0A1B2C3D4E5|P|2.5.1|||AL|NE
PID|1||CTX-000123^^^CATENIX^MRN~9990000018^^^NHS^NH||Testpatient^Alex||19800412|F
PV1|1|O
ORC|RE|ORD-55012|POCT-7F3A9C21
OBR|1|ORD-55012|POCT-7F3A9C21|59261-8^HbA1c^LN|||20261020091500|||||||||||||||20261020091500|||F
OBX|1|NM|59261-8^HbA1c^LN||48|mmol/mol|20-41|H|||F|||20261020091500|AFINION2-01^Catenix|OP-17
NTE|1|L|Sample collected in clinic.
OBX|2|NM|1988-5^C-reactive protein^LN||3.2|mg/L|0-5|N|||F|||20261020091500|AFINION2-01^Catenix|OP-17
NTE|2|L|Sample collected in clinic.
Download .txt

Field by field

The fields used in the generic sample, in order.

FieldValue in the generic sampleWhat it is
MSH-3CatenixSending application
MSH-4CatenixSending facility
MSH-5TIEReceiving application
MSH-6RXXReceiving facility
MSH-720261020091500Date and time of the message
MSH-9ORU^R01^ORU_R01Message type: an unsolicited observation result
MSH-10C0A1B2C3D4E5Message control ID, unique per message
MSH-11PProcessing ID (P = production)
MSH-122.5.1HL7 version
MSH-15ALAccept acknowledgement: always
MSH-16NEApplication acknowledgement: never
PID-11Set ID
PID-3CTX-000123^^^CATENIX^MRPatient identifier, with assigning authority and identifier type code
PID-5Testpatient^AlexPatient name (family^given)
PID-719800412Date of birth
PID-8FAdministrative sex
PV1-11Set ID
PV1-2OPatient class (O = outpatient)
OBR-11Set ID
OBR-2ORD-55012Placer order number (the ordering system's number)
OBR-3POCT-7F3A9C21Filler order number (the performing system's number)
OBR-459261-8^HbA1c^LNUniversal service identifier: what was tested, here as a LOINC code
OBR-720261020091500Observation date and time
OBR-2220261020091500Date and time the result was reported or last changed
OBR-25FResult status (F = final)
OBX-11Set ID
OBX-2NMValue type (NM = numeric)
OBX-359261-8^HbA1c^LNObservation identifier (LOINC code^name^coding system)
OBX-548The result value
OBX-6mmol/molUnits
OBX-720-41Reference range
OBX-8HAbnormal flag (H = high, N = normal)
OBX-11FObservation result status (F = final). Receivers often reject results without it
OBX-1420261020091500Date and time of the observation
OBX-15AFINION2-01^CatenixProducer: here the analyser that produced the result
OBX-16OP-17Responsible observer: here the operator ID
NTE-11Set ID
NTE-2LSource of the comment (L = ancillary or filler)
NTE-3Sample collected in clinic.The comment text

ORU or ORM?

ORM carries an order, and in HL7 v2.5 and later laboratory orders often use OML. ORU carries the result. A point-of-care result that nobody formally ordered is still sent as an ORU; the sending system sets the order numbers so the receiver can file it.

ASTM: the same kind of result from a laboratory analyser

Many benchtop and laboratory analysers send results as ASTM E1394 (CLSI LIS2-A2) records instead of HL7: a header, the patient, the order, one result record per test and a terminator. This fictional chemistry run reports glucose, creatinine and potassium.

H|\^&|||ExampleChem^1.0|||||LIS||P|E 1394-97|20261020091400
P|1|CTX-000123|||Testpatient^Alex||19800412|F
O|1|SID-55012||^^^GLU\^^^CREA\^^^K|R|20261020091400|||||N
R|1|^^^GLU|5.4|mmol/L|3.9 to 6.1|N||F||OP-17||20261020091400|CHEM-01
R|2|^^^CREA|112|umol/L|45 to 90|H||F||OP-17||20261020091400|CHEM-01
R|3|^^^K|4.1|mmol/L|3.5 to 5.3|N||F||OP-17||20261020091400|CHEM-01
L|1|N

Each record, field by field:

FieldValueWhat it is
H-2\^&Delimiters: field, repeat, component, escape
H-5ExampleChem^1.0Sender name or ID (the analyser)
H-10LISReceiver ID
H-12PProcessing ID (P = production)
H-13E 1394-97Version of the standard
H-1420261020091400Date and time of the message
P-21Sequence number
P-3CTX-000123Practice-assigned patient ID
P-6Testpatient^AlexPatient name (last^first)
P-819800412Date of birth
P-9FSex
O-21Sequence number
O-3SID-55012Specimen ID
O-5^^^GLU\^^^CREA\^^^KUniversal test ID: here three tests, separated by the repeat delimiter
O-6RPriority (R = routine)
O-720261020091400Requested or ordered date and time
O-12NAction code (N = new specimen)
R-21Sequence number
R-3^^^GLUUniversal test ID
R-45.4The result value
R-5mmol/LUnits
R-63.9 to 6.1Reference range
R-7NAbnormal flag (N normal, H high)
R-9FResult status (F = final)
R-11OP-17Operator ID
R-1320261020091400Date and time the test was completed
R-14CHEM-01Instrument ID
L-21Sequence number
L-3NTermination code (N = normal end)

On the wire: E1381 framing

Over a serial cable, ASTM E1381 (CLSI LIS1-A) wraps each record in a frame. The analyser sends ENQ and waits for the host to ACK. Each frame is STX, a frame number from 1 to 7 and then 0 again, the record, CR, ETX, a two-character checksum and CR LF, and the host acknowledges every frame. The checksum is the sum of the bytes from the frame number to ETX, modulo 256, written in hexadecimal. Long records are split across frames, with ETB ending every frame but the last. EOT ends the transmission. Control characters are shown in angle brackets.

<ENQ>
<STX>1H|\^&|||ExampleChem^1.0|||||LIS||P|E 1394-97|20261020091400<CR><ETX>B1<CR><LF>  (device), then <ACK> (host)
<STX>2P|1|CTX-000123|||Testpatient^Alex||19800412|F<CR><ETX>41<CR><LF>  (device), then <ACK> (host)
<STX>3O|1|SID-55012||^^^GLU\^^^CREA\^^^K|R|20261020091400|||||N<CR><ETX>D0<CR><LF>  (device), then <ACK> (host)
<STX>4R|1|^^^GLU|5.4|mmol/L|3.9 to 6.1|N||F||OP-17||20261020091400|CHEM-01<CR><ETX>5C<CR><LF>  (device), then <ACK> (host)
<STX>5R|2|^^^CREA|112|umol/L|45 to 90|H||F||OP-17||20261020091400|CHEM-01<CR><ETX>33<CR><LF>  (device), then <ACK> (host)
<STX>6R|3|^^^K|4.1|mmol/L|3.5 to 5.3|N||F||OP-17||20261020091400|CHEM-01<CR><ETX>BC<CR><LF>  (device), then <ACK> (host)
<STX>7L|1|N<CR><ETX>0A<CR><LF>  (device), then <ACK> (host)
<EOT>

POCT1-A2: a full device conversation

Point-of-care analysers that speak POCT1-A2 hold a short XML conversation with the data manager. In this fictional HbA1c example: the device says hello (HEL) and the host acknowledges; the device reports one new result waiting (DST); the host asks for results (REQ); the device sends the observation (OBS), which the host acknowledges; then the topic ends (EOT) and the conversation closes (END). Each acknowledgement names the control ID of the message it answers. For how the standard works, read POCT1-A2 explained.

<!-- POCT1-A2 conversation, fictional device and patient. One XML message per step. -->
<!-- Device: HEL.R01 (hello: who the device is) -->
<HEL.R01><HDR><HDR.message_type V="HEL.R01" /><HDR.control_id V="1" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><DEV><DEV.device_id V="EX-A1C-0001" /><DEV.vendor_id V="EXAMPLE" /><DEV.model_id V="A1C" /><DEV.serial_id V="EX-A1C-0001" /><DEV.manufacturer_name V="Example Diagnostics" /><DEV.hw_version V="1.0" /><DEV.sw_version V="1.0.0" /><DEV.device_name V="Example HbA1c analyser" /><DCP><DCP.application_timeout V="60.0" /></DCP><DSC><DSC.connection_profile_cd V="SA" /><DSC.topics_supported_cd V="OBS" /><DSC.max_message_sz V="32768" /></DSC></DEV></HEL.R01>
<!-- Host: ACK.R01 -->
<ACK.R01><HDR><HDR.message_type V="ACK.R01" /><HDR.control_id V="2" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><ACK><ACK.type_cd V="AA" /><ACK.ack_control_id V="1" /></ACK></ACK.R01>
<!-- Device: DST.R01 (status: one new result waiting) -->
<DST.R01><HDR><HDR.message_type V="DST.R01" /><HDR.control_id V="3" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><DST><DST.status_dttm V="2026-10-20T09:14:00.00+01:00" /><DST.new_observations_qty V="1" /><DST.condition_cd V="R" /></DST></DST.R01>
<!-- Host: ACK.R01 -->
<ACK.R01><HDR><HDR.message_type V="ACK.R01" /><HDR.control_id V="4" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><ACK><ACK.type_cd V="AA" /><ACK.ack_control_id V="3" /></ACK></ACK.R01>
<!-- Host: REQ.R01 (send me your results) -->
<REQ.R01><HDR><HDR.message_type V="REQ.R01" /><HDR.control_id V="5" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><REQ><REQ.request_cd V="ROBS" /></REQ></REQ.R01>
<!-- Device: OBS.R01 (the result) -->
<OBS.R01><HDR><HDR.message_type V="OBS.R01" /><HDR.control_id V="6" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><SVC><SVC.role_cd V="OBS" /><SVC.observation_dttm V="2026-10-20T09:14:00.00+01:00" /><PT><PT.patient_id V="CTX-000123" /><OBS><OBS.observation_id V="HbA1c" SN="EXAMPLE" SV="1.0" /><OBS.value V="48" U="mmol/mol" /><OBS.method_cd V="M" /><OBS.interpretation_cd V="H" /><OBS.normal_lo-hi_limit V="20-41" U="mmol/mol" /></OBS></PT><OPR><OPR.operator_id V="OP-17" /></OPR></SVC></OBS.R01>
<!-- Host: ACK.R01 -->
<ACK.R01><HDR><HDR.message_type V="ACK.R01" /><HDR.control_id V="7" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><ACK><ACK.type_cd V="AA" /><ACK.ack_control_id V="6" /></ACK></ACK.R01>
<!-- Device: EOT.R01 (end of topic) -->
<EOT.R01><HDR><HDR.message_type V="EOT.R01" /><HDR.control_id V="8" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><EOT><EOT.topic_cd V="OBS" SN="POCT01" SV="1" /></EOT></EOT.R01>
<!-- Host: ACK.R01 -->
<ACK.R01><HDR><HDR.message_type V="ACK.R01" /><HDR.control_id V="9" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><ACK><ACK.type_cd V="AA" /><ACK.ack_control_id V="8" /></ACK></ACK.R01>
<!-- Host: END.R01 (end of conversation) -->
<END.R01><HDR><HDR.message_type V="END.R01" /><HDR.control_id V="10" /><HDR.version_id V="POCT1" /><HDR.creation_dttm V="2026-10-20T09:14:00.00+01:00" /></HDR><TRM><TRM.reason_cd V="NRM" /></TRM></END.R01>

Check your own HL7 message

Paste an ORU^R01 message. MLLP framing and CR, LF or CRLF line ends are fine. Nothing leaves your browser.

The checker is open source under the MIT licence (licence). It checks structure and common faults, not conformance with any one system.

Related guides

Questions, answered

Common questions about HL7 result messages.

What is an ORU^R01 message?

The HL7 v2 message that carries observation results, such as a lab or point-of-care test result, from the system that produced it to the system that needs it, for example a LIS, an EHR or a trust integration engine.

What is the difference between ORU and ORM?

ORM carries an order (in HL7 v2.5 and later, laboratory orders often use OML). ORU carries the result back. A point-of-care result that was never formally ordered is still sent as an ORU, usually with the placer and filler order numbers set by the sending system.

What is the difference between ASTM E1394 and E1381?

E1394 (CLSI LIS2-A2) defines the records: header, patient, order, result and terminator. E1381 (CLSI LIS1-A) defines how they travel over a serial line: ENQ, numbered frames with a checksum, an ACK for every frame, and EOT at the end.

Is any real patient data in these samples?

No. Every sample is fictional: the patient, the identifiers and the results are invented, and 9990000018 is an NHS test-range number that belongs to no one.

Does the checker send my message anywhere?

No. It runs in your browser and nothing you paste is uploaded. It checks structure and common interface faults; the receiving system's own specification still decides what it accepts.