Validate a UBL 2.1 invoice via API
UBL 2.1 is the OASIS XML syntax, the most widespread in European exchange and the reference syntax of the Peppol network. It carries the same invoice model as CII, with different tags.
What it actually is
The second syntax EN 16931 allows. An issuer picks one or the other according to its ecosystem — European business software leans towards UBL, Franco-German exchange towards CII — and the standard guarantees both carry the same data.
What sets it apart from CII
UBL expresses discounts one way where CII distinguishes two levels. A single rule suffices there, where CII needs two. Conversely, a consistency rule on price base quantities exists only in CII.
No container
UBL is submitted as bare XML. The hybrid PDF/A-3 format only hosts CII: a UBL has no place in it, and a PDF carrying one would be rejected at the container level.
CII or UBL: how many rules actually differ
55 rules apply identically to both syntaxes. 1 are specific to one — that is where, and only where, the choice of syntax changes the verdict.
- PEPPOL-EN16931-R043
The allowance or charge 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
56 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