Skip to content

BR-CL-21: Use an ISO 6523 ICD code in the item identifier schemeID

The schemeID on an item standard identifier must be a code from the ISO 6523 ICD list. For a GTIN that is 0160, not the text GTIN.

EN 16931Fatal: the document is invalidCode listsLines and prices

The short answer

BR-CL-21 fails when the schemeID on cac:StandardItemIdentification/cbc:ID is not a code on the ISO 6523 ICD list. The recorded example writes GTIN, the name of the scheme. Write its four-digit code instead: 0160 is the ICD code for GTIN, the Global Trade Item Number.

ICD codes are digits with leading zeros and must be sent as text, exactly as listed. 160 is not 0160, and it fails.

What the rule checks

The rule applies to each cbc:ID in cac:StandardItemIdentification that has a schemeID, and looks the value up in the ICD codes bundled with the pinned artefacts. Identifiers without the attribute are left to BR-64.

Spaces around the value are trimmed before the lookup, so " 0160 " passed when tried. Anything else must match a listed code character for character: 160, GTIN, the UNTDID 7143 code SRV and an empty schemeID="" all failed.

Whether the identifier fits the scheme is not examined. With 0160, a number with a wrong GS1 check digit passed every layer when tried.

Any listed code passes, including codes for location and organisation numbering schemes that say nothing useful about a product. Pick the code by the scheme the number was issued under, not by what validates.

TermMeaningUBL element
BT-157Item standard identifier: its scheme identifier attributecac:InvoiceLine/cac:Item/cac:StandardItemIdentification/cbc:ID/@schemeID (under cac:CreditNoteLine in a credit note)
BT-157Item standard identifiercac:InvoiceLine/cac:Item/cac:StandardItemIdentification/cbc:ID

How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

  • The product data holds the scheme as a name such as GTIN, EAN or UPC, and the mapping copies it into schemeID.
  • The ICD code is stored in a numeric column and loses its leading zero, so 0160 is written as 160.
  • A UNTDID 7143 code meant for classifications, such as SRV, which that list defines as a GS1 Global Trade Item Number, is written here where the ICD list applies.

How to fix it

  1. Find out which numbering scheme the identifier belongs to. A GS1 GTIN, including EAN-13 and UPC barcode numbers, uses 0160.
  2. Map scheme names to ICD codes in one table and write the code as text, with its leading zeros, to schemeID on cac:StandardItemIdentification/cbc:ID.
  3. If the identifier is not from a public scheme, such as your own article number, move it to cac:SellersItemIdentification/cbc:ID and send it there without a scheme.
  4. Check the GTIN check digit yourself if the buyer relies on the number; the validator does not.

Validate your corrected invoice

Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Fragment of the failing invoice: schemeID holds the scheme name GTIN

<cac:StandardItemIdentification>
  <cbc:ID schemeID="GTIN">5012345678900</cbc:ID>
</cac:StandardItemIdentification>

Fragment of the corrected invoice: schemeID holds 0160, the ICD code for GTIN

<cac:StandardItemIdentification>
  <cbc:ID schemeID="0160">5012345678900</cbc:ID>
</cac:StandardItemIdentification>

Only the schemeID value differs: GTIN in the failing invoice, 0160 in the corrected one. The failing document reports only BR-CL-21. BR-64 passes, because it only asks for the attribute to be there, whatever it holds.

What the validator reported

Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.

Where it applies

  • Applies to UBL Invoice and CreditNote lines alike. When tried, a credit note with schemeID="GTIN" on the item standard identifier reported this rule alone.
  • The rule is limited to cac:StandardItemIdentification. A schemeID on cac:SellersItemIdentification/cbc:ID is not checked against the ICD list: when tried with the value GTIN, it produced only the warning UBL-CR-668 and the document stayed valid.
  • Party identifiers use the same ICD list under a separate rule, BR-CL-10.

Scope and source

Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.

The official definition of BR-CL-21 carries the normative wording and test. This page is our explanation of it, not a copy.

Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.