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.
| Term | Meaning | UBL element |
|---|---|---|
| BT-157 | Item standard identifier: its scheme identifier attribute | cac:InvoiceLine/cac:Item/cac:StandardItemIdentification/cbc:ID/@schemeID (under cac:CreditNoteLine in a credit note) |
| BT-157 | Item standard identifier | cac: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,EANorUPC, and the mapping copies it intoschemeID. - The ICD code is stored in a numeric column and loses its leading zero, so
0160is written as160. - 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
- Find out which numbering scheme the identifier belongs to. A GS1 GTIN, including EAN-13 and UPC barcode numbers, uses
0160. - Map scheme names to ICD codes in one table and write the code as text, with its leading zeros, to
schemeIDoncac:StandardItemIdentification/cbc:ID. - If the identifier is not from a public scheme, such as your own article number, move it to
cac:SellersItemIdentification/cbc:IDand send it there without a scheme. - 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
- The failing invoice reports BR-CL-21. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected XML
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
InvoiceandCreditNotelines alike. When tried, a credit note withschemeID="GTIN"on the item standard identifier reported this rule alone. - The rule is limited to
cac:StandardItemIdentification. AschemeIDoncac:SellersItemIdentification/cbc:IDis not checked against the ICD list: when tried with the valueGTIN, it produced only the warningUBL-CR-668and the document stayed valid. - Party identifiers use the same ICD list under a separate rule,
BR-CL-10.
Related rules
- BR-64 requires the schemeID attribute whose value this rule checks
- BR-CL-13 is the code list check for the scheme of the item classification code
- BR-CL-10 checks party identifier schemes against the same ICD list
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
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.
