W System / Free e-invoice validator (XRechnung, ZUGFeRD, Factur-X, UBL)
Free e-invoice validator: XRechnung, ZUGFeRD, Factur-X and UBL
Short answer: Drop an e-invoice (XML or ZUGFeRD / Factur-X PDF) or paste the XML, and this page checks it against the XML schema, the official CEN EN 16931 rules and, for XRechnung, the KoSIT rules. Every error comes with its rule ID (for example BR-CO-16), the business terms involved and a fix hint. You can also build a valid test invoice from simple JSON and run it through a sandbox send. Free, no signup: 20 calls a day per IP.
or paste the XML:
Seller, buyer and lines as JSON. Totals and the VAT breakdown are computed for you, and the result is validated before it comes back.
Uses the invoice JSON from tab 2. The buyer VAT number is checked live in VIES and the buyer name is screened against sanctions lists; the transmission is simulated (mock transport), so nothing is sent to anyone.
Key facts
- Formats: UBL 2.1 Invoice and CreditNote, UN/CEFACT CII, XRechnung 3.0 (UBL and CII), ZUGFeRD / Factur-X PDF (embedded XML).
- Rules: XML schema, CEN EN 16931 Schematron (official validation artefacts), KoSIT XRechnung 3.0.2 configuration 2026-08-31. Peppol BIS 3 specific rules are not checked yet.
- Output: valid true/false, every error and warning with rule ID, rule set, message, business terms (BT/BG), location and a fix hint where known.
- Privacy: validated in memory, not stored; usage metering keeps only time, endpoint, status and a short IP hash.
- Free tier: 20 calls/day per IP across api.wsystem.dev, no key. Each Validate, Create or Send click is one call.
- Same thing from code:
curl -X POST https://api.wsystem.dev/einvoice/validate -H 'Content-Type: application/xml' --data-binary @invoice.xml(orapplication/pdffor ZUGFeRD / Factur-X).
Example: what an error looks like
The "Load a broken example" button loads an XRechnung whose amount due was edited from 1164.25 to 1100.00. The validator returns:
{
"valid": false,
"error_count": 1,
"errors": [
{
"rule_id": "BR-CO-16",
"severity": "error",
"ruleset": "EN16931",
"message": "Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114).",
"business_terms": [
"BT-112",
"BT-113",
"BT-114",
"BT-115"
],
"fix": "Amount due must be total with VAT minus prepaid amount plus rounding."
}
]
}
Real response from the live API, 19 October 2026 (location and other fields left out).
Pricing beyond the free tool
| Channel | Price |
|---|---|
| This page and the REST free tier | Free, 20 calls/day per IP |
| REST POST /einvoice/validate (x402) | $0.03 USDC per call |
| REST POST /einvoice/create or /einvoice/send sandbox (x402) | $0.08 USDC per call |
| API key plans (Starter, Pro) | From EUR 19/month, see the home page |
About this tool
Disclosure: this validator is made by W System and runs on our e-invoicing API. If you build invoicing, ERP or billing software, the same endpoints validate your output in CI or before each send, create EN 16931 UBL from JSON, and look up whether a buyer is reachable on Peppol. See the e-invoice validation API and the e-invoicing API for EU mandates.
Questions and answers
Which e-invoice formats can I validate?
UBL 2.1 invoices and credit notes, UN/CEFACT CII, XRechnung 3.0 (UBL and CII syntax) and ZUGFeRD / Factur-X PDFs (the embedded XML is extracted and checked). Every file is checked against the XML schema and the official CEN EN 16931 Schematron rules; XRechnung files also get the KoSIT XRechnung rules. Peppol BIS 3 specific rules (PEPPOL-EN16931-*) are not checked yet.
Is my invoice stored?
The file is sent over HTTPS to api.wsystem.dev, validated in memory and not stored. The API records one usage row per call (time, endpoint, result status and a short hash of your IP), never the XML, invoice numbers, amounts or party details. If you prefer, test with a copy that has dummy names.
How many checks are free?
20 API calls per day per IP, shared across api.wsystem.dev, with no signup or key. Each click on Validate, Create or Send uses one call. For more, get an API key (plans from EUR 19/month) or let your code or agent pay per call with x402 (USD 0.03 per validation, USD 0.08 per create or sandbox send).
What does the sandbox send do?
It runs the full POST /einvoice/send flow: the buyer's VAT number is checked live in VIES, the buyer name is screened against the EU, UN, OFAC and UK sanctions lists, the UBL is built and validated, the route is looked up (Peppol Directory and country mandate) and you get an Ed25519-signed evidence receipt. On this page the transmission step uses the mock transport, so nothing is sent to anyone.
Does a valid result mean the invoice is compliant?
It means the file passes the official technical rules that were run (schema, EN 16931, and XRechnung where applicable). It is not tax or legal advice, and a receiving platform may run extra rules such as Peppol BIS 3.
Can I use this from my own code?
Yes. The page calls the same public endpoints you would: POST https://api.wsystem.dev/einvoice/validate with the raw XML or PDF as the body, POST /einvoice/create with the JSON shown here, and POST /einvoice/send. The API reference is at https://api.wsystem.dev/docs.
Related
- EU e-invoice validation API
- E-invoicing API for EU mandates
- Germany's BMF letter of 15 October 2026
- API reference (OpenAPI)
Facts checked 2026-10-19. W System is the maker of this product. Not affiliated with the European Commission. Not legal or tax advice.