Eine API-Anfrage genügt:
Ihr System übermittelt die Rechnungsdaten, unsere API erstellt daraus ein vollständiges ZUGFeRD-PDF oder eine XRechnung-XML. Kompatibel mit jeder Programmiersprache, jeder Plattform und jedem ERP-System.
| Leistung | Menge | Gesamt |
|---|---|---|
| Software-Lizenz Pro | 3× | 597,00 € |
| Server-Hosting Mai | 1× | 350,00 € |
| Mengenrabatt 5% | -47,35 € |
Kein Vorwissen nötig — Sie liefern die Daten, wir liefern das fertige, validierungskonforme Dokument.
Von der rein visuellen PDF-Rechnung bis zum maschinenlesbaren XML für Bundesbehörden — ein Endpoint, alle Formate.
Automatische Erkennung aus Länder- und Steuerkonfiguration. Seller und Buyer können aus beliebigen Ländern sein — keine Einschränkungen.
Rabatt-Positionen einfach als negativen Einzelpreis übergeben.
Automatische 4-Dezimalstellen-Berechnung verhindert Rundungsfehler bei monatlich anteiligen Preisen. Mustang-Warning-10 wird strukturell vermieden.
Logo, Farben, Schriftart, Spaltenbreiten, Fußzeile — alles per JSON konfigurierbar.
Übergeben Sie einfach payment_type_code und den Rest übernimmt die API — inklusive automatischer Mandatsverwaltung für SEPA-Lastschrift.
Der Kunde scannt mit der Banking-App — IBAN, Empfänger, Betrag und Verwendungszweck werden automatisch übernommen, kein Abtippen mehr nötig.
Ein zweiter, unabhängiger 2D-Code für eigene Zwecke — Belegverfolgung, Dokumentenmanagement oder ein Verweis Ihrer Wahl. Inhalt frei bestimmbar.
Keine komplexe Einrichtung. Kein neues System lernen. Einfach API-Key holen und loslegen.
Unter Lizenz → API finden Sie Ihren persönlichen API-Key. Kein Antrag, keine Wartezeit.
Rechnungsnummer, Käufer, Positionen, Summen — einfach als JSON-Objekt an unsere API senden.
Die API antwortet mit einer vollständigen, validierten PDF- oder XML-Rechnung — bereit zum Versand.
$ch = curl_init('https://hyptime.com/api/v1/invoices.php?format=zugferd&output=json'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'X-API-Key: IHR_API_KEY' ]); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ 'core_data' => [ 'document' => ['invoice_number' => 'RE-2026-0042', 'issue_date' => '2026-05-17', 'currency' => 'EUR'], 'seller' => ['name' => 'Muster GmbH', 'iban' => 'DE89370400440532013000', /* ... */], 'buyer' => ['name' => 'Kunde AG', /* ... */], 'items' => [['position_nr' => 1, 'title' => 'Software-Lizenz', 'quantity' => 1, 'unit_price' => 499.00, 'total_net' => 499.00]], 'totals' => ['total_net' => 499.00, 'tax_amount' => 94.81, 'total_gross' => 593.81] ] ])); $response = json_decode(curl_exec($ch), true); $pdfData = base64_decode($response['file_data']); // ← fertige PDF-Bytes
Von SEPA-Überweisung bis PayPal-Link — jede Zahlungsart erzeugt das korrekte XML mit allen Pflichtfeldern.
Allgemeiner Fallback ohne IBAN
B2B / B2CSchweiz, UK, USA — mit IBAN + BIC
B2B InternationalStripe SEPA mit Mandatsreferenz
B2B / B2CKarteninhaber + letzte 4 Stellen
B2CFür Abonnements und SaaS
B2B AbosStandard-Zahlung mit IBAN
B2B StandardPayPal, Stripe-Link, Online-Pay
B2C OnlineVerrechnung und Gutschriften
B2B / B2C58) kann zusätzlich ein GiroCode gedruckt werden, den Ihre Kunden mit der Banking-App scannen — IBAN und Betrag werden automatisch übernommen. Alle Details im Tab „Scan-Codes" weiter unten.Alle generierten Rechnungen bestehen sämtliche Prüfebenen des KoSIT-Validators (XRechnung 3.0) und des Mustang-Validators (ZUGFeRD 2.3) ohne Fehler.
Europäische Kernrechnungs-Norm — Basis für alle E-Rechnungsstandards in der EU
Pflichtformat für Rechnungen an deutsche Bundesbehörden
Hybrides Format: sichtbares PDF + maschinenlesbares XML in einer Datei
Internationales Netzwerk für elektronischen Rechnungsaustausch in Europa
Archivierungsfähiges PDF-Format nach ISO-Standard — revisionssicher
Alle umsatzsteuerrechtlich relevanten Pflichtangaben nach deutschem Steuerrecht
Alles was Sie brauchen, um in wenigen Minuten live zu gehen.
Hier sind die minimalen Pflichtfelder für eine gültige Rechnung. Für Produktivrechnungen sollten Sie das vollständige Payload-Modell nutzen.
{
"core_data": {
"document": {
"invoice_number": "RE-2026-0001",
"issue_date": "2026-05-17",
"currency": "EUR"
},
"tax": { "rate": 19 },
"seller": {
"name": "Muster GmbH", "street": "Musterstr. 1",
"zip": "12345", "city": "Berlin",
"country": "DE", "email": "info@muster.de"
},
"buyer": {
"name": "Kunde AG", "street": "Kundenstr. 5",
"zip": "10115", "city": "Berlin",
"country": "Deutschland"
},
"items": [{
"position_nr": 1, "title": "Beratungsleistung",
"quantity": 1, "unit_price": 1000.00, "total_net": 1000.00
}],
"totals": {
"total_net": 1000.00, "tax_amount": 190.00, "total_gross": 1190.00
}
}
}
| Parameter | Werte | Standard | Beschreibung |
|---|---|---|---|
format optional | zugferd | xrechnung | zugferddual | pdf | zugferd | Ausgabeformat des Dokuments |
output optional | binary | json | binary | binary: Direkter Datei-Download. json: Base64-Antwort für API-zu-API-Integration. |
| format | MIME-Type | Enthält XML? | Ideal für |
|---|---|---|---|
zugferd | application/pdf | ✅ Eingebettet (PDF/A-3) | Standard-Rechnungsversand |
xrechnung | application/xml | ✅ Ist XML | Behörden, Peppol-Netzwerk |
zugferddual | application/zip | ✅ Separat im ZIP | Buchhaltungssoftware + Archiv |
pdf | application/pdf | ❌ Nein | Angebote, Lieferscheine |
| Feld | Typ | Status | Beschreibung |
|---|---|---|---|
invoice_number | string | Pflicht | Eindeutige Rechnungsnummer. Bsp: RE-2026-0042 |
issue_date | string | Pflicht | Rechnungsdatum: YYYY-MM-DD |
currency | string | Pflicht | ISO 4217: EUR, CHF, USD |
due_date | string | Optional | Fälligkeitsdatum. Standard: +14 Tage |
delivery_date | string | Optional | Lieferdatum. Standard: = issue_date |
custom_filename | string | Optional | Dateiname ohne Endung. Standard: invoice_{nummer} |
payment_type_code | int | Optional | Zahlungsart-Code. Standard: 58 (SEPA) |
| Feld | Status | Beschreibung |
|---|---|---|
name, street, zip, city, country, email | Pflicht | Vollständige Adresse des Rechnungsstellers |
vat_id | Optional | USt-IdNr. Bsp: DE123456789 |
iban | Bedingt | IBAN des Verkäufers. Erforderlich bei TypeCode 57, 58. |
bic | Optional | BIC — wird bei TypeCode 42 ins XML geschrieben |
| Feld | Status | Beschreibung |
|---|---|---|
name, street, zip, city, country | Pflicht | Vollständige Adresse des Käufers |
country_iso | Optional | ISO Alpha-2 Code. Standard: DE. Wichtig für Steuerlogik. |
customer_id | Optional | Käuferreferenz. Standard: CUST-{id} |
| Feld | Status | Beschreibung |
|---|---|---|
position_nr, title, quantity | Pflicht | Positionsnummer, Titel, Menge |
unit_price | Pflicht | Einzelpreis netto. Negativ für Rabatte: -50.00 |
total_net | Pflicht | Gesamtbetrag der Position — immer positiv, auch bei Rabatten |
description | Optional | Ausführliche Beschreibung unter dem Titel |
total_gross muss exakt total_net + tax_amount sein. Abweichungen führen zu Validator-Warnungen.| Feld | Status | Beschreibung |
|---|---|---|
total_net | Pflicht | Nettosumme aller Positionen inkl. Rabatte |
tax_amount | Pflicht | Steuergesamtbetrag |
total_gross | Pflicht | Bruttosumme = total_net + tax_amount |
Für komplexe Rechnungen mit globalen Rabatten, Versandkosten und Skonto-Bedingungen nutzen Sie diese Felder im document und totals Objekt:
| Feld | Typ | Beschreibung |
|---|---|---|
document.payment_terms | string | Freitext für Skonto-Bedingungen (z.B. "2% Skonto innerhalb 3 Tagen"). Wird maschinenlesbar in die XML-PaymentTerms geschrieben. |
totals.allowances | array | Globale Rabatte. Array aus: amount (Betrag), reason, tax_rate und tax_category. |
totals.charges | array | Globale Zuschläge (z. B. Versand). Gleicher Aufbau wie allowances. |
totals.tax_breakdown | array | Pflicht bei Rechnungen mit mehreren Steuersätzen (z. B. 19% & 7%). Enthält pro Steuersatz: rate, category, net_amount und tax_amount. |
Über document.payment_type_code steuern Sie welche XML-Elemente die API generiert. Standard ist 58 (SEPA-Überweisung).
| Code | Zahlungsart | Pflichtfelder | Bereich |
|---|---|---|---|
30 | Banküberweisung (Fallback) | — | B2B / B2C |
42 | Non-SEPA (CH, UK, USA) | seller.iban + seller.bic | B2B International |
49 | SEPA-Lastschrift (Stripe) | doc.sepa_mandate_id empfohlen | B2B / B2C |
54 | Kreditkarte | doc.payment_card_pan | B2C |
57 | Dauerauftrag / Standing Order | seller.iban | B2B Abos |
58 | SEPA-Überweisung | seller.iban | B2B Standard |
59 | Zahlungslink / PayPal | doc.payment_url empfohlen | B2C Online |
97 | Aufrechnung / Verrechnung | — | Gutschriften |
sepa_mandate_id erscheint lesbar im XML Information-Feld.Fügt einen scanbaren QR-Code nach EPC069-12-Standard (GiroCode) hinzu. Banking-Apps im SEPA-Raum lesen daraus automatisch IBAN, Empfänger, Betrag und Verwendungszweck aus. Der Block steht als eigenes Top-Level-Feld neben core_data.
| Feld | Typ | Status | Beschreibung |
|---|---|---|---|
enabled | boolean | Pflicht | Schaltet den Code frei. Standard ohne Angabe: false |
iban, bic, recipient_name, amount, reference | string / number | Optional | null oder weggelassen = automatisch aus seller.iban, seller.bic, seller.name, totals.total_gross, document.invoice_number |
label | string | Optional | Text direkt unter dem Code. null/weggelassen = kein Text |
position | object | Optional | {x, y, size} in mm — jedes Feld einzeln überschreibbar, siehe unten |
type | string | Optional | "epc" (Standard, GiroCode) oder "url" für einen beliebigen Bezahl-Link |
url | string | Bedingt | Nur bei type: "url": kompletter Link (z.B. PayPal.me, Stripe-/Mollie-Payment-Link), wird 1:1 als QR-Code codiert |
Ohne position wird der Code automatisch direkt unter dem Rechnungstext platziert — ohne zusätzlichen Seitenumbruch. Sobald mindestens ein Feld (x, y oder size) gesetzt ist, gilt das als bewusste Positionierung: der Code wird dann auf Seite 1 an exakt dieser Stelle gedruckt, fehlende Einzelfelder werden automatisch ergänzt.
// Minimalbeispiel — alles automatisch aus den Rechnungsdaten "payment_qr": { "enabled": true } // Mit eigenem Label und fester X-Position (Y bleibt automatisch) "payment_qr": { "enabled": true, "label": "Scan to Pay", "position": { "x": 140, "size": 18 } } // Alternative: eigener Bezahl-Link statt GiroCode "payment_qr": { "enabled": true, "type": "url", "url": "https://paypal.me/ihrunternehmen/1273.30", "label": "Mit PayPal bezahlen" }
Ein zweiter, unabhängiger 2D-Code für eigene Zwecke — z.B. interne Belegnummern, ein Link oder eine Referenz für Ihr Dokumentenmanagement. Anders als beim GiroCode gibt es hier keinen festen Inhalts-Standard: Sie codieren exakt den String aus content, 1:1.
| Feld | Typ | Status | Beschreibung |
|---|---|---|---|
enabled | boolean | Pflicht | Schaltet den Code frei. Standard: false |
content | string | Pflicht | Beliebiger Text/Link/Referenz. Leer = Code wird weggelassen |
position | object | Optional | Wie bei payment_qr. Automatischer Default: schmaler linker Rand, vertikal mittig |
data_matrix-Feld erzeugt einen technisch korrekten, aber inhaltlich frei belegbaren Data-Matrix-Code — keinen gültigen Post-Freimachungsvermerk. Benötigen Sie DV-Freimachung für Ihren Versand? Sprechen Sie unser Entwicklungsteam an — wir prüfen gerne gemeinsam, ob sich eine Post-Zertifizierung für Ihren Anwendungsfall lohnt.Die Steuerkategorie wird automatisch aus tax.rate, tax.is_small_business, tax.is_reverse_charge sowie den Länder-Codes abgeleitet. Manuelles Setzen ist nicht nötig.
| Kategorie | Code | Wann aktiv | Freistellungstext |
|---|---|---|---|
| Standard-MwSt | S | tax.rate > 0, kein Sonderfall | — |
| Steuerbefreit | E | is_small_business = true oder steuerfreies Inlandsgeschäft | Fallback: "Gemäß § 19 UStG..." |
| Reverse Charge | AE | is_reverse_charge = true | Fallback: "§ 13b UStG..." |
| Export / Drittland | G | rate = 0, Käufer-Land ≠ Verkäufer-Land (z.B. CH, UK, USA) | Fallback: "Tax-free export..." |
// Standard 19% Deutschland "tax": { "rate": 19 } // Kleinunternehmer (§ 19 UStG) "tax": { "rate": 0, "is_small_business": true } // EU Reverse Charge B2B "tax": { "rate": 0, "is_reverse_charge": true } // Export Schweiz (automatisch erkannt über buyer.country_iso = "CH") "tax": { "rate": 0 } // → Kategorie G wird automatisch gesetzt // Schweizer MwSt 8.1% "tax": { "rate": 8.1 }, "currency": "CHF"
Direkter Datei-Download. Kein JSON-Wrapper. Ideal für Browser-Downloads.
// HTTP Response Headers
Content-Type: application/pdf
Content-Disposition: attachment; filename="invoice_RE-2026-0042.pdf"
Base64-kodierte Datei als JSON. Ideal für API-zu-API-Integrationen und serverseitige Verarbeitung.
// Erfolg (format=zugferd) { "status": "success", "filename": "invoice_RE-2026-0042.pdf", "mime_type": "application/pdf", "file_data": "JVBERi0xLjMK..." // Base64-PDF } // format=zugferddual → zusätzlich xml_data { "status": "success", "file_data": "JVBERi0x...", // PDF "xml_data": "PD94bWwg..." // XML separat } // Mit optionaler Warnung (kein Fehler, Rechnung wurde generiert) { "status": "success", "file_data": "...", "payment_warnings": ["SEPA (TypeCode 49): Mandatsreferenz fehlt..."] }
Alle Fehler werden als JSON mit HTTP-Statuscode zurückgegeben.
{ "status": "error", "message": "Fehlerbeschreibung" }
| HTTP-Code | Bedeutung | Typische Ursache |
|---|---|---|
200 | ✅ Erfolg | Datei wurde erfolgreich generiert |
400 | ❌ Ungültige Anfrage | Ungültiges JSON, unbekannter format-Parameter |
401 | 🔒 Nicht autorisiert | API-Key fehlt oder ungültig |
422 | ⚠ Validierungsfehler | Pflichtfelder fehlen (invoice_number, seller.name, etc.) |
500 | 💥 Serverfehler | Interner Fehler beim Aufbau des Dokuments |
sepa_mandate_id fehlen, wird die Rechnung trotzdem generiert. Die Warnung erscheint im Response als payment_warnings-Array — kein Abbruch.zugferd) ist ein hybrides Format — ein normales PDF mit einem unsichtbar eingebetteten XML. Der Empfänger kann es lesen wie eine normale Rechnung, und seine Buchhaltungssoftware kann das XML automatisch einlesen. XRechnung (xrechnung) ist ein reines XML ohne PDF-Teil und Pflichtformat für Rechnungen an deutsche Bundesbehörden gemäß E-Rechnungsverordnung. Für normale B2B-Rechnungen empfehlen wir ZUGFeRD.tax.rate = 0 und tax.is_small_business = true. Die API setzt automatisch die Steuerkategorie E (Exempt) und fügt den gesetzlich erforderlichen Freistellungshinweis "Gemäß § 19 UStG wird keine Umsatzsteuer berechnet." ins XML ein. Sie können den Text mit tax.note_reverse_charge überschreiben.buyer.country_iso = "CH" und tax.rate = 0. Die API erkennt automatisch, dass es sich um einen steuerfreien Export ins Drittland handelt, setzt die Steuerkategorie G und schreibt den Exporthinweis ins XML. Für internationale Zahlungen empfehlen wir TypeCode 42 mit IBAN und BIC.payment_type_code: 49 und sepa_mandate_id: "mandate_xxx" (die Stripe Mandate-ID aus dem PaymentIntent). Die API baut die Mandatsreferenz automatisch in das XML ein. Für die Kreditkarte nutzen Sie TypeCode 54 und übergeben die letzten 4 Stellen als payment_card_pan.document.payment_terms für das XML und im Feld visual_layout.texts.closing für den Andruck auf dem PDF. Die Rechnungssumme bleibt dadurch normgerecht unangetastet.-100.00). Unsere API nutzt den hochkompatiblen Handelsrechnungs-Code 380 (Negativrechnung). Sie müssen keine Vorzeichen-Mathematik im XML beachten — die API verhindert automatisch, dass durch Doppel-Minus-Fehler der Validator abbricht.payment_qr.enabled = true — IBAN, Empfänger und Betrag werden automatisch aus Ihren Rechnungsdaten übernommen, kein weiteres Feld nötig. Der Code folgt dem EPC069-12-Standard (GiroCode) und funktioniert mit SEPA-fähigen Banking-Apps. Für Zahlungswege außerhalb von SEPA (PayPal, Stripe-Link etc.) nutzen Sie type: "url" mit Ihrem eigenen Bezahl-Link. Details im Tab „Scan-Codes" der Dokumentation.Sie haben noch Fragen zur Integration, zu Sonderfällen oder zum passenden Paket? Unser Team berät Sie gerne persönlich unverbindlich und kostenfrei.