Welcome to Beliq
The platform for European e-invoicing: one API to generate, validate, and soon deliver EN 16931 e-invoices (and Italy FatturaPA FPR12 XML) across XRechnung, ZUGFeRD, Factur-X, Peppol BIS 3.0, and FatturaPA. Generate, validate, parse and convert are live today; managed delivery is coming next.
What Beliq does
sourceFormat=cii), and Peppol BIS to plain EN 16931 UBL.Quickstart
Generate a German XRechnung from a JSON payload with a single POST:
curl -X POST https://api.beliq.eu/v1/generate \
-H "Authorization: Bearer $BELIQ_KEY" \
-H "Content-Type: application/json" \
-d '{
"standard": "xrechnung",
"output": "xml",
"invoice": {
"number": "INV-2026-0421",
"issueDate": "2026-05-19",
"currencyCode": "EUR",
"buyerReference": "04011000-12345-03",
"seller": {
"name": "Beliq Demo GmbH",
"vatId": "DE123456789",
"email": "billing@demo.example",
"contactName": "Anna Beispiel",
"phone": "+49 30 1234567",
"address": { "street": "Musterstraße 1", "city": "Berlin", "postalCode": "10115", "countryCode": "DE" }
},
"buyer": {
"name": "Acme AG",
"vatId": "DE987654321",
"address": { "street": "Beispielweg 42", "city": "Bonn", "postalCode": "53113", "countryCode": "DE" }
},
"lines": [
{ "description": "Compliance API, May 2026",
"quantity": 1, "unitCode": "MON", "unitPrice": 199.00, "lineTotal": 199.00,
"vatRate": 19, "vatCategoryCode": "S" }
],
"taxSummary": [
{ "vatCategoryCode": "S", "vatRate": 19, "taxableAmount": 199.00, "taxAmount": 37.81 }
],
"paymentMeans": { "typeCode": "58", "iban": "DE89370400440532013000" },
"totalNetAmount": 199.00,
"totalTaxAmount": 37.81,
"totalGrossAmount": 236.81
}
}'import { Beliq } from '@beliq/sdk';
const beliq = new Beliq({ apiKey: process.env.BELIQ_KEY! });
const generated = await beliq.generate({
standard: 'xrechnung',
output: 'xml',
invoice: {
number: 'INV-2026-0421',
issueDate: '2026-05-19',
currencyCode: 'EUR',
buyerReference: '04011000-12345-03',
seller: {
name: 'Beliq Demo GmbH',
vatId: 'DE123456789',
email: 'billing@demo.example',
contactName: 'Anna Beispiel',
phone: '+49 30 1234567',
address: { street: 'Musterstraße 1', city: 'Berlin', postalCode: '10115', countryCode: 'DE' },
},
buyer: {
name: 'Acme AG',
vatId: 'DE987654321',
address: { street: 'Beispielweg 42', city: 'Bonn', postalCode: '53113', countryCode: 'DE' },
},
lines: [
{
description: 'Compliance API, May 2026',
quantity: 1,
unitCode: 'MON',
unitPrice: 199.00,
lineTotal: 199.00,
vatRate: 19,
vatCategoryCode: 'S',
},
],
taxSummary: [{ vatCategoryCode: 'S', vatRate: 19, taxableAmount: 199.00, taxAmount: 37.81 }],
paymentMeans: { typeCode: '58', iban: 'DE89370400440532013000' },
totalNetAmount: 199.00,
totalTaxAmount: 37.81,
totalGrossAmount: 236.81,
},
});
console.log(generated.xml, generated.meta.schematronVersion);import os
from beliq import Beliq
beliq = Beliq(api_key=os.environ["BELIQ_KEY"])
generated = beliq.generate(
standard="xrechnung",
output="xml",
invoice={
"number": "INV-2026-0421",
"issueDate": "2026-05-19",
"currencyCode": "EUR",
"buyerReference": "04011000-12345-03",
"seller": {
"name": "Beliq Demo GmbH",
"vatId": "DE123456789",
"email": "billing@demo.example",
"contactName": "Anna Beispiel",
"phone": "+49 30 1234567",
"address": {
"street": "Musterstraße 1",
"city": "Berlin",
"postalCode": "10115",
"countryCode": "DE",
},
},
"buyer": {
"name": "Acme AG",
"vatId": "DE987654321",
"address": {
"street": "Beispielweg 42",
"city": "Bonn",
"postalCode": "53113",
"countryCode": "DE",
},
},
"lines": [
{
"description": "Compliance API, May 2026",
"quantity": 1,
"unitCode": "MON",
"unitPrice": 199.00,
"lineTotal": 199.00,
"vatRate": 19,
"vatCategoryCode": "S",
},
],
"taxSummary": [{"vatCategoryCode": "S", "vatRate": 19, "taxableAmount": 199.00, "taxAmount": 37.81}],
"paymentMeans": {"typeCode": "58", "iban": "DE89370400440532013000"},
"totalNetAmount": 199.00,
"totalTaxAmount": 37.81,
"totalGrossAmount": 236.81,
},
)
print(generated.xml, generated.meta.schematron_version)HTTP/1.1 200 OK
Content-Type: application/xml
x-syntax: cii
x-validation: pass · 0 err · 2 warn
x-schematron-version: <EN 16931 CII Schematron version>
<?xml version='1.0' encoding='UTF-8'?>
<rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" …>
<rsm:ExchangedDocumentContext>
…
<ram:GuidelineSpecifiedDocumentContextParameter>
<ram:ID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</ram:ID>
</ram:GuidelineSpecifiedDocumentContextParameter>
</rsm:ExchangedDocumentContext>
<rsm:ExchangedDocument>
<ram:ID>INV-2026-0421</ram:ID>
<ram:TypeCode>380</ram:TypeCode>
<ram:IssueDateTime>
<udt:DateTimeString format="102">20260519</udt:DateTimeString>
</ram:IssueDateTime>
</rsm:ExchangedDocument>
…
</rsm:CrossIndustryInvoice>Validating existing invoices
Send an existing XML invoice to /v1/validate to get a structured EN 16931 + CIUS verdict.
curl -X POST https://api.beliq.eu/v1/validate \
-H "Authorization: Bearer $BELIQ_KEY" \
-H "Content-Type: application/xml" \
--data-binary @invoice.xml
# 200 OK
# {
# "success": true,
# "data": {
# "valid": true,
# "format": "ubl",
# "profileDetected": "xrechnung",
# "errors": [],
# "warnings": [
# { "ruleId": "BR-DE-26", "severity": "warning", "location": "/Invoice/cac:Delivery",
# "message": "Recommended element missing" }
# ]
# }
# }import { readFile } from 'node:fs/promises';
import { Beliq } from '@beliq/sdk';
const beliq = new Beliq({ apiKey: process.env.BELIQ_KEY! });
const result = await beliq.validate(await readFile('invoice.xml'));
console.log(result.valid, result.format, result.profileDetected);
for (const issue of result.warnings) console.log(issue.ruleId, issue.message);import os
from pathlib import Path
from beliq import Beliq
beliq = Beliq(api_key=os.environ["BELIQ_KEY"])
result = beliq.validate(Path("invoice.xml").read_bytes())
print(result.valid, result.format, result.profile_detected)
for issue in result.warnings:
print(issue.rule_id, issue.message)Supported standards
Each badge names the strongest check Beliq can run against that format. Authority-checked runs the format authority's own rulebook, pinned by version and hash. Schema-checked means no rulebook is published, so the document is validated against the official XSD schema. See How verification works for what sits behind each badge.
- XRechnung German B2G and B2B. Generated as CII D16B; validated in UBL 2.1 or CII D16B.3.0.2Authority-checked
- Factur-X French hybrid PDF; all five EN 16931 profiles + EXTENDED-CTC-FR.1.09.2Authority-checked
- ZUGFeRD German hybrid PDF (CII D22B in PDF/A-3).ZF-2.xAuthority-checked
- Peppol BIS Billing 3.0 Cross-border EU (UBL 2.1; CreditNote supported).BIS 3.0Authority-checked
- NLCIUS Dutch national CIUS, SI-UBL 2.0 over Peppol BIS.NLCIUS 1.0Authority-checked
- FatturaPA Domestic Italy XML (FPR12).1.2.3Schema-checked
- Facturae Domestic Spain XML (MINECO national format).3.2.2Schema-checked
- e-SLOG Domestic Slovenia XML (eRacun).2.0Schema-checked
- KSeF FA(3) Domestic Poland XML (FA(3)); VAT invoices in PLN, no KSeF submission.FA(3) 1-0ESchema-checked
All 9 formats above are live to generate and to validate. EN 16931 is the semantic core they profile, not a format you request. Beliq additionally runs the Romania RO_CIUS overlay on Peppol BIS 3.0, and XSD-only validation of SDI receipts and notifications (MessaggiTypes). See the Format Reference for the full standard and status matrix.