Skip to content

Free Peppol invoice validator

Check your UBL invoice or credit note against EN 16931 and Peppol BIS Billing 3 rules. Review errors, warnings and links to available fixes.

  • Free to use
  • No signup required
  • Invoice XML not stored

or drop your XML file here

UBL invoice or credit noteXMLUp to 5 MiB

No file to hand? Run a sample invoice through the validator:

Samples are fictional invoices. Download the XML: valid sample or sample with errors, or read the field-by-field walkthrough of the valid one.

Your XML is sent only when you choose Validate. Anonymous invoice XML and results are processed transiently and are not stored.

How your file is handled
  • Your XML is sent only when you choose Validate. A sample sends only that sample.
  • It goes from your browser to the Ironfang Finance API. Anonymous XML and its result are processed transiently and are not stored.
  • Content-free request and security metadata, including IP address, may be retained for up to 90 days.
  • Anonymous rate limits apply. Maximum input is 5 MiB.
  • See the privacy policy.
Advanced options

Leave both on Detect unless validation says the profile or type cannot be detected. These options do not pin a release. They declare the profile and document type for which the API resolves the current sendable release, instead of detecting them from the document; the result names the release used. A declared document type that contradicts the detected root element is refused before validation. A document whose root cannot be read needs both declared, and is then reported as invalid at the XML or schema layer.

Need automated checks? Explore the validation API.

Example result

See how an error is explained

This is a real finding from our sample with errors: its total of line amounts says 750.00, but its two lines add up to 740.00. The validator also reports BR-CO-13, the total before VAT that depends on it.

Download its XML
ErrorBR-CO-10

Line amounts do not add up

The document-level line total must match the sum of the individual line net amounts.

Suggested fix: Add the InvoiceLine or CreditNoteLine LineExtensionAmount values using decimal arithmetic. Put the rounded sum in LegalMonetaryTotal/LineExtensionAmount.

Where in the XML/*:Invoice[*][1]/cac:LegalMonetaryTotal[1]

How to fix BR-CO-10 (opens in a new tab)Official rule text (opens in a new tab)

Technical details for BR-CO-10

Validator message: An EN 16931 business rule failed at this location.

What you get from a check

Ironfang Finance API

Validate invoices automatically in your application

Run the same checks through the Ironfang Finance API and handle the results in your own workflow.

  • Stop an invoice before it is sent: the API returns the same outcome and findings as JSON.
  • Keep a history: signed-in results are saved for 30 days, and you can list, read or delete them.
  • Start quickly with the TypeScript and Python SDKs, a CLI and a GitHub Action.

250 free validations every month. No card required. This validator is free to use without an account.

Ironfang Finance / validate a document

Required key scope:finance:einvoices:write

Request

curl --request POST \
  'https://api.ironfang.uk/finance/v1/einvoices/validate' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/xml' \
  --header 'Accept: application/json' \
  --header 'Idempotency-Key: invoice-2026-001' \
  --data-binary '@invoice.xml'

Example response - excerpt

200 OK
Content-Type: application/json

{
  "operation_id": "019f29a4-3158-7b81-8f64-f1072146de30",
  "status": "completed",
  "outcome": "valid",
  "ruleset": {
    "id": "fwrs_example_invoice_2026a"
  },
  "findings": [],
  "findings_summary": {
    "returned": 0, "total": 0,
    "cap": 1000, "truncated": false
  }
}

Send your XML file as the request body. The optional Idempotency-Key lets you retry the same request without a second validation or charge. Invalid documents also return 200, with outcome: invalid and their findings.

Questions

Short answers about the free validator. The technical details below cover limits and XML handling in full.

What documents can I check?
A UBL 2.1 Invoice or CreditNote in XML that follows Peppol BIS Billing 3, one document at a time, up to 5 MiB. PDF invoices, archives and compressed files are not accepted.
Do I need an account?
No. The validator on this page is free to use without signing up, within anonymous rate limits. You only need an account to run the same checks through the API.
What happens to my file?
It is sent to the Ironfang Finance API only when you choose Validate. Anonymous invoice XML and results are processed transiently and are not stored. Content-free request and security metadata, including your IP address, may be kept for up to 90 days.
What does a pass mean?
The document you submitted passed the UBL 2.1 schema, EN 16931 and Peppol BIS Billing 3 checks for the ruleset release shown in the result. A pass does not certify the invoice, does not guarantee a recipient will accept it, and does not send anything over the Peppol network.
Can I run these checks from my own software?
Yes. The Ironfang Finance API runs the same validation and returns the findings as JSON. A free account includes 250 validations per UTC calendar month.
Technical details: rulesets, limits and XML handling

What is checked

Your document is validated against the current sendable ruleset, an exact and immutable release: the UBL 2.1 schema, the EN 16931 business rules and the Peppol BIS Billing 3 rules, in that order. Each finding carries a stable identifier, the official one where the standard supplies it and an Ironfang FW- identifier for the input and XML boundary checks. The result tells you whether the document is valid against that ruleset. It does not certify the document, does not guarantee a recipient will accept it, and does not send anything over the Peppol network.

Limits

One XML document of at most 5 MiB per request, and anonymous rate limits. Archives and compressed uploads are refused before validation. With both options on Detect, a document whose profile cannot be detected, including one with a DOCTYPE before its root element, is refused before validation as profile undetected. Once a ruleset can be selected, detected or declared, a DOCTYPE, entity declarations or references beyond XML's five predefined entities, or XInclude are reported as invalid at the XML layer; the rules are not reached.

XML handling

  • UTF-8, or UTF-16 with a byte-order mark.
  • A DOCTYPE, entities beyond the five predefined ones, or XInclude are refused before validation or reported invalid at the XML layer, never validated.
  • At most 1,000 findings are returned; a result says when the list was shortened.
  • The readable report and JSON download are unsigned and contain no invoice XML.

Ironfang Finance resources