ZUGFeRD Validator

Validate a ZUGFeRD invoice online: upload the XML embedded in the PDF and check it against the EN 16931 business rules. Free, no sign-up, results in seconds.

Note: the validator accepts XML only, not PDF. Save the embedded factur-x.xml from your ZUGFeRD PDF first. Here is how.

Rules: EN16931 1.3.16 and Peppol BIS Billing 3.0.20 for UBL · EN16931 1.3.16 for CII · XRechnung 3.0.2 (KoSIT schematron 2.6.0) · last updated 15 October 2026

How to validate a ZUGFeRD invoice

1

Save the XML from the PDF

A ZUGFeRD invoice is a PDF/A-3 with a file attachment. Save the XML attachment from your PDF reader's attachments panel or with a command-line tool.

2

Upload the XML file

Drop the XML into the upload area above. The validator detects CII syntax automatically and applies the EN 16931 rules for CII.

3

Fix the findings

Each finding gives the rule ID, the XML location and the rule message. Correct the data in your invoicing software, regenerate the PDF and validate again.

Extracting the XML from a ZUGFeRD PDF

The structured invoice data lives in a file attached to the PDF. The page you see is only the human-readable rendering. Under German VAT guidance, the structured XML is the part that counts for a hybrid e-invoice, which is why the validator checks that file.

  • Adobe Acrobat Reader: click the paperclip icon (Attachments) in the left sidebar, select the XML file and save it.
  • Other PDF readers: look for an “Attachments” or “Embedded files” panel. Most built-in browser viewers do not show attachments.
  • Command line: pdfdetach -saveall invoice.pdf (Poppler), qpdf --list-attachments invoice.pdf then qpdf --show-attachment=factur-x.xml invoice.pdf > factur-x.xml, or mutool extract invoice.pdf.

The attachment name depends on version and profile: factur-x.xml from ZUGFeRD 2.1 onwards, xrechnung.xml for the XRECHNUNG profile, zugferd-invoice.xml for ZUGFeRD 2.0 and ZUGFeRD-invoice.xml for the legacy 1.0. If there is no attachment at all, the file is a plain PDF, not an e-invoice.

ZUGFeRD profiles and what the result tells you

The profile is declared in the specification identifier (BT-24), in ram:GuidelineSpecifiedDocumentContextParameter/ram:ID. It decides whether the file is an e-invoice under German VAT law and how much an EN 16931 check can tell you.

ProfileEN 16931E-invoice (DE)Our check
MINIMUMurn:factur-x.eu:1p0:minimumNoNoNot meaningful: required fields are left out by design
BASIC WLurn:factur-x.eu:1p0:basicwlNoNoNot meaningful: no invoice lines
BASICurn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:basicYes (subset)YesMeaningful
EN 16931 (COMFORT)urn:cen.eu:en16931:2017YesYesMeaningful
EXTENDEDurn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extendedYes, plus extra fieldsYesEN 16931 core checked, extra fields not
XRECHNUNGurn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0YesYesEN 16931 and KoSIT BR-DE rules checked

Identifiers apply to ZUGFeRD 2.1 and later; for XRECHNUNG the suffix follows the XRechnung version. The BMF guidance treats MINIMUM and BASIC WL as “other invoices”, not e-invoices. Background on the format is in ZUGFeRD explained; deadlines are in the German e-invoicing mandate.

ZUGFeRD and Factur-X versions

ZUGFeRDFactur-XNote
1.0 (2014)noneOwn data model, not EN 16931 compliant
2.0 (2019)1.0 (largely aligned)First version based on EN 16931
2.1 / 2.1.1 (2020)1.0.05Technically identical; XRECHNUNG profile added
2.2 (2022)1.0.06Technically identical
2.3 / 2.3.2 / 2.3.3 (2024–2025)1.0.07 / 1.07.2 / 1.07.3Technically identical
2.4 (in force from 15 Jan 2026)1.08Technically identical; adds sub-lines

Because ZUGFeRD and Factur-X share one specification, a French Factur-X invoice is validated the same way; see also the Factur-X validator. For how both compare with XRechnung, read ZUGFeRD vs Factur-X vs XRechnung.

What we check and what we do not

Checked

  • EN 16931 business rules (BR-) for mandatory data such as invoice number, date, seller, buyer and lines
  • Calculation rules (BR-CO-): line totals, net total, VAT total and amount due
  • Decimal rules (BR-DEC-) and VAT category rules (BR-S-, BR-Z-, BR-E-, BR-AE-, BR-IC-, BR-G-, BR-O-)
  • Code lists (BR-CL-): currencies, country codes, units of measure, payment means
  • CEN syntax rules for the Cross Industry Invoice (CII-SR-)
  • For the XRECHNUNG profile, also the German XRechnung rules from KoSIT (BR-DE-), such as the Leitweg-ID or seller contact details

