Validate Factur-X / CII e-invoices before you send them
Check the embedded UN/CEFACT CII XML of your Factur-X (and ZUGFeRD) invoices against EN 16931 and the Factur-X profiles — before the e-invoicing mandate rejects them.
Drag and drop your XML file here
or click to browse
XML only · 1 MB max · 20 transactions
Guided demo samples
Use these only to preview the diagnostics experience. Your own XML remains the main workflow.
Prefer downloads? valid XML or invalid XML
Files are processed in memory only — nothing is stored or transmitted to third parties.
EN 16931 semantic model
Official Factur-X profiles
Readable diagnostics
No account required
Not just XML validation
A valid XSD is not a valid invoice.
e-Invoicing platforms reject files for EN 16931 business-rule, profile and VAT-consistency reasons that XSD never checks. Ifriqa combines schema checks, EN 16931 rules, profile overlays and readable reports.
| Layer | What it catches |
|---|---|
| XSD / CII structure | XML structure, required elements, data types |
| EN 16931 rules | BR / BR-CO business rules, totals and VAT consistency |
| Factur-X profiles | MINIMUM / BASIC WL / BASIC / EN 16931 / EXTENDED constraints |
| Explanation layer | Human-readable diagnostics and machine-readable JSON |
Supported profiles
Mandate-ready validation
Validate the CII XML embedded in your Factur-X / ZUGFeRD PDFs against EN 16931 and each Factur-X profile before the French (2026-2027) and German B2B e-invoicing mandates.
ZUGFeRD 2.x is technically aligned with Factur-X and validated the same way.
Human-readable diagnostics
| Error | Explanation |
|---|---|
| Line totals mismatch | Sum of invoice lines does not match the document total (BR-CO-10). |
| VAT breakdown mismatch | Declared VAT total differs from the computed VAT per category (BR-CO-14). |
| Wrong CustomizationID / profile | The Factur-X profile URN does not match the actual content level. |
Guides & Reference
Technical Reference
Document structure
23 fields · 21 rules · 3 tables//*[local-name()='CrossIndustryInvoice']invoice.profileIdFactur-X Profile IDinvoice.idInvoice Numberinvoice.typeCodeDocument Type Codeinvoice.issueDateIssue Dateinvoice.currencyCodeInvoice Currency Code//*[local-name()='SellerTradeParty']seller.nameSeller Name//*[local-name()='BuyerTradeParty']buyer.nameBuyer Name//*[local-name()='SpecifiedTradeSettlementHeaderMonetarySummation']totals.lineTotalSum of Line Net Amountstotals.taxBasisAmountTax Basis Total Amount (excl. VAT)totals.taxAmountTax Total Amounttotals.grandTotalAmountGrand Total Amount (incl. VAT)totals.duePayableAmountDue Payable Amount//*[local-name()='IncludedSupplyChainTradeLineItem']line.idLine IDline.productNameProduct Nameline.billedQtyBilled Quantityline.unitPriceNet Unit Priceline.lineTotalLine Total Amount//*[local-name()='ApplicableHeaderTradeSettlement']/*[local-name()='ApplicableTradeTax']vat.categoryCodeVAT Category Codevat.ratePercentVAT Rate (%)vat.basisAmountVAT Basis Amountvat.calculatedAmountVAT Calculated Amount//*[local-name()='SpecifiedTradePaymentTerms']payment.dueDatePayment Due Date//*[local-name()='ApplicableHeaderTradeDelivery']delivery.dateDelivery DateFields
23 defined| Identifier | Label | Type | Required |
|---|---|---|---|
invoice.profileId | Factur-X Profile ID | ID | ✓ |
invoice.id | Invoice Number | ID | ✓ |
invoice.typeCode | Document Type Code | CODE | ✓ |
invoice.issueDate | Issue Date | ISO_DATE_BASIC | ✓ |
invoice.currencyCode | Invoice Currency Code | CURRENCY_CODE | — |
seller.name | Seller Name | TEXT | — |
buyer.name | Buyer Name | TEXT | — |
totals.taxBasisAmount | Tax Basis Total Amount (excl. VAT) | AMOUNT | — |
totals.taxAmount | Tax Total Amount | AMOUNT | — |
totals.grandTotalAmount | Grand Total Amount (incl. VAT) | AMOUNT | — |
totals.duePayableAmount | Due Payable Amount | AMOUNT | — |
totals.lineTotal | Sum of Line Net Amounts | AMOUNT | — |
line.id | Line ID | ID | — |
line.productName | Product Name | TEXT | — |
line.billedQty | Billed Quantity | QUANTITY | — |
line.unitPrice | Net Unit Price | AMOUNT | — |
line.lineTotal | Line Total Amount | AMOUNT | — |
vat.categoryCode | VAT Category Code | CODE | — |
vat.ratePercent | VAT Rate (%) | PERCENT | — |
vat.basisAmount | VAT Basis Amount | AMOUNT | — |
vat.calculatedAmount | VAT Calculated Amount | AMOUNT | — |
payment.dueDate | Payment Due Date | ISO_DATE_BASIC | — |
delivery.date | Delivery Date | ISO_DATE_BASIC | — |
Validation rules
21 rulesFX-PROF-001ERRORA CII invoice must specify a GuidelineSpecifiedDocumentContextParameter/ID (Factur-X profile identifier).
Factur-X Profile ID is required
FX-PROF-002ERRORThe Factur-X profile ID must be one of the recognised profile URNs (MINIMUM, BASIC-WL, BASIC, EN16931, EXTENDED).
Factur-X Profile ID ∈ Recognised Factur-X / ZUGFeRD profile URNs: {urn:factur-x.eu:1p0:minimum, urn:factur-x.eu:1p0:basicwl, urn:factur-x.eu:1p0:basic, urn:cen.eu:en16931:2017, urn:factur-x.eu:1p0:extended, urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.3 ... (16 values)}
FX-HDR-001ERRORAn invoice shall have an invoice number (ExchangedDocument/ID). (EN16931 BR-02)
Invoice Number is required
FX-HDR-002ERRORAn invoice shall have an issue date (ExchangedDocument/IssueDateTime). (EN16931 BR-03)
Issue Date is required
FX-HDR-003ERRORAn invoice shall specify a document type code (ExchangedDocument/TypeCode). (EN16931 BR-04)
Document Type Code is required
FX-HDR-004ERRORThe invoice document type code must be one of the recognised UNTDID 1001 codes for Factur-X invoices.
Document Type Code is present
Document Type Code ∈ UNTDID 1001 document type codes allowed for Factur-X: {380, 381, 383, 384, 386, 389 ... (12 values)}
FX-SEL-001ERRORAn invoice shall contain the seller name (SellerTradeParty/Name). (EN16931 BR-06)
Seller Name is required
FX-BUY-001ERRORAn invoice shall contain the buyer name (BuyerTradeParty/Name). (EN16931 BR-07)
Buyer Name is required
FX-TOT-001ERRORThe header line total amount must equal the sum of all invoice line total amounts, with a tolerance of 0.01.
Sum of Line Net Amounts is present and Line Total Amount is present
Sum of Line Net Amounts = Σ line.lineTotal over line.lineTotal (±0.01)
FX-TOT-002ERRORThe grand total amount must equal the tax basis total amount plus the tax total amount, with a tolerance of 0.01.
Grand Total Amount (incl. VAT) is present and Tax Basis Total Amount (excl. VAT) is present and Tax Total Amount is present
Grand Total Amount (incl. VAT) = Tax Basis Total Amount (excl. VAT) + Tax Total Amount (±0.01)
FX-LIN-001ERROREach invoice line must have a line identifier (AssociatedDocumentLineDocument/LineID).
Line ID is required
FX-LIN-003ERROREach invoice line must state the billed quantity.
Billed Quantity is required
FX-LIN-004ERROREach invoice line must state the net unit price.
Net Unit Price is required
FX-VAT-001ERROREach VAT breakdown category code must be one of the recognised EN16931 VAT category codes.
VAT Category Code is present
VAT Category Code ∈ EN16931 VAT category codes: {S, Z, E, AE, K, G ... (9 values)}
FX-VAT-003ERRORThe tax total amount must equal the sum of VAT breakdown calculated amounts, with a tolerance of 0.01.
Tax Total Amount is present and VAT Calculated Amount is present
Tax Total Amount = Σ vat.calculatedAmount over vat.calculatedAmount (±0.01)
FX-VAT-004ERRORThe tax basis total amount must equal the sum of VAT breakdown basis amounts, with a tolerance of 0.01.
Tax Basis Total Amount (excl. VAT) is present and VAT Basis Amount is present
Tax Basis Total Amount (excl. VAT) = Σ vat.basisAmount over vat.basisAmount (±0.01)
FX-PROFILE-BASIC-001ERRORFactur-X 1.08 BASICThis validator is for the Factur-X BASIC profile; the invoice profile ID must be urn:factur-x.eu:1p0:basic.
Factur-X Profile ID is present
Factur-X Profile ID = "urn:factur-x.eu:1p0:basic"
FX-PROFILE-BASICWL-001ERRORFactur-X 1.08 BASIC-WLThis validator is for the Factur-X BASIC-WL profile; the invoice profile ID must be urn:factur-x.eu:1p0:basicwl.
Factur-X Profile ID is present
Factur-X Profile ID = "urn:factur-x.eu:1p0:basicwl"
FX-PROFILE-EN16931-001ERRORFactur-X 1.08 EN16931This validator is for the Factur-X EN16931 profile; the invoice profile ID must be urn:cen.eu:en16931:2017.
Factur-X Profile ID is present
Factur-X Profile ID = "urn:cen.eu:en16931:2017"
FX-PROFILE-EXTENDED-001ERRORFactur-X 1.08 EXTENDEDThis validator is for the Factur-X EXTENDED profile; the invoice profile ID must be urn:factur-x.eu:1p0:extended.
Factur-X Profile ID is present
Factur-X Profile ID = "urn:factur-x.eu:1p0:extended"
FX-PROFILE-MINIMUM-001ERRORFactur-X 1.08 MINIMUMThis validator is for the Factur-X MINIMUM profile; the invoice profile ID must be urn:factur-x.eu:1p0:minimum.
Factur-X Profile ID is present
Factur-X Profile ID = "urn:factur-x.eu:1p0:minimum"
Reference tables
3 listsRecognised Factur-X / ZUGFeRD profile URNs
facturx-profile-urnsUNTDID 1001 document type codes allowed for Factur-X
invoice-type-codesEN16931 VAT category codes
vat-category-codesBuilt for
- ERP and accounting software vendors
- Finance and AP/AR teams preparing e-invoices
- Companies subject to the FR 2026-2027 / DE e-invoicing mandate
- Developers integrating Factur-X / ZUGFeRD export
- Consultants debugging e-invoice rejections
| Feature | Free | Paid |
|---|---|---|
| Single invoice validation | Yes | Yes |
| XSD + EN 16931 diagnostics | Yes | Yes |
| Full business explanation | Partial | Yes |
| JSON/API report | Preview | Yes |
| Batch / ZIP | No | Yes |
| Profile-specific reports | Limited | Yes |
| History / saved reports | No | Yes |
| API access | No | Yes |
Need batch validation or API access?
API access, ZIP/batch processing, saved reports and profile-specific diagnostics are planned for paid usage.