Invoice PDF API

Invoice PDF API: Rechnungen im Markenlook aus Ihren Abrechnungsdaten

Senden Sie Rechnungsposten als JSON und erhalten Sie ein druckfertiges Rechnungs-PDF zurück — zum Versenden per E-Mail, Ablegen oder Anzeigen im Kundenportal. Ihre Abrechnungslogik bleibt bei Ihnen; wir rendern das PDF.

  • 50 kostenlose Renderings/Monat
  • Ohne Kreditkarte
  • Jede Währung und Sprache

Was ist eine Rechnungs-PDF-API?

Eine Rechnungs-PDF-API macht aus Abrechnungsdaten ein fertiges Rechnungsdokument. Ihre Anwendung sendet Rechnungsnummer, Kunde, Posten, Steuern und Summen als JSON; die API setzt sie in eine Markenvorlage ein, bricht die Seiten um und liefert ein PDF, das Sie per E-Mail versenden, ablegen oder zum Download anbieten können. Die Berechnungen bleiben in Ihrem Abrechnungssystem.

Invoice PDF API: die wichtigsten Fakten
EndpunktPOST https://api.dynamicdocumentapi.com/v1/pdf/from-template (oder /v1/pdf/from-html für Ihr eigenes HTML)
EingabeIhre Rechnungsdaten als JSON, in beliebiger Form
LayoutHTML/CSS-Vorlage mit Jinja-Syntax; wiederholte Tabellenköpfe, saubere Seitenumbrüche, Seitenzahlen
Währungen und DatenJede ISO-4217-Währung und jede Sprache, formatiert mit Unicode-CLDR-Daten
CodesQR-Codes (Zahlungslinks, Überweisungsdaten) und 16 Barcode-Typen
AuslieferungSignierte URL (standardmäßig 1 Stunde, bis zu 7 Tage), binär für E-Mail-Anhänge oder base64
MassenversandStapel aus einer JSON-Liste oder einer CSV-Datei, Fortschritt per Webhook (Bezahltarife)
PreisFree: 50 Renderings/Monat. Bezahlt ab 15 €/Monat (jährlich abgerechnet) für 3.000 Renderings, automatisches Nachladen ab 6 € je 1.000, etwa 0,005 € pro Rechnung

Ein Rechnungs-PDF mit einer Anfrage erzeugen

Speichern Sie Ihr Rechnungslayout einmal als Vorlage und senden Sie danach jede Rechnung als JSON. Das Beispiel übergibt die Zahlen genau so, wie Ihr Abrechnungssystem sie berechnet hat; die Vorlage formatiert sie nur. Sie haben schon eine Rechnungsseite in HTML? Dann können Sie Ihre vorhandene HTML-Rechnung direkt umwandeln.

curl https://api.dynamicdocumentapi.com/v1/pdf/from-template \
  -H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
  -H "Idempotency-Key: INV-2026-0042" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "tpl_invoice",
    "data": {
      "number": "INV-2026-0042",
      "issued": "2026-09-22",
      "due": "2026-10-22",
      "locale": "en-US",
      "currency": "USD",
      "customer": { "name": "Acme Co.", "address": "1 Main St, Austin, TX" },
      "items": [
        { "name": "Pro plan (annual)", "qty": 1, "unit": 1200.00, "total": 1200.00 },
        { "name": "Extra seats",       "qty": 4, "unit": 40.00,   "total": 160.00 }
      ],
      "subtotal": 1360.00, "tax_rate": 0.08, "tax": 108.80, "total": 1468.80,
      "pay_url": "https://pay.example.com/i/INV-2026-0042"
    },
    "filename": "{{ data.number }}.pdf",
    "delivery": "binary"
  }' \
  --output INV-2026-0042.pdf