Not checked

  • PDF files: no PDF upload and no PDF/A-3 conformance check
  • XMP metadata and the profile declared in the PDF, or whether the visible PDF matches the XML
  • FeRD/FNFE profile-specific schematrons (for example for MINIMUM, BASIC WL or EXTENDED)
  • German XRechnung rules from KoSIT (BR-DE-) for the other profiles, where they do not apply
  • XSD schema validation of the CII XML (we check that it is well-formed XML)
  • Peppol BIS Billing 3.0, which uses UBL rather than CII
  • ZUGFeRD 1.0, which uses an older data model that predates EN 16931

For a binding XRechnung check, add the KoSIT validator. Pure XRechnung files in UBL go to the XRechnung validator; Peppol UBL invoices to the Peppol validator.

Typical findings in ZUGFeRD XML

BR-CO-10

Line total does not add up

The sum of line net amounts in the header (BT-106, ram:LineTotalAmount) must equal the sum of all invoice line net amounts (BT-131). A common cause is rounding per line in a different way than in the total.

BR-CO-15

Gross total does not match

The invoice total with VAT (BT-112) must equal the total without VAT (BT-109) plus the VAT total (BT-110).

BR-S-08

VAT breakdown per rate

For each standard-rated VAT rate, the taxable amount in the VAT breakdown must equal the sum of the matching line amounts, allowances and charges.

BR-11

Buyer country missing

The buyer address needs a country code (BT-55). In CII it sits in ram:BuyerTradeParty/ram:PostalTradeAddress/ram:CountryID.

Every rule explained: validation rules reference.

ZUGFeRD and the German mandate

Since 1 January 2025 every business in Germany must be able to receive e-invoices. Issuing becomes mandatory from 2027 for companies with prior-year turnover above EUR 800,000 and from 2028 for everyone else. ZUGFeRD from version 2.0.1, in profile BASIC or higher, meets the EN 16931 format and is an accepted e-invoice. More context in e-invoicing in Germany.

Invoices to German public authorities normally use XRechnung and carry a Leitweg-ID. Whether an authority's portal accepts a ZUGFeRD file in the XRECHNUNG profile depends on the portal, so check with the recipient.

Frequently asked questions

Can I upload the ZUGFeRD PDF directly?

No. The validator accepts XML files only. A ZUGFeRD invoice is a PDF/A-3 file with an XML attachment, so save that attachment first (usually factur-x.xml, zugferd-invoice.xml for ZUGFeRD 2.0, or xrechnung.xml for the XRECHNUNG profile) and upload the XML.

How do I extract the XML from a ZUGFeRD PDF?

Open the attachments panel in your PDF reader (the paperclip icon in Adobe Acrobat Reader) and save the XML file. On the command line, use pdfdetach -saveall invoice.pdf (Poppler), qpdf --show-attachment=factur-x.xml invoice.pdf > factur-x.xml, or mutool extract invoice.pdf.

Which rules does the validator apply to ZUGFeRD XML?

The official CEN schematron for EN 16931 in CII syntax: business rules (BR-), calculation rules (BR-CO-), decimal rules (BR-DEC-), VAT category rules such as BR-S- and BR-AE-, code list rules (BR-CL-) and CII syntax rules (CII-SR-). Each finding shows the rule ID, the location in the XML and the rule message.

What does the validator not check?

It does not check PDF/A-3 conformance, the XMP metadata in the PDF, whether the visible PDF matches the XML, the FeRD/FNFE profile-specific schematrons, XSD schema validation or Peppol BIS. The German XRechnung rules from KoSIT (BR-DE-) run only when the XML carries the XRechnung identifier (profile XRECHNUNG). For a binding XRechnung check, also run the official KoSIT validator.

Which ZUGFeRD profiles give a meaningful result?

BASIC, EN 16931 (COMFORT), EXTENDED and XRECHNUNG, because they carry a complete EN 16931 invoice. For EXTENDED, the EN 16931 core is checked but the extra fields are not. MINIMUM and BASIC WL deliberately omit required invoice data, so the validator reports many missing fields, which is the correct result for those profiles.

Does a ZUGFeRD MINIMUM file count as an e-invoice in Germany?

No. According to the German Federal Ministry of Finance (BMF) guidance, the MINIMUM and BASIC WL profiles do not meet the e-invoice requirements of section 14 of the German VAT Act, because VAT-relevant data is missing from the XML. From BASIC upwards, ZUGFeRD 2.x meets the EN 16931 format.

Is ZUGFeRD the same as Factur-X?

Since ZUGFeRD 2.1 (Factur-X 1.0.05) they are the same specification under two names: ZUGFeRD in Germany, Factur-X in France. The current release is ZUGFeRD 2.4 / Factur-X 1.08, in force since 15 January 2026. ZUGFeRD 1.0 is an older, separate data model and is not EN 16931 compliant.

Is the ZUGFeRD validator free?

Yes. It is free and needs no account. You can upload several XML files at once and get a separate report with errors and warnings for each file.

Related pages