API-Dokumentation

Ein Endpunkt genügt: POST /v1/convert (multipart/form-data). Rein: Rechnungsdaten (JSON oder CII-XML) und optional ein PDF. Raus: ein validiertes ZUGFeRD-/Factur-X-PDF/A-3 samt Prüfbericht.

Authentifizierung. API-Token als Authorization: Bearer eun_live_…. Ohne gültigen Token läuft der Request anonym — das Ergebnis trägt dann ein Wasserzeichen. Tokens erstellen Sie im Dashboard.

Maschinenlesbare Spezifikation: /openapi.json (OpenAPI 3, z. B. im Swagger-Editor prüfbar).

POST /v1/convert

FeldTypBeschreibung
invoiceJSONRechnungsdaten (Schema unten). Pflicht, außer beim XML-Passthrough.
xmlDatei/TextFertiges CII-XML — 1:1 eingebettet. In diesem Modus ist pdf Pflicht.
pdfDateiSichtkomponente (≤10 MB, ≤20 Seiten). Ohne Upload: Standardvorlage.
optionsJSON {"profile":"EN16931|EXTENDED|XRECHNUNG|…","includeUbl":true}

Antwort 200: { pdf (base64), filename, ubl?, report }. Fehler: { error, stage, details[] } (422/429).

Quickstarts

Ersetzen Sie eun_live_IHR_TOKEN durch Ihren Token.

cURL — JSON → ZUGFeRD

curl -X POST https://IHR_HOST/v1/convert \
  -H "Authorization: Bearer eun_live_IHR_TOKEN" \
  -F 'invoice={"number":"RE-2026-0042","issueDate":"2026-07-08","dueDate":"2026-08-07","currency":"EUR","seller":{"name":"Muster GmbH","street":"Musterstraße 1","zip":"4020","city":"Linz","country":"AT","vatId":"ATU12345678"},"buyer":{"name":"Beispiel GmbH","street":"Beispielweg 2","zip":"80331","city":"München","country":"DE","vatId":"DE123456789"},"items":[{"name":"Leistung","quantity":1,"unit":"C62","unitPrice":100.0,"vatPercent":20}]}'

cURL — JSON + PDF → ZUGFeRD

curl -X POST https://IHR_HOST/v1/convert \
  -H "Authorization: Bearer eun_live_IHR_TOKEN" \
  -F 'invoice=@rechnung.json;type=application/json' \
  -F 'pdf=@rechnung.pdf;type=application/pdf'

cURL — XML-Passthrough

curl -X POST https://IHR_HOST/v1/convert \
  -H "Authorization: Bearer eun_live_IHR_TOKEN" \
  -F 'xml=@factur-x.xml;type=application/xml' \
  -F 'pdf=@rechnung.pdf;type=application/pdf'

Python (requests) — JSON → ZUGFeRD

import requests, json, base64

invoice = {
  "number": "RE-2026-0042", "issueDate": "2026-07-08", "dueDate": "2026-08-07",
  "currency": "EUR",
  "seller": {"name": "Muster GmbH", "street": "Musterstraße 1", "zip": "4020",
             "city": "Linz", "country": "AT", "vatId": "ATU12345678"},
  "buyer":  {"name": "Beispiel GmbH", "street": "Beispielweg 2", "zip": "80331",
             "city": "München", "country": "DE", "vatId": "DE123456789"},
  "items": [{"name": "Leistung", "quantity": 1, "unit": "C62",
             "unitPrice": 100.0, "vatPercent": 20}]
}
r = requests.post("https://IHR_HOST/v1/convert",
    headers={"Authorization": "Bearer eun_live_IHR_TOKEN"},
    files={"invoice": (None, json.dumps(invoice))})
r.raise_for_status()
data = r.json()
open(data["filename"], "wb").write(base64.b64decode(data["pdf"]))
print("Gate:", data["report"]["verapdf"]["result"], data["report"]["xml"]["result"])

PHP (cURL) — JSON → ZUGFeRD

