How to Read a UII
A UII looks like one long string, but it is three or four fields concatenated in a fixed order. This guide takes D1A2B3PN-A1234X0001 apart character by character, explains how a reader derives the UII from the Data Matrix, and shows why you cannot always parse one by eye.
- Updated
- 2026-10-03
- Length
- 909 words
Here is a Unique Item Identifier as it would appear in the DoD IUID Registry:
D1A2B3PN-A1234X0001
Nineteen characters, no separators, nothing to indicate where one field ends and the next begins. It is readable once you know the rule: a UII is a fixed sequence of fields concatenated in order, and the first one or two characters tell you how to read the rest.
The four pieces
| Piece | Characters | Meaning |
|---|---|---|
| Issuing agency code (IAC) | D | What kind of enterprise identifier follows. D means a CAGE code. |
| Enterprise identifier (EID) | 1A2B3 | The CAGE code of the enterprise that assigned the UII. |
| Original part number | PN-A1234 | Present under Construct 2 only. |
| Serial number | X0001 | Unique within the part number (Construct 2) or the enterprise (Construct 1). |
Concatenated: D + 1A2B3 + PN-A1234 + X0001 = D1A2B3PN-A1234X0001.
The issuing agency code
The IAC is a prefix from ISO/IEC 15459 that qualifies the enterprise identifier. The ones you will meet on DoD hardware:
D— the enterprise identifier is a CAGE code (five characters).UN— the enterprise identifier is a DUNS number (nine digits).- A digit
0–9— the enterprise identifier is a GS1 company prefix (the IAC is the first digit of the prefix itself). LD— a DoDAAC, used by DoD activities marking their own property.
So D1A2B3… reads "CAGE code 1A2B3." A UII beginning UN123456789… reads "DUNS 123456789."
The enterprise identifier
For a CAGE code, exactly five characters follow the D. CAGE codes are five alphanumeric characters and never contain the letters I or O, which removes the usual 1/I and 0/O ambiguity. See What is a CAGE code for where the code comes from and where else it appears.
The part number, under Construct 2
Under Construct 2 the original part number follows the enterprise identifier: the part number the item was first produced under, without a revision letter. Here it is PN-A1234. Under Construct 1 there is no part number at all and the serial follows the enterprise identifier directly. Construct 1 vs Construct 2 covers when each is used.
A lot or batch number can take the part number's place under Construct 2 for items serialized within a lot.
The serial number
The last field is the serial, here X0001. Under Construct 2 it only has to be unique within the part number; under Construct 1, across the entire enterprise.
Why you cannot always parse one by eye
Look at the example again: D1A2B3PN-A1234X0001. Nothing in the string says the part number is eight characters and the serial five. It could, in principle, be part number PN-A1234X and serial 0001. The UII is unambiguous as an identifier, because it is unique as a whole, but it is not self-describing as a set of fields.
That is why the Data Matrix does not carry the concatenated UII. It carries the fields separately, each tagged with a qualifier, inside an ISO/IEC 15434 message, and the reader concatenates them. The fields are recoverable from the symbol, not from the string.
How a reader derives it from the Data Matrix
In Format 06, the message inside the symbol for the example is:
[)> RS 06 GS 17V1A2B3 GS 1PPN-A1234 GS SX0001 RS EOT
RS, GS, and EOT are the ASCII 30, 29, and 4 control characters. The reader:
- Sees the
[)>RS06header and knows the qualifiers are ASC MH10.8.2 data identifiers. - Finds
17Vand reads the CAGE1A2B3. The17Videntifier tells it the IAC isD. - Finds
1Pand reads the original part numberPN-A1234. - Finds
Sand reads the serialX0001. - Concatenates IAC + EID + part number + serial:
D1A2B3PN-A1234X0001.
In Format 12 the same fields are tagged MFR, PNO, and SEQ instead, and the derived UII is identical. Format 06 vs Format 12 covers the two qualifier systems.
Under Construct 1 in Format 06, the whole thing can be one element: 18S1A2B3X0001 (CAGE plus serial, IAC implied) or 25SD1A2B3X0001 (the complete UII including the IAC). Either way the reader arrives at D1A2B3X0001.
The rules the string has to obey
- 50 characters maximum, counting the IAC.
- Uppercase A–Z, 0–9, dash, and forward slash only. No spaces, no lowercase, no other punctuation.
- Never changes. Once assigned to an item, the UII stays with it through repair, rebuild, and part number revisions. A new UII is a new item.
- Unique, by construction: the enterprise identifier guarantees no two enterprises collide, and the enterprise guarantees the serial (within the part number) does not repeat.
Reading a few more
| UII | Reads as |
|---|---|
D1A2B3X0001 | CAGE 1A2B3, Construct 1, serial X0001 |
D1A2B3LOT2026-04A017 | CAGE 1A2B3, Construct 2 with lot LOT2026-04A, serial 017 (only the symbol tells you where the lot ends) |
UN123456789PN-A1234X0001 | DUNS 123456789, Construct 2, part PN-A1234, serial X0001 |
LD + DoDAAC + serial | A DoD activity's own property, Construct 1 |
The IUID generator builds the message from the fields, checks the character set and the 50-character limit, and shows the derived UII next to the symbol, which is the quickest way to confirm a string before it is marked on a part or submitted to the Registry.