Python & Node SDK

E-Rechnung mit Python und Node.js erzeugen (API-Integration)

Kurz gesagt: Sie senden einen kompakten JSON-Payload per HTTP POST an die fakturai REST-API und erhalten eine EN-16931-konforme ZUGFeRD-/Factur-X- oder XRechnung-Datei zurück — ohne XML-Wissen, ohne lokale Bibliotheken, ohne manuelle Namespace-Deklarationen. Die API prüft die erzeugte Datei vor der Auslieferung gegen ein KoSIT-orientiertes Akzept-Gate.

Warum API statt lokaler Bibliothek?

Lokale XML-Bibliotheken für ZUGFeRD oder XRechnung erfordern tiefes Format-Know-how: EN-16931-BT-/BG-Codes, Namespace-Deklarationen, Schematron-Regeln, Profil-Spezifika. Die API abstrahiert das:

Python-Beispiel (httpx / requests)

Das Beispiel erzeugt eine ZUGFeRD/Factur-X-Rechnung mit einer Position. Tauschen Sie format gegen “xrechnung” aus, um stattdessen eine XRechnung zu erhalten.

import httpx, base64, pathlib

payload = {
  "invoiceNumber": "RE-2026-0042",
  "issueDate": "2026-06-16",
  "seller": {
    "name": "Muster GmbH",
    "street": "Musterstraße 1",
    "city": "Berlin",
    "postalCode": "10115",
    "countryCode": "DE",
    "vatId": "DE123456789"
  },
  "buyer": {
    "name": "Kunde AG",
    "street": "Kundenweg 2",
    "city": "München",
    "postalCode": "80331",
    "countryCode": "DE"
  },
  "lines": [
    {
      "description": "Beratungsleistung",
      "quantity": 2,
      "unitCode": "C62",
      "unitPrice": 50.00,
      "vatRate": 19.0
    }
  ],
  "currency": "EUR",
  "format": "zugferd"  # "zugferd" oder "xrechnung"
}

resp = httpx.post(
    "https://api.fakturai.de/v1/invoices",
    json=payload,
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
resp.raise_for_status()
pathlib.Path("rechnung.pdf").write_bytes(resp.content)
print("E-Rechnung gespeichert.")

Für requests ersetzen Sie httpx.post durch requests.post — der Payload ist identisch.

Node.js / TypeScript-Beispiel (fetch)

import fs from "fs/promises";

const payload = {
  invoiceNumber: "RE-2026-0042",
  issueDate: "2026-06-16",
  seller: {
    name: "Muster GmbH",
    street: "Musterstraße 1",
    city: "Berlin",
    postalCode: "10115",
    countryCode: "DE",
    vatId: "DE123456789",
  },
  buyer: {
    name: "Kunde AG",
    street: "Kundenweg 2",
    city: "München",
    postalCode: "80331",
    countryCode: "DE",
  },
  lines: [{ description: "Beratungsleistung", quantity: 2, unitCode: "C62", unitPrice: 50.0, vatRate: 19.0 }],
  currency: "EUR",
  format: "zugferd", // "zugferd" oder "xrechnung"
};

const res = await fetch("https://api.fakturai.de/v1/invoices", {
  method: "POST",
  headers: { "Content-Type": "application/json", Authorization: "Bearer YOUR_API_KEY" },
  body: JSON.stringify(payload),
});
if (!res.ok) throw new Error(`API error ${res.status}: ${await res.text()}`);
await fs.writeFile("rechnung.pdf", Buffer.from(await res.arrayBuffer()));
console.log("E-Rechnung gespeichert.");

Der Payload ist dieselbe JSON-Struktur — die Sprache ist irrelevant für die API. In TypeScript fügen Sie eine Typ-Definition für den Payload hinzu; das Ergebnis bleibt ein Buffer bzw. ein ArrayBuffer.

Wichtige Pflichtfelder

Feld (JSON)EN-16931-CodePflicht
invoiceNumberBT-1
issueDateBT-2
seller.vatIdBT-31
lines[].unitCodeBT-130
lines[].vatRateBT-119
currencyBT-5
format✓ (zugferd oder xrechnung)

KoSIT-Accept-Gate: was die API vor der Rückgabe prüft

Jede erzeugte Datei durchläuft serverseitig ein vierschichtiges Prüf-Gate:

  1. Schema-Konformität (XSD)
  2. Schematron-Regeln (EN 16931 + ggf. CIUS XRechnung)
  3. Summenvalidierung (Positionsnetto, USt-Aufschlüsselung, Dokumentsummen)
  4. PDF/A-3-Konformität (bei ZUGFeRD/Factur-X)

Erreicht die Datei nicht ACCEPT-Status, gibt die API einen Fehler mit den konkreten Schematron-Regeln zurück — so sehen Sie sofort, welche Pflichtfelder fehlen oder welche Summe nicht stimmt.

Vorhandene Dateien — z. B. aus einem Drittsystem oder einem früheren API-Aufruf — können Sie ohne Konto im kostenlosen Validator gegen EN 16931 prüfen.

E-Rechnung kostenlos prüfen

MCP-Integration für AI-Agenten

Neben der REST-API steht ein MCP-Server bereit, der dieselbe Erzeuge-und-prüfe-Logik als Tool-Call exponiert. AI-Agenten und MCP-Clients können damit E-Rechnungen erzeugen, ohne HTTP manuell zu formulieren. Details im Beitrag E-Rechnung per API & MCP erstellen.

Was fakturai nicht ersetzt

fakturai erzeugt und prüft die technische Format- und Strukturkonformität nach EN 16931 mit einem KoSIT-orientierten Akzept-Gate. Die inhaltliche und steuerliche Richtigkeit des JSON-Payloads, die GoBD-konforme Archivierung der erzeugten Datei und die buchhalterische Behandlung bleiben in Ihrer Verantwortung. fakturai ist kein Buchhaltungssystem und gibt keine Rechts-, Steuer- oder Zustellungsgarantien.

Weiterlesen

German-first SEO page für „E-Rechnung Python / Node.js / SDK“-Intent. Illustrative Codebeispiele; technische Struktursprache nach EN 16931, kein Rechts-/Steuer-/Zustellungsversprechen (GHOA-1671).


English companion: Generate German e-invoices with Python and Node.js (API integration).