Validate a CII invoice (UN/CEFACT D22B) via API
CII is the United Nations XML syntax for commercial exchange, and it is the one found inside a Factur-X PDF. It can also be submitted on its own, without a container.
What it actually is
One of the two syntaxes EN 16931 allows for carrying an invoice. It is not a competitor to UBL: both express the same data model with different tags. A business rule is therefore written twice, once per syntax, and that is what the sealed artifacts do.
What sets it apart from UBL
CII separates a discount applied to the document from one applied to a line price. Where UBL has a single rule on the discount indicator, CII has two — one per level. It is the most visible difference between the two rule sets, and the reason the same defect can carry two codes depending on syntax.
On its own or inside a PDF
Submitted on its own, the invoice is judged on its business rules. Submitted inside a PDF/A-3, it is judged on those too — plus the container checks.
CII or UBL: how many rules actually differ
55 rules apply identically to both syntaxes. 3 are specific to one — that is where, and only where, the choice of syntax changes the verdict.
- BR-TMP-3
The item price base quantity differs between gross and net price
- PEPPOL-EN16931-R043-1
The document-level allowance or charge indicator is neither “true” nor “false”
- PEPPOL-EN16931-R043-2
The applied price allowance indicator is neither “true” nor “false”
What Factlint judges it against
The sealed floors that accept this format today. Every verdict names the one that issued it, and stays replayable.
de-2026-08XRechnung 3.0.2 (KoSIT)
eu-en16931-2026-08EN 16931-1:2017
fr-2026-08EN 16931 CIUS France + BR-FR-CTC (FNFE)
The codes that apply
58 documented codes apply to this format. Here are 12, in alphabetical order.
See the codes →Try it
The free validator accepts this format without an account. Via API, the call is one line:
curl -X POST https://api.factlint.com/v1/validate \ -F 'file=@facture.xml' \ -F 'jurisdiction=FR' \ -F 'ruleset=latest' \ -F 'pinned=true' \ -H 'Accept-Language: fr'Open the validator