TemplatesBeta

Rechnungsvorlagen – BlockTemplate-JSON für XRechnung & ZUGFeRD

JSON-basierte PDF-Templates im BlockTemplate-Format — neun Block-Typen, Platzhalter, Design-Tokens und § 14 UStG-konforme Darstellung für XRechnung, ZUGFeRD und Peppol.

9 Block-Typen fließen in eine PDF-Rechnung

Was ist eine Vorlage?

Eine Rechnungsvorlage ist ein JSON-Dokument mit den Feldern version, name, page, body (Pflicht) sowie optional header, footer, styles. Beim/generate-Aufruf werden Invoice-Daten in die Platzhalter eingefügt und ein PDF (oder PDF/A-3 mit eingebettetem ZUGFeRD-XML) erzeugt.

9 Block-Typen

text, table, keyvalue, summary, image, spacer, line, qrcode, columns — alles mit {type, data}-Envelope, verschachtelbar über columns.

Platzhalter & Bedingungen

Flache Mustache-Syntax: {{invoiceNumber}}, {{seller.name}}. Suffix {{feld?}} = optional. condition-Property rendert Blöcke nur bei vorhandenen Werten.

Design-Tokens

page.colorScheme und page.fontSizes definieren benannte Tokens. Blöcke referenzieren sie via { token: 'primaryColor' } statt Hex-Werte — ein Mandant, ein Farbwechsel.

Hybrid-konform

Template liefert die visuelle Ebene; bei ZUGFeRD wird die strukturierte EN-16931-XML automatisch in das PDF/A-3 eingebettet. § 14 UStG-Pflichtangaben werden vor dem Render validiert.

Die 9 Block-Typen

Jeder Block folgt dem Envelope { type, data } und kann optional eine condition tragen, die den Block bei leeren Platzhaltern ausblendet.

typeZweckPflichtfelder in data
textTextabschnitt mit Platzhaltern, Style, Farbe, Ausrichtungcontent
tableDatengebundene Tabelle über Listen (Positionen, Steuerzeilen)dataSource, columns
keyvalueLabel-Wert-Paare — Rechnungskopf, Kundendaten, Zahlungsinfositems[]
summarySummenblock mit dynamischen USt-Zeilen und Footer-Total— (typisch: rows oder dynamicRows)
imageLogo oder Grafik (URL, Base64 oder Platzhalter)src
spacerVertikaler Abstand in Punktenheight
lineHorizontale Trennlinie mit Dicke und Farbe
qrcodeQR-Code z. B. für SEPA-Girocode oder Zahlungslinkcontent
columnsMehrspaltiges Layout, verschachtelbare Blöckecolumns[]

Platzhalter-Referenz

Alle Felder des Creator-Payloads sind im Template verfügbar. Optionalität markierst du mit {{feld?}}. Listen werden per dataSource an table oder summary gebunden.

Rechnungskopf

PlatzhalterTypBeispielBeschreibung
{{invoiceNumber}}stringINV-2026-042Rechnungsnummer (§ 14 UStG)
{{issueDate}}date2026-04-14Ausstellungsdatum
{{dueDate}}date2026-05-14Zahlungsziel
{{currency}}stringEURISO 4217
{{subtotal}} / {{total}}number1500.00 / 1785.00Netto- bzw. Brutto-Summe

Seller / Buyer (identische Struktur)

PlatzhalterTypBeispielBeschreibung
{{seller.name}}, {{buyer.name}}stringACME GmbH / Kunde AGFirmenname (Pflicht)
{{seller.street}}, {{buyer.street}}stringHauptstr. 1Straße (Pflicht)
{{seller.postalCode}}, {{buyer.postalCode}}string10115PLZ (Pflicht)
{{seller.city}}, {{buyer.city}}stringBerlinOrt (Pflicht)
{{seller.countryCode}}, {{buyer.countryCode}}stringDEISO 3166-1 alpha-2 (Pflicht)
{{seller.vatId?}}, {{buyer.vatId?}}stringDE123456789EU-USt-IdNr., optional
{{seller.taxId?}}, {{buyer.taxId?}}string12/345/67890Nationale Steuernummer, optional
{{seller.bankAccount.iban?}}, {{buyer.bankAccount.iban?}}stringDE89…IBAN (seller: Pflicht bei SEPA-Überweisung; buyer: Pflicht bei SEPA-Lastschrift)
Weitere Felder beide Seiten: tradingName, additionalStreet, state, email, phone, website, bankAccount.bic/bankName/accountHolder — siehe Platzhalter-Referenz.

Datenquellen für table / summary

PlatzhalterTypBeispielBeschreibung
{{items}}arrayRechnungspositionen (dataSource für table-Block)
{{taxSummary}}arraySteuerzeilen (dataSource für summary.dynamicRows)
item.fieldanydescription, quantity, netAmount, …Spaltenbindung über field-Prop in table.columns

Vorlage verwenden

Templates werden direkt am /api/v1/invoice/{countryCode}/{format}/generate übergeben — entweder per templateId (UUID einer gespeicherten Vorlage) oder inline via formatOptions.template. Priorität: templateId > formatOptions.template> Default.

Empfohlen

Per templateId

Einmal in der Konsole oder via pdf.templateCreate anlegen, dann nur die UUID pro Request mitsenden.

bash
1curl -X POST \
2 https://service.invoice-api.xhub.io/api/v1/invoice/de/zugferd/generate \
3 -H "Authorization: Bearer $XHUB_API_KEY" \
4 -H "Content-Type: application/json" \
5 -d '{
6 "templateId": "b3c9a0d8-4f2e-4a1c-9e87-0d2f1a5b6c7d",
7 "invoice": { /* ... Invoice-Payload (Creator-API) ... */ }
8 }'
Ad-hoc

Inline BlockTemplate

Template-JSON direkt mitsenden — nützlich für Tests, CI-Pipelines oder dynamisch generierte Layouts.

bash
1curl -X POST \
2 https://service.invoice-api.xhub.io/api/v1/invoice/de/zugferd/generate \
3 -H "Authorization: Bearer $XHUB_API_KEY" \
4 -H "Content-Type: application/json" \
5 -d '{
6 "invoice": { /* ... */ },
7 "formatOptions": {
8 "template": { /* inline BlockTemplate JSON */ }
9 }
10 }'
Pflichtangaben-Validierung vor dem Render
Eingebettete Schriften, PDF/A-3 bei ZUGFeRD
Hybrid-Rechnung: EN-16931-XML automatisch eingebettet

Häufige Fragen

Bereit, deine Rechnung zu gestalten?

Starte mit einem System-Template, passe Logo und Farben an und render dein erstes PDF in unter 5 Minuten.