CII is one of the two XML syntaxes the EN 16931 standard accepts. Cross-Industry Invoice (CII) is the UN/CEFACT syntax that sits at the heart of Factur-X and ZUGFeRD. When you generate a hybrid invoice, it is the CII XML, not the PDF page, that a Plateforme Agréée (PDP), Chorus Pro, or your trading partner's accounting system actually reads. Validating that XML before you send it is the single most reliable way to avoid a silent rejection after transmission.
What the CII validator checks
A CII invoice must pass two distinct compliance layers. Our validator runs both automatically and reports each result separately, so you can see exactly where a file falls short.
CII D16B XSD schema - validates the XML against the UN/CEFACT Cross-Industry Invoice D16B schema. This catches structural problems first: missing required elements, incorrect data types in monetary or quantity amounts, malformed date formats (CII dates use format code 102, i.e. YYYYMMDD), and namespace declaration errors. A file that fails the schema can never pass the business rules, so this layer runs before anything else.
EN 16931 Schematron: 200+ business rules - this is where most rejections originate. The rules check VAT arithmetic consistency (BR-CO-14: invoice total VAT must equal the sum of all VAT category amounts), category-specific constraints (BR-S-08: standard-rate lines must carry a rate greater than zero), mandatory fields (BR-01: specification identifier, BR-06: seller name), and payment rules (BR-61: IBAN required when the payment means code is 30 or 58). The specification identifier in your XML declares the profile (MINIMUM, BASIC WL, BASIC, EN 16931, or EXTENDED), and that profile decides which rules are mandatory versus optional.
Common CII validation errors, and what they mean
These are the rule violations we see most frequently on CII XML. If your file fails, one of these is likely the cause.
BR-01 - Specification identifier missing
The GuidelineSpecifiedDocumentContextParameter/ID element is absent or empty. Every CII invoice must declare its EN 16931 profile identifier (for example urn:cen.eu:en16931:2017 or a Factur-X URN such as urn:factur-x.eu:1p0:en16931). Without it the validator cannot decide which profile rules to apply and rejects the file immediately.
BR-CO-14 - VAT total does not match VAT breakdown
The invoice total VAT amount does not equal the sum of all VAT category breakdown amounts. This typically fires when rounding differences between line-level and header-level VAT create a discrepancy of even one cent. Compute the header VAT totals from the breakdown rather than independently.
BR-S-08 - Standard-rate VAT line has zero rate
An invoice line declares VAT category code S (standard rate) but carries a 0% rate. If zero rate is intended, use category code Z (zero-rated) or E (exempt) instead.
BR-AE-05 - Reverse charge line has non-zero VAT rate
When VAT category AE (reverse charge / autoliquidation) is used, the rate must be exactly zero: the buyer is responsible for reporting the tax.
XSD - Invalid date format
A date element carries a format attribute other than 102, or a value that is not a valid YYYYMMDD string. CII represents dates as a DateTimeString with format 102, which is stricter than the ISO format used in UBL.
XSD - Element out of sequence
CII is order-sensitive: child elements must appear in the exact sequence the schema defines. An element placed before a sibling it should follow will fail the XSD even when every value is correct. This is one of the most common surprises when hand-building CII XML.
CII, Factur-X and ZUGFeRD: how they relate
Factur-X (France) and ZUGFeRD (Germany) are not separate XML formats: they are the same CII XML wrapped inside a PDF/A-3b container. A CII file that validates here is exactly what you embed to produce a compliant hybrid invoice for either standard. If you have a standalone CII XML, validate it first, then embed it; if you already have a hybrid PDF, drop it here and we will extract and validate the embedded CII for you.
CII is also one of the two syntaxes Peppol BIS Billing 3.0 supports, alongside UBL. If you need to move between syntaxes, validating the CII first guarantees a clean source before conversion.