Peppol BIS 3.0 / UBL Invoice Validator (EN 16931) avatar

Peppol BIS 3.0 / UBL Invoice Validator (EN 16931)

Pricing

$20.00 / 1,000 document validateds

Go to Apify Store
Peppol BIS 3.0 / UBL Invoice Validator (EN 16931)

Peppol BIS 3.0 / UBL Invoice Validator (EN 16931)

Validate UBL invoices and credit notes against the official Peppol BIS Billing 3.0 and EN 16931 rules: XSD, CEN Schematron and Peppol Schematron. Returns every failed rule with its ID, message and location, plus an invoice summary.

Pricing

$20.00 / 1,000 document validateds

Rating

0.0

(0)

Developer

fetchlab

fetchlab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Check UBL invoices and credit notes against the enabled official document rules before sending them. Passing these checks does not guarantee network acceptance, registration of either party or compliance with every national extension. The Actor runs three available layers using the official rule sets published by OpenPeppol and CEN:

  1. UBL 2.1 XSD — is the XML structurally valid (right elements, right order, right types)?
  2. EN 16931 Schematron (CEN) — the European core invoice business rules: mandatory fields, totals that add up, VAT breakdown consistency, code lists (BR-, BR-CO-, BR-CL-, BR-S-, BR-E-*…).
  3. Peppol BIS Billing 3.0 Schematron — the Peppol-specific rules on top: business process and customization IDs, endpoint identifier schemes, country-specific requirements (PEPPOL-EN16931-R*, PEPPOL-EN16931-CL*, PEPPOL-COMMON-R*).

For every document you get a clear verdict (valid: true/false), the full list of failed official rules with rule ID, message and location in the document, and a summary of the invoice header (number, dates, parties, endpoints, totals).

Why you need this

Belgian B2B e-invoicing requirements and the French reform create demand for structured invoice workflows, but national delivery requirements differ. This Actor verifies only the scope described below; it is not a legal or tax eligibility check. See the Belgian official guidance and French official guidance.

Typical uses:

  • ERP / accounting integrations — validate each generated UBL file in your pipeline; block or fix the invalid ones before they leave.
  • Software vendors — regression-test your UBL generator against the current rule release every time Peppol updates it.
  • Accountants and e-invoicing consultants — check a client's files in bulk and get a readable list of what is wrong.
  • AI agents — a single tool call that answers "is this invoice Peppol-compliant, and if not, why?".

Input

FieldDescription
documentsComplete UBL Invoice or CreditNote XML documents, one per item (paste the whole file).
urlsOptional. URLs of XML files to download and validate (public URLs or Apify key-value store URLs).
ruleSetpeppol-bis-billing-3 (default: EN 16931 + Peppol rules) or en16931-only (CEN rules only).
xsdValidationRun the UBL 2.1 XSD check first (default true).
includeWarningsReport non-blocking rule failures too (default true). Warnings never make a document invalid.
includeTestExpressionsAdd each failed rule's XPath test to the output (for developers).
maxDocumentsSafety limit per run (default 500).

Supported documents: UBL 2.1 Invoice and CreditNote (the two document types of Peppol BIS Billing 3.0). Other UBL documents and CII (Cross Industry Invoice) are reported as unsupported.

Output

One record per document:

{
"source": "document #1",
"documentType": "Invoice",
"valid": false,
"xsdValid": true,
"errorCount": 2,
"warningCount": 0,
"errors": [
{
"ruleSet": "EN 16931 (CEN)",
"ruleId": "BR-CO-16",
"severity": "error",
"message": "[BR-CO-16]-Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) - Paid amount (BT-113) + Rounding amount (BT-114).",
"location": "Invoice/LegalMonetaryTotal"
},
{
"ruleSet": "Peppol BIS Billing 3.0",
"ruleId": "PEPPOL-EN16931-R001",
"severity": "error",
"message": "[PEPPOL-EN16931-R001]-Business process MUST be provided.",
"location": "Invoice"
}
],
"warnings": [],
"summary": {
"documentId": "2026-0042",
"issueDate": "2026-09-01",
"dueDate": "2026-10-01",
"typeCode": "380",
"currency": "EUR",
"customizationId": "urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0",
"profileId": null,
"supplierName": "Supplier SRL",
"supplierEndpoint": "0208:0202239951",
"supplierVat": "BE0202239951",
"customerName": "Customer NV",
"customerEndpoint": "0208:0214596464",
"customerVat": "BE0214596464",
"lineCount": 2,
"taxExclusiveAmount": 1300.0,
"taxInclusiveAmount": 1573.0,
"payableAmount": 1573.0,
"taxAmount": 273.0
},
"ruleVersions": {
"xsd": "OASIS UBL 2.1 XSD",
"cen": "CEN/EN 16931-1 UBL Schematron 1.3.16 (2026-04-10)",
"peppol": "Peppol BIS Billing 3.0 rules — release 3.0.21 (May 2026)"
},
"durationMs": 540,
"validatedAt": "2026-09-13T20:00:00.000Z",
"fatalError": null
}

Malformed XML or unsupported document types produce a record with valid: false and a single XML error explaining why.

Meaning of a positive result

valid reports the enabled official rule checks only; xsdValid: null means XSD was skipped. validationScope is document-rules-only and networkAcceptance is not-checked. Inspect supplementaryChecks separately: it checks that GS1 GLN endpoint identifiers use 13 digits, a shape condition not fully covered by the embedded checksum rule. These extra checks do not change the official valid verdict. Passing either set does not prove registration or delivery.

Omitting both documents and urls runs a synthetic demo invoice, which is not an invoice to send. Supplying either source disables the demo; explicitly empty sources are rejected.

Rule sets and versions

The Actor embeds the current official artefacts: the CEN/EN 16931-1 UBL Schematron and the Peppol BIS Billing 3.0 Schematron from docs.peppol.eu, plus the OASIS UBL 2.1 XSD. The exact versions are returned in every record (ruleVersions). Peppol publishes rule updates twice a year (spring and autumn); this Actor is updated within days of each release.

Pricing

Pay per event: a fixed price per document validated, whether it passes or fails: USD 0.02 per document. No subscription. The engine can process a small document in under a second; run startup and downloads add latency.

Using it from your code

// Apify JS client
const run = await client.actor('fetchlab/peppol-invoice-validator').call({
documents: [xmlString],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
if (!items[0].valid) console.log(items[0].errors);
# Apify Python client
run = client.actor("fetchlab/peppol-invoice-validator").call(run_input={"documents": [xml_string]})
result = client.dataset(run["defaultDatasetId"]).list_items().items[0]

Works with the Apify API, the Apify MCP server (so AI agents can call it as a tool), Make, n8n, Zapier and scheduled runs.

Notes and limits

  • Validation covers the document itself. It does not check whether the receiver is registered on Peppol — Peppol Directory Lookup provides voluntary Directory records, not a definitive routing check.
  • Country-specific extensions that sit on top of BIS Billing 3.0 (e.g. national CIUS rules beyond Peppol's own country rules) are not included.
  • Documents up to 20 MB. Very large invoices (thousands of lines) take a few seconds each.

Peppol Directory Lookup — find a company in the Peppol Directory. More e-invoicing and company-data tools by fetchlab.