CONTRL — Syntax and Service Report Message (D.96A)
CONTRL is the automatic technical acknowledgment of EDIFACT: it acknowledges or rejects, with error indication, a received interchange, functional group or message.
Purpose
The CONTRL message is "syntactically acknowledging or rejecting, with error
indication, a received interchange, functional group or message." It operates in two
modes: receipt acknowledgement (the interchange arrived) or
error report (the interchange was parsed but contains syntax
defects). It's the EDIFACT analog of SMTP's 250 OK /
5xx Error.
CONTRL is generated automatically by syntactic validators (Mendelson, OFTP2, AS2, the Generix/Tradeshift platforms). It's never emitted manually and carries no business information — only conformity to ISO 9735.
Segment structure
CONTRL D.96A has a flat structure: a minimal Header, then a sequence
of segments UCI → groups SG1 → SG3 (UCM, UCF). There is no separate
Summary section — the message simply ends with UNT.
Header
The header is just: UNH M , then UCI M .
The UCI segment is the keystone: it carries the interchange number being
acknowledged (which must match UNB[4] of the original), the sender and
receiver identifiers of the acknowledged interchange (swapped vs the original — the
CONTRL sender is the former receiver), and the action code (4 = interchange rejected
with errors, 7 = interchange acknowledged without error, 8 = partially accepted).
Detail (UCI / UCM / UCS / UCD / UCF)
After UCI, two reporting structures coexist — depending on whether the original interchange carried individual messages or functional groups.
SG1 — loop repeatable up to 999,999 times: one UCM M per acknowledged message. Each UCM can contain SG2 (repeatable 999 times): UCS M and its UCD C .
SG3 — loop repeatable up to 999,999 times, alternative to SG1 when the interchange used UNG/UNE: one UCF M per group. UCF can contain a SG4 (up to 999,999 UCM ), itself containing a SG5 with UCS + UCD for the error detail.
In practice, SG3/UCF is rare in modern flows (UNG/UNE functional groups are seldom used in retail B2B). Most CONTRL messages carry a single UCI followed by one or more UCM.
Summary
CONTRL has no separate Summary section and no UNS segment. The message
ends directly with:
UNT M .
Mandatory / conditional
Three segments are strictly mandatory in every D.96A CONTRL:
UNH— opens the message, carries the version without an association identifier.UCI— identifies the acknowledged interchange and its status. Without UCI, the CONTRL is invalid.UNT— closes the message, declares the segment count.
If the acknowledged interchange contains at least one message, then UCM
or UCF must also appear. On error, UCS and UCD
pinpoint the faulty segment and element using an error code from list D.E. 9968 (1 =
mandatory field missing, 5 = general syntax error, 13 = message structure error,
etc.).
Real-world example
A positive acknowledgment: the receiver (buyer GLN 5410000000123) confirms it has correctly parsed the reference ORDERS interchange (number CTRL000001, sent by supplier GLN 5410000000456).
UNB+UNOC:3+5410000000123:14+5410000000456:14+260513:1445+CTRL-ACK-001'
UNH+1+CONTRL:D:96A:UN'
UCI+CTRL000001+5410000000456:14+5410000000123:14+7'
UCM+1+ORDERS:D:96A:UN:EAN008+7'
UNT+4+1'
UNZ+1+CTRL-ACK-001' UNH+1+CONTRL:D:96A:UN— CONTRL message in D.96A. Note the absence of an association id (no:EAN008).UCI+CTRL000001+5410000000456:14+5410000000123:14+7— references interchange CTRL000001, identifies original sender and receiver, action 7 (interchange acknowledged without errors).UCM+1+ORDERS:D:96A:UN:EAN008+7— confirms that the reference ORDERS message "1" was correctly parsed, code 7 (message acknowledged).UNT+4+1— 4 segments in the message (UNH, UCI, UCM, UNT), reference "1" matching UNH.
Conversely, a negative acknowledgment with error report — sending an interchange CTRL000099 that contained an ORDERS message with an error on segment 15 (DE 3055, error code 5):
UNB+UNOC:3+5410000000123:14+5410000000456:14+260513:1450+CTRL-ACK-002'
UNH+1+CONTRL:D:96A:UN'
UCI+CTRL000099+5410000000456:14+5410000000123:14+4+12'
UCM+1+ORDERS:D:96A:UN:EAN008+4+13'
UCS+15+12'
UCD+12+3055+1+5'
UNT+6+1'
UNZ+1+CTRL-ACK-002' UCI+...+4+12— action 4 (interchange rejected), error code 12 (syntax error).UCM+1+ORDERS:D:96A:UN:EAN008+4+13— message rejected, code 13 (structure error).UCS+15+12— faulty segment #15, error code 12.UCD+12+3055+1+5— faulty element 3055 (code list responsible agency), error 5 (invalid value).
Common errors
- Swapped sender/receiver in UCI — the CONTRL sender is the receiver of the acknowledged interchange, and vice versa. Swapping creates a routing mismatch on the EDI platform.
- Diverging UCI[1] reference — the interchange reference in
UCI[1]must exactly matchUNB[4]of the acknowledged interchange. Any divergence means the original sender cannot link the CONTRL back to its send. - Invalid action codes — UCI[5] (action) accepts 4 (rejected), 7 (acknowledged), 8 (partially accepted). Any other code creates ambiguity on the platform.
- UNH with association id — unlike trade messages, a CONTRL
UNHcarries no association (no:EAN008). Many naive generators add one out of habit. - CONTRL not emitted — most EDI platforms require one CONTRL per received interchange, within a window (typically 15 minutes). A missing CONTRL is read as a parsing failure.
Related messages
CONTRL is the acknowledgment envelope of every other EDIFACT message:
- ORDERS D.96A — the order, every interchange triggers a CONTRL.
- ORDRSP D.96A — the order response, same.
- INVOIC D.96A — the invoice, same.
- DESADV D.96A — the despatch advice, same.
- APERAK D.96A — application acknowledgment (business level, complementary to the syntactic CONTRL).
JSON equivalent
JSON projection that matches the positive acknowledgment example. This mapping is not normative — it's an ediverse convention to ease integration in TypeScript / Python environments.
{
"interchange": {
"controlRef": "CTRL-ACK-001",
"from": { "id": "5410000000123", "qualifier": "14" },
"to": { "id": "5410000000456", "qualifier": "14" },
"datetime": "2026-05-13T14:45:00Z",
"syntax": { "id": "UNOC", "version": "3" }
},
"message": {
"ref": "1",
"type": "CONTRL",
"version": { "syntax": "D", "release": "96A", "agency": "UN" }
},
"controlReport": {
"subject": {
"interchangeRef": "CTRL000001",
"from": { "id": "5410000000456", "qualifier": "14" },
"to": { "id": "5410000000123", "qualifier": "14" }
},
"interchangeAction": "7",
"interchangeActionLabel": "Acknowledgement that the interchange has been received and is acceptable",
"messages": [
{
"ref": "1",
"type": "ORDERS",
"version": "D:96A:UN:EAN008",
"action": "7",
"actionLabel": "Message acknowledged, no syntax errors"
}
],
"errors": []
}
}