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.
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.
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.
Field by field
The fields used in the generic sample, in order.
| Field | Value in the generic sample | What it is |
|---|
MSH-3 | Catenix | Sending application |
MSH-4 | Catenix | Sending facility |
MSH-5 | TIE | Receiving application |
MSH-6 | RXX | Receiving facility |
MSH-7 | 20261020091500 | Date and time of the message |
MSH-9 | ORU^R01^ORU_R01 | Message type: an unsolicited observation result |
MSH-10 | C0A1B2C3D4E5 | Message control ID, unique per message |
MSH-11 | P | Processing ID (P = production) |
MSH-12 | 2.5.1 | HL7 version |
MSH-15 | AL | Accept acknowledgement: always |
MSH-16 | NE | Application acknowledgement: never |
PID-1 | 1 | Set ID |
PID-3 | CTX-000123^^^CATENIX^MR | Patient identifier, with assigning authority and identifier type code |
PID-5 | Testpatient^Alex | Patient name (family^given) |
PID-7 | 19800412 | Date of birth |
PID-8 | F | Administrative sex |
PV1-1 | 1 | Set ID |
PV1-2 | O | Patient class (O = outpatient) |
OBR-1 | 1 | Set ID |
OBR-2 | ORD-55012 | Placer order number (the ordering system's number) |
OBR-3 | POCT-7F3A9C21 | Filler order number (the performing system's number) |
OBR-4 | 59261-8^HbA1c^LN | Universal service identifier: what was tested, here as a LOINC code |
OBR-7 | 20261020091500 | Observation date and time |
OBR-22 | 20261020091500 | Date and time the result was reported or last changed |
OBR-25 | F | Result status (F = final) |
OBX-1 | 1 | Set ID |
OBX-2 | NM | Value type (NM = numeric) |
OBX-3 | 59261-8^HbA1c^LN | Observation identifier (LOINC code^name^coding system) |
OBX-5 | 48 | The result value |
OBX-6 | mmol/mol | Units |
OBX-7 | 20-41 | Reference range |
OBX-8 | H | Abnormal flag (H = high, N = normal) |
OBX-11 | F | Observation result status (F = final). Receivers often reject results without it |
OBX-14 | 20261020091500 | Date and time of the observation |
OBX-15 | AFINION2-01^Catenix | Producer: here the analyser that produced the result |
OBX-16 | OP-17 | Responsible observer: here the operator ID |
NTE-1 | 1 | Set ID |
NTE-2 | L | Source of the comment (L = ancillary or filler) |
NTE-3 | Sample 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:
| Field | Value | What it is |
|---|
H-2 | \^& | Delimiters: field, repeat, component, escape |
H-5 | ExampleChem^1.0 | Sender name or ID (the analyser) |
H-10 | LIS | Receiver ID |
H-12 | P | Processing ID (P = production) |
H-13 | E 1394-97 | Version of the standard |
H-14 | 20261020091400 | Date and time of the message |
P-2 | 1 | Sequence number |
P-3 | CTX-000123 | Practice-assigned patient ID |
P-6 | Testpatient^Alex | Patient name (last^first) |
P-8 | 19800412 | Date of birth |
P-9 | F | Sex |
O-2 | 1 | Sequence number |
O-3 | SID-55012 | Specimen ID |
O-5 | ^^^GLU\^^^CREA\^^^K | Universal test ID: here three tests, separated by the repeat delimiter |
O-6 | R | Priority (R = routine) |
O-7 | 20261020091400 | Requested or ordered date and time |
O-12 | N | Action code (N = new specimen) |
R-2 | 1 | Sequence number |
R-3 | ^^^GLU | Universal test ID |
R-4 | 5.4 | The result value |
R-5 | mmol/L | Units |
R-6 | 3.9 to 6.1 | Reference range |
R-7 | N | Abnormal flag (N normal, H high) |
R-9 | F | Result status (F = final) |
R-11 | OP-17 | Operator ID |
R-13 | 20261020091400 | Date and time the test was completed |
R-14 | CHEM-01 | Instrument ID |
L-2 | 1 | Sequence number |
L-3 | N | Termination 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>