// Node.js 18+: render the invoice and return the PDF bytes
export async function renderInvoice(invoice) {
  const res = await fetch("https://api.dynamicdocumentapi.com/v1/pdf/from-template", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.DYNAMIC_DOCUMENT_API_KEY}`,
      "Idempotency-Key": invoice.number, // safe to retry
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      template_id: "tpl_invoice",
      data: invoice,
      filename: `${invoice.number}.pdf`,
      delivery: "binary",
    }),
  });
  if (!res.ok) throw new Error(await res.text());
  return Buffer.from(await res.arrayBuffer());
}
import os
import requests

def render_invoice(invoice: dict) -> bytes:
    res = requests.post(
        "https://api.dynamicdocumentapi.com/v1/pdf/from-template",
        headers={
            "Authorization": f"Bearer {os.environ['DYNAMIC_DOCUMENT_API_KEY']}",
            "Idempotency-Key": invoice["number"],  # safe to retry
        },
        json={
            "template_id": "tpl_invoice",
            "data": invoice,
            "filename": f"{invoice['number']}.pdf",
            "delivery": "binary",
        },
        timeout=60,
    )
    res.raise_for_status()
    return res.content
<?php
function renderInvoice(array $invoice): string
{
    $ch = curl_init('https://api.dynamicdocumentapi.com/v1/pdf/from-template');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . getenv('DYNAMIC_DOCUMENT_API_KEY'),
            'Idempotency-Key: ' . $invoice['number'], // safe to retry
            'Content-Type: application/json',
        ],
        CURLOPT_POSTFIELDS     => json_encode([
            'template_id' => 'tpl_invoice',
            'data'        => $invoice,
            'filename'    => $invoice['number'] . '.pdf',
            'delivery'    => 'binary',
        ]),
    ]);
    return curl_exec($ch); // PDF bytes
}

Der Header Idempotency-Key nutzt die Rechnungsnummer. Wiederholt Ihr Code eine Anfrage wegen eines Netzwerkfehlers, liefert die API das bereits erzeugte Rendering für diesen Schlüssel zurück, statt ein zweites anzulegen. Schlüssel werden 24 Stunden aufbewahrt.

Alles, was eine Rechnungsvorlage braucht

Rechnungen wirken einfach, bis die erste drei Seiten lang wird oder an Kundschaft in einem anderen Land geht. Das sind die Teile, die meist am längsten dauern, und so löst die Vorlage sie. Um das Layout selbst zu ändern, können Sie die Rechnungsvorlage in HTML und CSS anpassen.

Posten, die sauber über Seiten umbrechen

Eine lange Bestellung ist eine normale HTML-Tabelle. Der <thead> wiederholt sich auf jeder Seite, Zeilen werden nie in der Mitte geteilt, und der Summenblock bleibt zusammen.

tr, .totals { break-inside: avoid; }
thead       { display: table-header-group; }

Steuern, Rabatte und Summen aus Ihrem System

Umsatzsteuer, Reverse Charge, Rabatte und Rundung folgen Regeln, die in Ihren Abrechnungscode gehören, wo sie getestet und geprüft werden. Senden Sie die berechneten Werte; die Vorlage zeigt sie an. Nichts auf dem PDF kann von Ihrer Buchhaltung abweichen.

Mehrere Währungen und Formate je Sprache

Eine Vorlage bedient jeden Markt. Währungssymbole, Dezimaltrennzeichen, Nachkommastellen und Datumsformate folgen Unicode CLDR für die übergebene Sprache.

{{ total | format_currency(currency, locale) }}
USD en-US → $1,468.80   EUR de → 1.468,80 €
JPY ja    → ¥1,469
{{ issued | format_date("long", locale) }}

Logo, Markenfarben und rechtliche Fußzeile

Logo, Schriften und Farben sind Teil von HTML und CSS der Vorlage. Die laufende Fußzeile trägt Ihre Pflichtangaben und „Seite 1 von 2" auf jeder Seite.

"footer": { "enabled": true,
  "left": "Acme Inc. · EIN 12-3456789",
  "right": "Page {{page}} of {{pages}}" }

Zahlungs-QR-Codes

Setzen Sie einen scanbaren Code neben die Summe: einen Link zu Ihrer Zahlungsseite oder Überweisungsdaten wie einen EPC-QR-Code (GiroCode) für SEPA-Zahlungen. Sie bauen den Inhalt; die Vorlage zeichnet einen scharfen Vektor-QR-Code.

{{ pay_url | qrcode(size="28mm", ecc="M") }}

Beträge in Worten

Manche Märkte und Zahlscheine verlangen den Betrag in Worten. number_to_words erledigt das auf Englisch, Deutsch, Französisch, Spanisch und Niederländisch.

{{ 1468 | number_to_words("en") }}
→ one thousand, four hundred and sixty-eight

Rechnungen aus Stripe, Shopify oder Ihrem eigenen Backend automatisieren

Die meisten Teams erstellen eine Rechnung, wenn ein Zahlungsereignis eintrifft. Der Ablauf ist bei jedem Zahlungsanbieter gleich:

  1. Zahlungsereignis

    Ihr Anbieter ruft Ihren Webhook auf, zum Beispiel Stripes invoice.paid oder einen Bestell-Webhook von Shopify.

  2. Rendern

    Ihr Handler macht aus dem Ereignis Rechnungs-JSON und ruft die API mit der Rechnungsnummer als Idempotenzschlüssel auf.

  3. Ausliefern

    Hängen Sie das PDF an Ihre Beleg-E-Mail, legen Sie es ab oder zeigen Sie den signierten Link im Kundenportal.

Zahlungs-Webhooks werden vom Anbieter wiederholt, dasselbe Ereignis kann also zweimal ankommen. Der Idempotenzschlüssel macht das harmlos: Der zweite Aufruf liefert das erste PDF. Für den Monatsabschluss senden Sie einen Stapel mit allen Rechnungen, aus einer JSON-Liste oder einem CSV-Export, und erhalten batch.completed, sobald jedes PDF fertig ist. Rechnungen sind ein Anwendungsfall unserer PDF-Generierungs-API.

Rechnungen ausliefern und ablegen

  • E-Mail-Anhang. "delivery": "binary" liefert die PDF-Bytes, bereit für das Anhangsfeld Ihres E-Mail-Anbieters.
  • Download-Link. Die Standardantwort enthält eine signierte URL. Sie läuft nach einer Stunde ab oder mit expires_in nach bis zu sieben Tagen.
  • Aufbewahrung nach Ihren Vorgaben. Behalten Sie Dateien so viele Tage, wie Sie mit retention_days festlegen, bis zum Maximum Ihres Tarifs, und löschen Sie sie jederzeit. Ihr gesetzlich vorgeschriebenes Archiv führen Sie in Ihrem eigenen System.
  • Ihr eigener Bucket. In Enterprise-Tarifen können Rechnungen direkt in Ihren eigenen S3-kompatiblen Speicher geschrieben werden.
  • Benachrichtigungen. Signierte Webhooks melden Ihrem System, ob ein Rendering gelungen oder fehlgeschlagen ist. Einen Webhook, den Ihr Server nicht annimmt, versuchen wir bis zu achtmal über etwa 28 Stunden.

Was das Erzeugen einer Rechnung kostet

Free

€0

50 Rechnungen pro Monat. Genug, um Ihre Vorlage von Anfang bis Ende zu bauen und zu testen.

Starter

€15 / Monat

3.000 Renderings pro Monat, jährlich abgerechnet (19 € bei monatlicher Abrechnung). Etwa 0,005 € pro Rechnung.

Bei 15.000 Rechnungen im Monat kostet der Growth-Tarif 47 € bei jährlicher Abrechnung, etwa 0,0031 € pro Rechnung — und ein starker Monat stoppt nie: Bezahltarife laden automatisch nach. Siehe die Kosten pro Rechnung in jedem Tarif.

FAQ

Invoice PDF API: häufige Fragen

Berechnet die API Steuern oder Rechnungsnummern?

Nein, und das ist Absicht. Rechnungsnummern, Steuersätze, Rabatte und Summen kommen aus Ihrem Abrechnungssystem, der maßgeblichen Quelle. Die API formatiert und setzt, was Sie senden, sodass das PDF immer zu Ihren Büchern passt. Der Bequemlichkeit halber können Vorlagen Spalten trotzdem mit sum_by addieren.

Kann eine Rechnung mehrere Seiten lang sein?

Ja. Posten sind eine normale HTML-Tabelle: Die Kopfzeile wiederholt sich auf jeder Seite, Zeilen werden nie geteilt, und eine Fußzeile kann „Seite 2 von 3" zeigen. Mit break-inside: avoid bleiben die Summen bei den letzten Zeilen.

Kann ich Rechnungen in mehreren Sprachen und Währungen erzeugen?

Ja. Übergeben Sie Sprache und Währung der Kundschaft mit den Daten. Währungssymbole, Dezimaltrennzeichen und Datumsformate folgen den Unicode-CLDR-Regeln, zum Beispiel $1,234.50 in den USA, 1.234,50 € in Deutschland und ¥1,235 in Japan. Textbeschriftungen stammen aus Ihrer Vorlage, eine Vorlage kann also mehrere Sprachen enthalten.

Kann ich einen Stempel „Bezahlt" oder ein anderes Layout für Gutschriften zeigen?

Ja. Vorlagen nutzen Bedingungen, eine Vorlage kann also je nach gesendeten Daten einen Stempel „Bezahlt", eine Rabattzeile, einen zweiten Adressblock oder den Titel einer Gutschrift zeigen. Getrennte Vorlagen für Rechnungen und Gutschriften funktionieren genauso gut.

Wie lange werden erzeugte Rechnungen gespeichert?

So lange, wie Sie es je Anfrage mit retention_days festlegen, bis zum Maximum Ihres Tarifs — oder gar nicht, wenn Sie die Datei binär abholen. Gespeicherte Dateien können Sie jederzeit löschen. Die gesetzliche Aufbewahrung von Rechnungen bleibt Ihre Verantwortung; führen Sie also Ihre eigene Archivkopie, etwa in Ihrem eigenen Storage-Bucket.

Kann die API Rechnungen an meine Kundschaft mailen?

Die API erstellt das PDF; der Versand bleibt bei Ihrem E-Mail-Anbieter. Fordern Sie "delivery": "binary" an, um die Datei direkt anzuhängen, oder senden Sie einen signierten Link, der nach einer von Ihnen gewählten Zeit abläuft, höchstens nach sieben Tagen.

Erzeugen Sie Ihre erste Rechnung kostenlos

50 Renderings im Monat im Free-Tarif, ohne Kreditkarte, automatisches Nachladen in Bezahltarifen.

Kostenlos starten