Integrationen · Python-SDK
ZUGFeRD und XRechnung in Python
ZUGFeRD, Factur-X und XRechnung in Python, ohne eigenes XML-Mapping: Das Python-SDK für Python 3.9 und neuer — nur die Standardbibliothek, keine weiteren Abhängigkeiten, vollständig typisiert. Für Skripte, Buchhaltungs-Tools, Django- oder FastAPI-Backends: jede erzeugte Rechnung ist vom offiziellen Validator geprüft, Tempolimits werden automatisch abgewartet.
Installieren
Das Paket liegt auf PyPI, der Quellcode offen auf GitHub:
pip install invoapiAuf dem Mac (und unter Linux) gibt es pip meist nicht, und das System-Python nimmt keine Pakete an. Legen Sie dort eine eigene Umgebung für Ihr Projekt an:
python3 -m venv .venv
source .venv/bin/activate
pip install invoapiMit uv geht es in einem Schritt: uv add invoapi.
Version 0.1.0, getestet mit Python 3.9 bis 3.14. Den API-Schlüssel legen Sie im Dashboard an und setzen ihn als Umgebungsvariable INVOAPI_API_KEY.
XRechnung in Python erzeugen
import invoapi
client = invoapi.Client() # liest INVOAPI_API_KEY
rechnung = client.generate({
"invoice_number": "RE-2026-0001",
"issue_date": "2026-10-28",
"due_date": "2026-11-27",
"currency": "EUR",
"buyer_reference": "04011000-12345-34",
"seller": {
"name": "Muster GmbH", "street": "Musterstraße 1", "postal_code": "10115",
"city": "Berlin", "country_code": "DE", "vat_id": "DE123456789",
"email": "rechnung@muster.de", "phone": "+49 30 1234567",
},
"buyer": {
"name": "Beispiel GmbH", "street": "Teststraße 10", "postal_code": "20095",
"city": "Hamburg", "country_code": "DE", "email": "kreditoren@beispiel.de",
},
"items": [
{"name": "Beratung", "quantity": 8, "unit": "HUR", "unit_price": 145, "vat_rate": 19},
],
"payment": {"means_code": "58", "iban": "DE02120300000000202051"},
}, format="xrechnung")
if rechnung.is_valid:
rechnung.save() # RE-2026-0001.xmlBeträge dürfen auch Decimal sein, Datumsangaben datetime.date. Alle Felder beschreibt die API-Dokumentation.
ZUGFeRD-PDF in Python erstellen
Dieselben Daten ergeben mit format zugferd und output pdf ein hybrides ZUGFeRD-2.5-PDF: ein PDF/A-3 mit eingebetteter factur-x.xml, geprüft mit KoSIT, veraPDF und den ZUGFeRD-Profilregeln. Factur-X ist derselbe Standard unter französischem Namen.
pdf = client.generate(daten, format="zugferd", output="pdf", profile="en16931")
if pdf.is_valid:
pdf.save() # RE-2026-0001.pdf, PDF/A-3 mit factur-x.xmlEingangsrechnung prüfen
from pathlib import Path
bericht = client.validate(Path("eingang.xml")) # XML oder ZUGFeRD-PDF
if not bericht.is_valid:
for fehler in bericht.errors:
print(f"{fehler['rule']}: {fehler['message']}")is_valid ist nur dann wahr, wenn ein offizielles Regelwerk tatsächlich gelaufen ist. Statt eines Pfads gehen auch bytes oder der XML-Text.
Alles Weitere
pdf = client.generate(daten, format="zugferd", output="pdf") # ZUGFeRD PDF/A-3
daten = client.parse(xml_oder_pdf) # Rechnung als dict
art = client.detect(xml_oder_pdf) # Standard, Syntax, Version
cii = client.convert(ubl_xml, "xml", format="xrechnung", syntax="cii")
html = client.render(xml_oder_pdf, "html") # Lesefassung
summen = client.calculate(daten)["totals"] # kostenlosFehler
Jede Ablehnung löst eine Ausnahme mit der verständlichen Meldung der API aus. Alle erben von invoapi.InvoapiError und tragen request_id für Support-Anfragen.
| InvalidRequestError | Rechnung oder Dokument fehlerhaft; details nennt die Felder |
| AuthenticationError | Schlüssel falsch, E-Mail unbestätigt oder Konto gesperrt |
| QuotaExhaustedError | Gratis-Kontingent aufgebraucht |
| RateLimitError | Zu viele Aufrufe; retry_after nennt die Wartezeit |
| ServiceUnavailableError | Dienst kurz nicht erreichbar |
| APIConnectionError | Keine Verbindung (DNS, TLS, Zeitüberschreitung) |
Python-Bibliothek oder API?
Für ZUGFeRD in Python gibt es auch Open-Source-Bibliotheken wie factur-x oder drafthorse. Sie erzeugen das XML oder betten es in ein vorhandenes PDF ein; die offizielle Schematron- und KoSIT-Prüfung bringen sie nicht mit. Das SDK verlagert beides auf den Server:
| Python-Bibliothek | invoapi Python-SDK | |
|---|---|---|
| XML-Mapping | im eigenen Code, je Format | ein dict für alle Formate |
| KoSIT-Prüfung | Java-Validator separat betreiben | in jedem Aufruf enthalten |
| ZUGFeRD-PDF | eigenes PDF/A-3 erzeugen und XML einbetten | fertiges PDF mit Logo und Design |
| Neue Versionen | Bibliothek und Regelwerke aktualisieren | serverseitig, ohne Update |
| Kosten | kostenlos, eigener Aufwand | 100 Rechnungen kostenlos, dann ab 24 €/Monat |
Mehr zu den Formaten: ZUGFeRD API · XRechnung API
Häufige Fragen zu ZUGFeRD und XRechnung in Python
- Wie erstelle ich eine ZUGFeRD-Rechnung in Python?
- Installieren Sie das SDK mit pip install invoapi und rufen Sie client.generate() mit format="zugferd" und output="pdf" auf. Sie erhalten ein fertiges ZUGFeRD-PDF (PDF/A-3 mit eingebetteter factur-x.xml), das bereits gegen die offiziellen Regeln geprüft ist; pdf.save() schreibt es auf die Platte.
- Ist das auch eine Factur-X-Bibliothek für Python?
- Ja. Factur-X und ZUGFeRD sind seit Version 2.1 derselbe Standard; das SDK erzeugt ZUGFeRD 2.5.2, die eingebettete Datei heißt factur-x.xml. Französische Empfänger lesen die Rechnung als Factur-X.
- Wie erzeuge ich eine XRechnung mit Python?
- Mit client.generate(daten, format="xrechnung"). Sie erhalten eine XRechnung 3.0.2 in UBL oder CII, geprüft mit dem KoSIT-Validator. Für Behörden gehört die Leitweg-ID in buyer_reference.
- Funktioniert das SDK mit Django, FastAPI oder Odoo?
- Ja. Das SDK nutzt nur die Standardbibliothek und läuft überall ab Python 3.9 — in Django-Views, FastAPI-Endpunkten, Celery-Jobs, Odoo-Modulen oder einfachen Skripten. Beträge dürfen Decimal sein, Datumsangaben datetime.date.
- Was kostet das Python-SDK?
- Das SDK selbst ist kostenlos und MIT-lizenziert. Die API enthält 100 Rechnungen kostenlos, danach ab 24 € im Monat für 500 Rechnungen (zzgl. USt.), monatlich kündbar.

