API für Entwickler
JSON rein, geprüfte E-Rechnung raus
Sie senden Ihre Rechnungsdaten als JSON und erhalten ein ZUGFeRD-PDF/A-3 oder ein XRechnung-XML nach EN 16931. Bevor eine Datei entsteht, wird die Rechnung nach den offiziellen Prüfregeln der KoSIT geprüft; besteht sie die Prüfung nicht, erhalten Sie statt einer Datei die Meldungen der Prüfung. Normen, Schematron-Regeln und PDF/A-Umwandlung müssen Sie nicht selbst umsetzen – Sie brauchen nur eine versionierte REST-API mit OpenAPI-Beschreibung.
So funktioniert es
-
API-Key erstellen
Erstellen Sie in Ihrem Konto einen Key und senden Sie ihn bei jeder Anfrage im HeaderAuthorization: Api-Key <key>mit. API-Keys -
Rechnung als JSON senden
POST /api/v1/invoices/legt die Rechnung an; die Antwort enthält ihreid. Intax_breakdownsgeben Sie je Steuerkategorie und Steuersatz einen Eintrag an; Summen und Steuerbeträge werden aus den Positionen neu berechnet. -
PDF/A-3 oder XRechnung-XML abrufen
POST /api/v1/invoices/{invoice_id}/generate_zugferd_pdf/liefert das ZUGFeRD-PDF/A-3 mit eingebettetem XML. Für Rechnungen mit dem ProfilXRECHNUNG(öffentliche Auftraggeber, Leitweg-ID inbuyer_reference) liefertPOST /api/v1/invoices/{invoice_id}/generate_xrechnung/das XRechnung-XML. Erzeugte Dateien laden Sie überGET /api/v1/invoices/{invoice_id}/download/erneut herunter. -
Prüfergebnis auswerten
Schlägt die Prüfung fehl, erhalten Sie statt einer Datei HTTP 400 mit den Meldungen der Prüfung. Vorhandene XML-Dateien prüfen Sie ebenfalls:POST /api/v1/validate/mit der Datei im Formularfeldinvoice_fileliefert Fehler und Warnungen.
Beispiele
Rechnungsdaten (invoice.json)
{
"invoice_number": "RE-2026-001",
"issue_date": "2026-10-01",
"delivery_date": "2026-10-01",
"type_code": "380",
"currency_code": "EUR",
"payment_terms": "Zahlbar innerhalb von 14 Tagen ohne Abzug",
"seller": {
"name": "Muster GmbH",
"street": "Musterstraße 1",
"postal_code": "10115",
"city": "Berlin",
"country_code": "DE",
"vat_id": "DE123456789",
"contact_name": "Max Mustermann",
"contact_phone": "+49 30 12345678",
"contact_email": "rechnung@muster.example"
},
"buyer": {
"name": "Käufer AG",
"street": "Käuferstraße 5",
"postal_code": "80331",
"city": "München",
"country_code": "DE",
"vat_id": "DE987654321"
},
"items": [
{
"line_id": "1",
"name": "Beratungsleistung",
"quantity": "8",
"unit_code": "HUR",
"net_price": "95.00",
"tax_category": "S",
"tax_rate": "19.00"
}
],
"tax_breakdowns": [
{
"tax_category": "S",
"tax_rate": "19.00",
"basis_amount": "760.00",
"tax_amount": "144.40"
}
]
}
curl
curl -X POST "https://www.e-rechnungsfreund.de/api/v1/invoices/" \
-H "Authorization: Api-Key $API_KEY" \
-H "Content-Type: application/json" \
-d @invoice.json
curl -X POST "https://www.e-rechnungsfreund.de/api/v1/invoices/$INVOICE_ID/generate_zugferd_pdf/" \
-H "Authorization: Api-Key $API_KEY" \
-o invoice.pdf
curl -X POST "https://www.e-rechnungsfreund.de/api/v1/validate/" \
-H "Authorization: Api-Key $API_KEY" \
-F "invoice_file=@invoice.xml"
Python (requests)
import json
import requests
BASE_URL = "https://www.e-rechnungsfreund.de"
HEADERS = {"Authorization": "Api-Key YOUR_API_KEY"}
with open("invoice.json", encoding="utf-8") as f:
invoice = json.load(f)
response = requests.post(f"{BASE_URL}/api/v1/invoices/", json=invoice, headers=HEADERS, timeout=30)
response.raise_for_status()
invoice_id = response.json()["id"]
pdf = requests.post(
f"{BASE_URL}/api/v1/invoices/{invoice_id}/generate_zugferd_pdf/",
headers=HEADERS,
timeout=120,
)
if pdf.status_code == 400:
print(pdf.json())
else:
pdf.raise_for_status()
with open("invoice.pdf", "wb") as f:
f.write(pdf.content)
Alle Felder, optionale Angaben (z. B. Zahlungsmittel, Nachlässe und Zuschläge, Bemerkungen) und die Antwortformate beschreibt die API-Dokumentation. API-Dokumentation öffnen
Rate-Limits
- Reguläre Endpunkte (z. B. Rechnungen anlegen, abrufen und herunterladen): 120 Anfragen pro Minute pro Konto. Ressourcenintensive Anfragen zählen ebenfalls auf dieses Limit.
- Ressourcenintensive Endpunkte (Validierung, PDF/A-3- und XRechnung-Erzeugung): eigenes, strengeres Limit von standardmäßig 6 Anfragen pro Minute pro Konto; höhere Pläne erlauben mehr (siehe unten).
Wird ein Limit überschritten, antwortet die API mit HTTP 429. Die monatliche Anzahl Rechnungen Ihres Plans gilt auch für die API (bei Erreichen HTTP 402).
Versionierung und Dokumentation
Die API-Version ist Teil des Pfads: /api/v1/. Die aktuelle OpenAPI-Beschreibung hat die Version 1.0.0.
Welche Pläne enthalten API-Zugang?
API-Zugang ist in diesen Plänen enthalten:
- Pro (ressourcenintensive Endpunkte: 15 Anfragen pro Minute)
- Business (ressourcenintensive Endpunkte: 30 Anfragen pro Minute)