<?php
$invoice = json_encode([
  "number" => "RE-2026-0042", "issueDate" => "2026-07-08", "dueDate" => "2026-08-07",
  "currency" => "EUR",
  "seller" => ["name"=>"Muster GmbH","street"=>"Musterstraße 1","zip"=>"4020",
               "city"=>"Linz","country"=>"AT","vatId"=>"ATU12345678"],
  "buyer"  => ["name"=>"Beispiel GmbH","street"=>"Beispielweg 2","zip"=>"80331",
               "city"=>"München","country"=>"DE","vatId"=>"DE123456789"],
  "items"  => [["name"=>"Leistung","quantity"=>1,"unit"=>"C62",
                "unitPrice"=>100.0,"vatPercent"=>20]]
]);
$ch = curl_init("https://IHR_HOST/v1/convert");
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: Bearer eun_live_IHR_TOKEN"],
  CURLOPT_POSTFIELDS => ["invoice" => $invoice],
]);
$resp = json_decode(curl_exec($ch), true);
file_put_contents($resp["filename"], base64_decode($resp["pdf"]));

C# (HttpClient) — JSON → ZUGFeRD

using System.Net.Http;
using System.Text.Json;

var invoice = @"{""number"":""RE-2026-0042"",""issueDate"":""2026-07-08"",
  ""dueDate"":""2026-08-07"",""currency"":""EUR"",
  ""seller"":{""name"":""Muster GmbH"",""street"":""Musterstraße 1"",""zip"":""4020"",
    ""city"":""Linz"",""country"":""AT"",""vatId"":""ATU12345678""},
  ""buyer"":{""name"":""Beispiel GmbH"",""street"":""Beispielweg 2"",""zip"":""80331"",
    ""city"":""München"",""country"":""DE"",""vatId"":""DE123456789""},
  ""items"":[{""name"":""Leistung"",""quantity"":1,""unit"":""C62"",
    ""unitPrice"":100.0,""vatPercent"":20}]}";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer eun_live_IHR_TOKEN");
var form = new MultipartFormDataContent { { new StringContent(invoice), "invoice" } };
var resp = await client.PostAsync("https://IHR_HOST/v1/convert", form);
var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdf = Convert.FromBase64String(doc.RootElement.GetProperty("pdf").GetString());
File.WriteAllBytes(doc.RootElement.GetProperty("filename").GetString(), pdf);

Node.js (fetch) — JSON → ZUGFeRD

import { writeFileSync } from "node:fs";

const invoice = {
  number: "RE-2026-0042", issueDate: "2026-07-08", dueDate: "2026-08-07",
  currency: "EUR",
  seller: { name: "Muster GmbH", street: "Musterstraße 1", zip: "4020",
            city: "Linz", country: "AT", vatId: "ATU12345678" },
  buyer:  { name: "Beispiel GmbH", street: "Beispielweg 2", zip: "80331",
            city: "München", country: "DE", vatId: "DE123456789" },
  items: [{ name: "Leistung", quantity: 1, unit: "C62", unitPrice: 100.0, vatPercent: 20 }]
};
const form = new FormData();
form.append("invoice", JSON.stringify(invoice));
const r = await fetch("https://IHR_HOST/v1/convert", {
  method: "POST",
  headers: { Authorization: "Bearer eun_live_IHR_TOKEN" },
  body: form
});
const data = await r.json();
writeFileSync(data.filename, Buffer.from(data.pdf, "base64"));

Rechnungs-JSON (Kernfelder)

{
  "number": "RE-2026-0042",
  "issueDate": "2026-07-08",
  "dueDate": "2026-08-07",
  "currency": "EUR",
  "seller": { "name": "Muster GmbH", "street": "Musterstraße 1", "zip": "4020",
              "city": "Linz", "country": "AT", "vatId": "ATU12345678",
              "iban": "AT611904300234573201" },
  "buyer":  { "name": "Beispiel GmbH", "street": "Beispielweg 2", "zip": "80331",
              "city": "München", "country": "DE", "vatId": "DE123456789" },
  "items": [ { "name": "Softwareentwicklung", "quantity": 16, "unit": "HUR",
               "unitPrice": 120.0, "vatPercent": 20 } ]
}

Vollständiges Schema (Steuerkategorien, Nachlässe/Zuschläge, Referenzen, Anhänge u. v. m.) siehe service/README.md.