ZUGFeRD erstellen per API (Factur-X, PDF/A-3)

Mit "format": "zugferd" liefert POST https://veriport.io/api/v1/einvoice/create eine hybride Rechnung: ein PDF/A-3, dessen sichtbare Seite aus denselben Daten gezeichnet ist wie die eingebettete Datei factur-x.xml (CII, Profil EN 16931). ZUGFeRD 2.x und Factur-X 1.0 sind dasselbe Format; das Profil EN 16931 heißt bei ZUGFeRD « COMFORT ». Jede Beispieldatei der Prüfreihe hat veraPDF als PDF/A-3B-konform und Mustang als gültige ZUGFeRD-Rechnung bewertet. 20 Aufrufe je Rechnung.

Warum ZUGFeRD statt reiner XML?

Der Empfänger kann das PDF lesen wie jede Rechnung, und seine Buchhaltung liest die XML. Seit 2025 gilt eine ZUGFeRD-Rechnung ab Profil EN 16931 in Deutschland als E-Rechnung im Sinne des § 14 UStG; die Profile MINIMUM und BASIC WL genügen dafür nicht. In Frankreich ist Factur-X eines der drei Formate der Reform (Empfang ab 1. September 2026, Ausstellung für KMU ab 1. September 2027).

Die Anfrage

Dasselbe JSON wie für XRechnung, nur das Format ändert sich. Für die sichtbare Seite können Sie language setzen (de, en, fr, nl); ohne Angabe gilt Deutsch für einen deutschen Verkäufer. Das Beispiel ist der Fall « allowance-and-charge » (3 % Treuerabatt auf eine Basis, ein fester Nachlass zu 7 %, Versand zu 19 %).

invoice.json
{
  "format": "zugferd",
  "number": "2026-040",
  "issueDate": "2026-10-20",
  "paymentTermsDays": 14,
  "buyerReference": "EK-2026-0345",
  "deliveryDate": "2026-10-15",
  "seller": {
    "name": "Lena Hartmann — Webdesign",
    "address": {
      "street": "Lindenstraße 14",
      "postalCode": "10969",
      "city": "Berlin",
      "countryCode": "DE"
    },
    "vatId": "DE136695976",
    "contact": {
      "name": "Lena Hartmann",
      "phone": "+49 30 1234567",
      "email": "rechnung@hartmann-webdesign.example"
    }
  },
  "buyer": {
    "name": "Mustermann Maschinenbau GmbH",
    "address": {
      "street": "Industrieweg 7",
      "postalCode": "70565",
      "city": "Stuttgart",
      "countryCode": "DE"
    },
    "contact": {
      "email": "buchhaltung@mustermann.example"
    }
  },
  "payment": {
    "iban": "DE02120300000000202051"
  },
  "lines": [
    {
      "name": "Relaunch Website",
      "quantity": 20,
      "unitCode": "HUR",
      "unitPrice": 95,
      "vat": {
        "category": "S",
        "rate": 19
      }
    },
    {
      "name": "Fachbuch Barrierefreiheit",
      "quantity": 10,
      "unitCode": "C62",
      "unitPrice": 19.99,
      "vat": {
        "category": "S",
        "rate": 7
      }
    }
  ],
  "allowances": [
    {
      "percent": 3,
      "baseAmount": 1900,
      "reason": "Treuerabatt 3 %",
      "reasonCode": "95",
      "vat": {
        "category": "S",
        "rate": 19
      }
    },
    {
      "amount": 10,
      "reason": "Mengenrabatt Bücher",
      "vat": {
        "category": "S",
        "rate": 7
      }
    }
  ],
  "charges": [
    {
      "amount": 24.9,
      "reason": "Versand",
      "reasonCode": "FC",
      "vat": {
        "category": "S",
        "rate": 19
      }
    }
  ]
}
curl — ZUGFeRD-PDF erzeugen
curl -X POST "https://veriport.io/api/v1/einvoice/create" \
  -H "Authorization: Bearer vp_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 2026-040" \
  -D headers.txt -o rechnung.pdf \
  -d @invoice.json

Was zurückkommt

application/pdf mit Veriport-Validation: valid; profile=en16931; …. Mit ?envelope=json dieselbe Datei in Base64 plus Prüfbericht. Pro Anfrage prüft die API die eingebettete XML gegen Schema und EN-16931-Regeln; die PDF/A-Konformität ist durch die Prüfreihe belegt (veraPDF) und wird nicht bei jeder Anfrage neu gemessen.

Eine erhaltene ZUGFeRD-Rechnung lesen

POST https://veriport.io/api/v1/einvoice/parse öffnet ein ZUGFeRD- oder Factur-X-PDF, liest die eingebettete XML und gibt sie als dasselbe JSON zurück, das create annimmt, mit einer Liste dessen, was das JSON nicht abbildet (notInJson). Mit ?as=pdf gibt es eine lesbare PDF/A-Kopie. Ohne Konto zeigt der E-Rechnungs-Viewer eine Rechnung im Browser an.

Was nicht dabei ist

  • Die Profile MINIMUM, BASIC WL und EXTENDED sowie das ZUGFeRD-Profil XRECHNUNG werden in v1 nicht erzeugt; geprüft wird EN 16931 und BASIC.
  • Die besonderen Angaben der französischen Plattformen (PA) der Reform 2026/2027 sind nicht umgesetzt.
  • Kein Versand: die API erzeugt und prüft Dateien, sie übermittelt nichts (kein Peppol-Zugangspunkt, keine E-Mail an den Empfänger).
  • Keine Speicherung: Eingabe und Datei existieren nur während der Anfrage; die GoBD-konforme Archivierung bleibt beim Rechnungssteller.
  • Keine Steuerberatung: die Datei enthält die Angaben, die Sie senden; welche Steuerkategorie gilt, entscheidet der Rechnungssteller.

Questions

Ist ZUGFeRD dasselbe wie Factur-X?
Ja, seit ZUGFeRD 2.1 sind beide technisch identisch; Factur-X ist der französische Name, die Kennungen der Profile sind gleich. Eine Rechnung im Profil EN 16931 ist in beiden Ländern dieselbe Datei.
Kann ich eine Factur-X-Datei kostenlos prüfen?
Ja, auf Factur-X valider (Französisch) oder XRechnung prüfen, ohne Konto, 4 Prüfungen am Tag.
Wird das PDF gespeichert?
Nein. Es entsteht im Speicher der Anfrage und wird nur Ihnen geliefert; eine Wiederholung mit demselben Idempotency-Key erzeugt es neu, byte-gleich.

ZUGFeRD-Rechnungen aus Ihrem eigenen Code: 100 Aufrufe im Monat ohne Karte.

Kostenlosen API-Schlüssel holen

Sources