# 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`.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: Code lists, Lines and prices
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CL-21/
- Explanation last updated: 2026-09-24

## 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`, `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.

## 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

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

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

```xml
<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 XML](https://ironfang.uk/finance/rule-examples/BR-CL-21-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/item-details-valid.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 `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`.

## Related rules

- [BR-64 requires the schemeID attribute whose value this rule checks](https://ironfang.uk/docs/finance/rules/BR-64.md)
- [BR-CL-13 is the code list check for the scheme of the item classification code](https://ironfang.uk/docs/finance/rules/BR-CL-13.md)
- [BR-CL-10 checks party identifier schemes against the same ICD list](https://ironfang.uk/docs/finance/rules/BR-CL-10.md)

## 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](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/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.

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/BR-CL-21)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
