The short answer
BR-CL-13 fails when the listID on cac:CommodityClassification/cbc:ItemClassificationCode is not a code from the UNTDID 7143 list. The recorded example writes the scheme name, UNSPSC. Replace it with the list code for the scheme: TST for UNSPSC, STI for CPV, HS for the Harmonised System.
The corrected example keeps the code 80111600 and changes only how its scheme is written. The validator never checks the code against the classification, so the scheme you declare has to be the one the code really comes from.
What the rule checks
The rule reads the listID of each cbc:ItemClassificationCode that has one and looks it up in the UNTDID 7143 codes bundled with the validation artefacts. A classification code without listID is outside its scope and is reported by BR-65.
Spaces at either end are ignored, but otherwise the match is exact and case-sensitive. When tried, listID=" TST " passed, while tst and the scheme names UNSPSC and CPV failed. An empty listID="" failed as well.
Only the scheme is validated, never the classification code inside the element. When tried, listID="TST" around the text NOT-A-CODE passed every layer.
ZZZ, which the list defines as mutually defined, is accepted and passed when tried. It says only that the two parties agreed the scheme between themselves.
| Term | Meaning | UBL element |
|---|---|---|
| BT-158 | Item classification identifier: its scheme identifier attribute | cac:InvoiceLine/cac:Item/cac:CommodityClassification/cbc:ItemClassificationCode/@listID (under cac:CreditNoteLine in a credit note) |
| BT-158 | Item classification identifier | cac:InvoiceLine/cac:Item/cac:CommodityClassification/cbc:ItemClassificationCode |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The mapping copies the scheme name held in the product data, such as
UNSPSCorCPV, straight intolistID. - The 7143 codes do not spell the scheme names, so
STIfor CPV andTSTfor UNSPSC are easy to swap or to guess. - Codes pass through a normalisation step that lower-cases them.
- A default
listIDtaken from another trading partner guide or format is written for every classification.
How to fix it
- Find out which classification scheme the code in the element comes from.
- Look the scheme up in the UNTDID 7143 list as published with the Peppol BIS code lists and copy its code exactly, in upper case. UNSPSC is
TST; CPV isSTI; the Harmonised System isHS. - Keep the translation as a table from your scheme names to 7143 codes, and fail the export for a scheme with no entry instead of writing the name.
- Use
ZZZonly when no listed code fits and the scheme really has been agreed with the buyer.
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: listID holds the scheme name UNSPSC
<cac:CommodityClassification>
<cbc:ItemClassificationCode listID="UNSPSC">80111600</cbc:ItemClassificationCode>
</cac:CommodityClassification>Fragment of the corrected invoice: listID holds TST, the UNTDID 7143 code for UNSPSC
<cac:CommodityClassification>
<cbc:ItemClassificationCode listID="TST">80111600</cbc:ItemClassificationCode>
</cac:CommodityClassification>Only the listID value differs: the scheme name UNSPSC in the failing invoice, its UNTDID 7143 code TST in the corrected one. The classification and the code 80111600 stay the same; only the way the scheme is identified changes. The failing document reports only BR-CL-13.
What the validator reported
- The failing invoice reports BR-CL-13. 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
cac:InvoiceLinein anInvoiceandcac:CreditNoteLinein aCreditNote. When tried, a credit note withlistID="UNSPSC"reported this rule alone. - The item standard identifier is checked against a different list. Its
schemeIDmust be an ISO 6523 ICD code, whichBR-CL-21tests; a 7143 code is not valid there. - The
listVersionIDattribute is not read by this rule.
Related rules
- BR-65 requires the listID attribute whose value this rule checks
- BR-CL-21 is the code list check for the scheme of the item standard identifier
- BR-CL-23 checks the unit code on the same line against its own code 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-13 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.
