Zum Inhalt springen

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

  1. API-Key erstellen
    Erstellen Sie in Ihrem Konto einen Key und senden Sie ihn bei jeder Anfrage im Header Authorization: Api-Key <key> mit. API-Keys
  2. Rechnung als JSON senden
    POST /api/v1/invoices/ legt die Rechnung an; die Antwort enthält ihre id. In tax_breakdowns geben Sie je Steuerkategorie und Steuersatz einen Eintrag an; Summen und Steuerbeträge werden aus den Positionen neu berechnet.
  3. 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 Profil XRECHNUNG (öffentliche Auftraggeber, Leitweg-ID in buyer_reference) liefert POST /api/v1/invoices/{invoice_id}/generate_xrechnung/ das XRechnung-XML. Erzeugte Dateien laden Sie über GET /api/v1/invoices/{invoice_id}/download/ erneut herunter.
  4. 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 Formularfeld invoice_file liefert 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)
Pläne mit API-Zugang ansehen

Sicherheit und Datenschutz