POST your JSON. Get a compliant Factur-X. We handle the standards.

EN 16931 is over 200 rules. One endpoint computes the totals, builds the Factur-X PDF with the XML inside, and validates it against the full official rule set before it reaches you, verdict included. Integrate it this afternoon.

Factur-X ZUGFeRD XRechnung UBL 2.1 UN/CEFACT CII
POST /v1/generate live
Request
{
  "format": "facturx",
  "output": "pdf",
  "invoice": {
    "number": "INV-2026-001",
    "seller": { "name": "Acme SARL",  },
    "buyer": { "name": "Beispiel GmbH",  },
    "lines": [  ]
  }
}
200 xsd ✓schematron ✓pdfa3 ✓

A real exchange, abridged: this request and response are checked against the engine by the test suite.

Free tools

Validate or generate an invoice, no code required

Validate an invoice

Drop a Factur-X, XRechnung, UBL or CII invoice and see every failed rule, checked against the full official EN 16931 rule set. Free, no account.

Open the validator

Generate an invoice

Fill in an invoice and get back a Factur-X PDF or XML, totals computed and checked against the same rule set before it reaches you. Free, no account.

Open the generator

Developer API

The same engine, from your code live

The engine behind this validator, as an HTTP endpoint. POST /v1/validate and POST /v1/generate are live today. Validate runs the full official rule set: EN 16931, XRechnung 3.0.2, Factur-X 1.09 and Peppol BIS 3.0. Generate builds Factur-X and checks it against that same rule set before handing it back. Extract is still in development, and its example below is the contract it will ship with.

Get free API access Docs → Sign in with GitHub and validate 100 invoices a month, free.

POST /v1/validate live

Validate a Factur-X PDF or UBL/CII XML against the full EN 16931 rule set (plus XRechnung CIUS rules). Returns every failed rule with its BT reference.

Request
curl https://api.einvoicekit.com/v1/validate \
  -H "Authorization: Bearer eik_live_..." \
  -F "file=@invoice.pdf"
Response
{
  "valid": false,
  "syntax": "cii",
  "profile": "urn:cen.eu:en16931:2017",
  "errors": [
    {
      "rule": "BR-CO-15",
      "message": "[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).",
      "path": "/Q{urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100}CrossIndustryInvoice[1]"
    }
  ],
  "warnings": []
}
POST /v1/generate live

Build a Factur-X invoice from plain JSON. We compute the totals and validate against the official rules, then return CII XML or a PDF/A-3B with the XML embedded.

Request
curl https://api.einvoicekit.com/v1/generate \
  -H "Authorization: Bearer eik_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "format": "facturx",
  "profile": "en16931",
  "output": "pdf",
  "invoice": {
    "number": "INV-2026-001",
    "issueDate": "2026-07-15",
    "typeCode": "380",
    "currency": "EUR",
    "dueDate": "2026-08-14",
    "seller": {
      "name": "Acme SARL",
      "vatId": "FR40123456824",
      "address": { "city": "Paris", "postCode": "75011", "country": "FR" }
    },
    "buyer": {
      "name": "Beispiel GmbH",
      "address": { "city": "Berlin", "postCode": "10115", "country": "DE" }
    },
    "lines": [
      {
        "id": "1",
        "name": "Consulting",
        "quantity": "2",
        "unit": "DAY",
        "unitPrice": "50.00",
        "vat": { "category": "S", "rate": "20" }
      }
    ]
  }
}'
Response
{
  "format": "facturx",
  "profile": "en16931",
  "xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4...",
  "pdf": "JVBERi0xLjcKJYGBgYEKCjEgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi...",
  "totals": {
    "lineNet": "100.00",
    "taxBasis": "100.00",
    "vat": "20.00",
    "grossTotal": "120.00",
    "amountDue": "120.00"
  },
  "validation": {
    "valid": true,
    "stages": { "xsd": "pass", "schematron": "pass", "pdfa3": "pass" }
  }
}
POST /v1/extract in development

Parse any e-invoice into normalized JSON, the same shape regardless of whether the input was UBL, CII or a Factur-X PDF.

Request
curl https://api.einvoicekit.com/v1/extract \
  -H "Authorization: Bearer eik_live_..." \
  -F "file=@invoice.xml"
Response
{
  "syntax": "ubl",
  "invoice": {
    "number": "INV-2026-001",
    "issueDate": "2026-07-15",
    "currency": "EUR",
    "seller": { "name": "Acme SARL", "vatId": "FR40123456824" },
    "buyer":  { "name": "Beispiel GmbH" },
    "totals": { "net": 100.00, "vat": 20.00, "due": 120.00 },
    "lines": [
      { "name": "Consulting", "quantity": 2, "net": 100.00 }
    ]
  }
}

Pricing

Start free. Pay when you run.

Both plans run the same engine and the full official rule sets. You are charged for the call, never for the format that comes out of it: asking for a Factur-X PDF costs exactly what asking for the XML costs.

Free

€0/month

100 validations + 20 generated invoices a month

  • The full official rule set, nothing held back
  • Sign in with GitHub, name your key and create it. No card.
  • Two separate allowances, so validating never eats your generations
  • XML or a Factur-X PDF, same price: all 20 can be PDFs
Get free access

Pro

€29/monthexcl. VAT

1,000 credits a month: validate 1,000 invoices, or generate 500

  • A validation spends 1 credit, a generated invoice 2, mixed however you like
  • The quota belongs to your account, so rotating a key never resets or loses it
  • Self-serve checkout and cancellation, invoices in your customer portal
Get Pro

Running more than 1,000 credits a month? Tell us the volume and we answer with a price

Prices exclude VAT. VAT is added at checkout according to your country; businesses with a valid EU VAT number are reverse-charged and pay the price shown.