---
title: Peppol BIS Billing 3.0 API | EN 16931 E-Invoice Validator & UBL 2.1 / CII Parser
description: Validate and parse Peppol BIS Billing 3.0 and European Standard EN 16931 electronic invoices in sub-5ms. Deterministic rules engine supporting OASIS UBL 2.1 (Invoice/CreditNote), UN/CEFACT CII (Factur-X / ZUGFeRD 2.2), and ISO 6523 EAS participant lookup.
canonical: https://stanzaapi.com/tools/peppol-validator/
---

[Home](/)/[API Directory](/tools/)/Peppol BIS Billing 3.0 & EN 16931 E-Invoice Engine

 <5ms Edge Latency99.9% SLA AvailableVerified: Sep 2026V8 Pure ComputeElectronic Invoicing & Tax Compliance

# Peppol BIS Billing 3.0 & EN 16931 E-Invoice Engine

High-performance, pure-compute edge engine for European Standard EN 16931 and Peppol BIS Billing 3.0 e-invoice compliance, syntax transformation, and ISO 6523 participant validation.

[Subscribe & Get API Key →](/tools/pricing)[⚡ Live Playground](#live-playground)[Specs (3)](#specifications)

 Interactive Edge Workbench

## ⚡ Live Pure-Compute Playground

 Test deterministic edge parsing with sub-2ms execution across 330+ Cloudflare V8 edge locations. Zero persistent storage, zero cold-starts, pure function $f(x)=y$.

32KB Demo Cap60 req/min Burst<2ms V8 ComputeZero Data Retention

input.xml0 B

 Reset

1

<?xml version="1.0" encoding="UTF-8"?><Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"><cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID><cbc:ID>INV-2026-001</cbc:ID></Invoice>

 RUN VALIDATION (<5ms) [ CHECKSUM: AWAITING RUN ]

output.jsondemo-ready

Status: Ready Copy

```
{
  "status": "Click RUN VALIDATION to execute on the Cloudflare edge..."
}
```

Sandbox Quota: Free Tier (50 reqs/mo) • Production keys from $29/mo[Get Free Sandbox Key →](/login?email=)

Need 512KB+ Payloads, High-Throughput & 99.9% Production SLA?

Direct API keys include pooled monthly quotas, zero cold-starts, and HIPAA BAA eligibility on the Mega tier.

[Get Production API Key →](/pricing)

## Key Capabilities & Performance Architecture

- ✓Complete support for both EN 16931 syntaxes: OASIS UBL 2.1 (Invoice & CreditNote) and UN/CEFACT CII (Factur-X / ZUGFeRD 2.2)
- ✓100% deterministic business rules engine evaluating BR-01..BR-65, BR-CO-01..BR-CO-26, and PEPPOL-EN16931-R* rules
- ✓Full ISO 6523 EAS Participant Scheme Registry (0088, 0184, 0208, 9930, 0204 Leitweg-ID) with automatic participant routing validation
- ✓Pure arithmetic ISO 13616 Modulo-97 IBAN check-digit verification across all European and international payment accounts
- ✓Zero-drift Worker Cron integrity verification executing periodic statutory reconciliation
- ✓Rich typed JSON output extracting seller/buyer parties, payment means, tax subtotals, line extension totals, and discount/charge allowances

## E-Invoicing & B2B Tax Mandates (3 Specifications)

Explore full structural breakdowns, checksum logic, and field schemas for every supported format.

[Peppol BIS Billing 3.0 UBL 2.1 E-Invoice Validator & Parser — Validate and extract structured JSON from Peppol BIS Billing 3.0 OASIS UBL 2.1 electronic invoices and credit notes. — View Specification →](/tools/peppol-validator/standards/peppol-bis-billing-3-0)[Factur-X / ZUGFeRD 2.2 UN/CEFACT CII E-Invoice Parser & Validator — Parse and validate UN/CEFACT CrossIndustryInvoice XML files (Factur-X / ZUGFeRD 2.2 EN 16931 profile) into structured JSON. — View Specification →](/tools/peppol-validator/standards/factur-x-zugferd-2-2)[ISO 6523 Electronic Address Scheme (EAS) Participant Registry — Query active ISO 6523 Electronic Address Scheme (EAS) codes and participant identifier validation formats across all Peppol jurisdictions. — View Specification →](/tools/peppol-validator/registries/iso-6523-eas-schemes)

## API Endpoints & Request Signatures

| Method | Path | Description |
| --- | --- | --- |
| `POST` | `/api/v1/validate` | Validate e-invoice XML against Peppol BIS Billing 3.0 and EN 16931 business rules |
| `POST` | `/api/v1/parse` | Parse UBL 2.1 or UN/CEFACT CII XML e-invoice into structured typed JSON |
| `GET` | `/api/v1/eas-schemes` | Query ISO 6523 EAS Participant Schemes registry by country code or scheme ID |
| `GET` | `/api/v1/tax-categories` | List UNTDID 5305 tax categories (Standard, Reverse Charge, Exempt, Zero, etc.) |
| `GET` | `/api/v1/provenance` | Retrieve statutory specifications, standard references & cron verification provenance |

## Sample Response JSON Payload

All endpoints deliver strongly-typed envelopes with deterministic parsing and performance metrics.

HTTP 200 Response PayloadCopy

```
{
  "success": true,
  "data": {
    "valid": true,
    "syntax": "UBL_INVOICE",
    "profile": "PEPPOL_BIS_BILLING_3_0",
    "summary": {
      "status": "COMPLIANT",
      "fatalCount": 0,
      "warningCount": 0
    },
    "violations": [],
    "rulesChecked": 24
  },
  "meta": {
    "latency_ms": 1.8,
    "version": "1.0.0"
  }
}
```

## Multi-Language Integration Code

Copy and paste ready-to-run snippets with your direct API credentials:

cURLCopy

```
curl --request POST \
  --url "https://api.stanzaapi.com/peppol-validator/api/v1/validate" \
  --header "Content-Type: application/json" \
  --header "x-api-key: YOUR_API_KEY" \
  --data '{
  "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\"><cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID><cbc:ID>INV-01</cbc:ID><cbc:IssueDate>2026-08-10</cbc:IssueDate><cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode><cac:AccountingSupplierParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>DE</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Supplier</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingSupplierParty><cac:AccountingCustomerParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>FR</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Buyer</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingCustomerParty><cac:TaxTotal><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxSubtotal><cbc:TaxableAmount currencyID=\"EUR\">100.00</cbc:TaxableAmount><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:TaxCategory></cac:TaxSubtotal></cac:TaxTotal><cac:LegalMonetaryTotal><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cbc:TaxExclusiveAmount currencyID=\"EUR\">100.00</cbc:TaxExclusiveAmount><cbc:TaxInclusiveAmount currencyID=\"EUR\">119.00</cbc:TaxInclusiveAmount><cbc:PayableAmount currencyID=\"EUR\">119.00</cbc:PayableAmount></cac:LegalMonetaryTotal><cac:InvoiceLine><cbc:ID>1</cbc:ID><cbc:InvoicedQuantity unitCode=\"C62\">1</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cac:Item><cbc:Name>Item</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID=\"EUR\">100.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine></Invoice>"
}'
```

Node.js (Fetch)Copy

```
const response = await fetch("https://api.stanzaapi.com/peppol-validator/api/v1/validate", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": process.env.API_KEY || "YOUR_API_KEY"
  },
  body: JSON.stringify({
  "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\"><cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID><cbc:ID>INV-01</cbc:ID><cbc:IssueDate>2026-08-10</cbc:IssueDate><cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode><cac:AccountingSupplierParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>DE</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Supplier</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingSupplierParty><cac:AccountingCustomerParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>FR</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Buyer</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingCustomerParty><cac:TaxTotal><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxSubtotal><cbc:TaxableAmount currencyID=\"EUR\">100.00</cbc:TaxableAmount><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:TaxCategory></cac:TaxSubtotal></cac:TaxTotal><cac:LegalMonetaryTotal><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cbc:TaxExclusiveAmount currencyID=\"EUR\">100.00</cbc:TaxExclusiveAmount><cbc:TaxInclusiveAmount currencyID=\"EUR\">119.00</cbc:TaxInclusiveAmount><cbc:PayableAmount currencyID=\"EUR\">119.00</cbc:PayableAmount></cac:LegalMonetaryTotal><cac:InvoiceLine><cbc:ID>1</cbc:ID><cbc:InvoicedQuantity unitCode=\"C62\">1</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cac:Item><cbc:Name>Item</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID=\"EUR\">100.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine></Invoice>"
})
});

const data = await response.json();
console.log(data);
```

Python (Requests)Copy

```
import requests
import json

url = "https://api.stanzaapi.com/peppol-validator/api/v1/validate"
headers = {
    "Content-Type": "application/json",
    "x-api-key": "YOUR_API_KEY"
}
payload = {
    "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\"><cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID><cbc:ID>INV-01</cbc:ID><cbc:IssueDate>2026-08-10</cbc:IssueDate><cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode><cac:AccountingSupplierParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>DE</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Supplier</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingSupplierParty><cac:AccountingCustomerParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>FR</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Buyer</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingCustomerParty><cac:TaxTotal><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxSubtotal><cbc:TaxableAmount currencyID=\"EUR\">100.00</cbc:TaxableAmount><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:TaxCategory></cac:TaxSubtotal></cac:TaxTotal><cac:LegalMonetaryTotal><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cbc:TaxExclusiveAmount currencyID=\"EUR\">100.00</cbc:TaxExclusiveAmount><cbc:TaxInclusiveAmount currencyID=\"EUR\">119.00</cbc:TaxInclusiveAmount><cbc:PayableAmount currencyID=\"EUR\">119.00</cbc:PayableAmount></cac:LegalMonetaryTotal><cac:InvoiceLine><cbc:ID>1</cbc:ID><cbc:InvoicedQuantity unitCode=\"C62\">1</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cac:Item><cbc:Name>Item</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID=\"EUR\">100.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine></Invoice>"
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
```

GoCopy

```
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	url := "https://api.stanzaapi.com/peppol-validator/api/v1/validate"
	payload := []byte(`{"xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?><Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\"><cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID><cbc:ID>INV-01</cbc:ID><cbc:IssueDate>2026-08-10</cbc:IssueDate><cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode><cac:AccountingSupplierParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>DE</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Supplier</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingSupplierParty><cac:AccountingCustomerParty><cac:Party><cac:PostalAddress><cac:Country><cbc:IdentificationCode>FR</cbc:IdentificationCode></cac:Country></cac:PostalAddress><cac:PartyLegalEntity><cbc:RegistrationName>Buyer</cbc:RegistrationName></cac:PartyLegalEntity></cac:Party></cac:AccountingCustomerParty><cac:TaxTotal><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxSubtotal><cbc:TaxableAmount currencyID=\"EUR\">100.00</cbc:TaxableAmount><cbc:TaxAmount currencyID=\"EUR\">19.00</cbc:TaxAmount><cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:TaxCategory></cac:TaxSubtotal></cac:TaxTotal><cac:LegalMonetaryTotal><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cbc:TaxExclusiveAmount currencyID=\"EUR\">100.00</cbc:TaxExclusiveAmount><cbc:TaxInclusiveAmount currencyID=\"EUR\">119.00</cbc:TaxInclusiveAmount><cbc:PayableAmount currencyID=\"EUR\">119.00</cbc:PayableAmount></cac:LegalMonetaryTotal><cac:InvoiceLine><cbc:ID>1</cbc:ID><cbc:InvoicedQuantity unitCode=\"C62\">1</cbc:InvoicedQuantity><cbc:LineExtensionAmount currencyID=\"EUR\">100.00</cbc:LineExtensionAmount><cac:Item><cbc:Name>Item</cbc:Name><cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent></cac:ClassifiedTaxCategory></cac:Item><cac:Price><cbc:PriceAmount currencyID=\"EUR\">100.00</cbc:PriceAmount></cac:Price></cac:InvoiceLine></Invoice>"}`)

	req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))
	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("x-api-key", os.Getenv("API_KEY"))

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

## Frequently Asked Questions

What is Peppol BIS Billing 3.0 and EN 16931 compliance?

Peppol BIS Billing 3.0 is the international European Core Invoice Usage Profile (CIUS) implementing the European Standard EN 16931-1 for electronic invoicing. It is mandated for public procurement across European Union member states and increasingly across global B2B transactions (e.g. France 2026 e-invoicing mandate, Germany B2B mandate, Poland KSeF, and Singapore Peppol network).

Which e-invoice XML syntaxes are supported by the API?

The API natively validates and parses both syntaxes specified by EN 16931: OASIS UBL 2.1 (Universal Business Language Invoice and CreditNote) and UN/CEFACT Cross Industry Invoice (CII / Factur-X / ZUGFeRD 2.2).

How are business rules and VAT arithmetic checked?

The engine deterministically validates core EN 16931 rules (BR-01..BR-65, BR-CO-01..BR-CO-26) including Line Extension sum reconciliation (BR-CO-10), tax exclusive/inclusive balancing (BR-CO-11/12), VAT percentage calculations per category (BR-CO-17), and ISO 6523 EAS participant scheme existence.

Does the API require subrequests or external database connections?

No. The validation and parsing engines are pure deterministic compute running in Cloudflare Workers V8 isolates with zero subrequests, guaranteeing sub-5ms edge latency and zero cold-start latency.

## Complementary Enterprise APIs

Seamlessly orchestrate data pipelines across adjacent financial, regulatory, and supply-chain protocols:

[European VIES VAT Validator → — Ensure e-invoice supplier and customer tax IDs match European VIES registrations.](/tools/vat-validator/)[ISO 20022 Financial Messaging → — Bridge structured Peppol billing lines directly into ISO 20022 credit transfer orders.](/tools/iso20022-parser/)[EU CBAM Carbon Importer Reporting → — Calculate embedded emissions and customs reporting requirements for cross-border shipments.](/tools/cbam-carbon/)
