API documentation

Eunormia.Sdk — the offline .NET library

The same engine as the online API, embedded in your application: create, read and validate e-invoices — completely offline. The engine and a trimmed runtime are bundled inside the NuGet package; your invoice data never leaves your premises.

Availability: the package is available on nuget.org and fully usable without a licence (sample watermark). Terms for the licence that removes the watermark are on the pricing page (free until the end of 2026); pilot partners get discounted terms.

Installation & requirements

Installationdotnet add package Eunormia.Sdkon nuget.org
Frameworksnet8.0 and netstandard2.0 (thus also .NET Framework 4.6.1+)
Platformswin-x64 (more to follow)
Dependenciesnone — no Java, no Docker, no network access
Package size~130 MB per platform (engine, fonts, ICC profiles, rulesets incl. KoSIT & FR-CTC)

The three classes

EunormiaConvertercreate: JSON (+ optional PDF) → validated ZUGFeRD/Factur-X. Same gates as online; optionally a signed conformance certificate (EmitCertificate).
EunormiaReaderreceive: PDF → full invoice JSON (same schema as for creation) + raw CII XML.
EunormiaValidatorreceive: PDF → gate results (veraPDF, EN 16931, optionally KositValidation/FrCtcValidation).

Performance

UseDaemon = true keeps the engine as a warm process: first call ~3–4 s (cold start), then ~250 ms per conversion, reading ~30 ms. Recommended for anything beyond a single call per process lifetime.

Licensing

Without a licence the SDK is fully functional — results carry a sample watermark. A valid licence (account → POST /v1/license/offline, then set as LicenseKey or ENV EUNORMIA_LICENSE) removes the watermark.

Version binding, not expiry. A licence covers all eunormia versions up to its issue date and keeps working at your customers — permanently and offline, even after the term ends. A newer eunormia version (e.g. when e-invoicing rules change) needs a fresh, valid licence.

Verification is offline (Ed25519 signature) — no phone-home, no telemetry.

Error handling

Business and technical errors come as EunormiaException with Status (422 for business errors), Stage and localized Details — the same human-readable messages as the online API.

FAQ

Does it need Java installed?No — the runtime is bundled inside the package and invisible to you.
Does the SDK phone home?No. No telemetry, no online licence checks.
What happens when the term ends?Shipped software keeps working unchanged; only moving to a newer eunormia version needs a fresh, valid licence.
Why is it so large?The package contains the full validation substance: fonts, colour profiles, EN 16931/KoSIT/FR-CTC rulesets and the engine. That is exactly what saves you any infrastructure.

Code

// Erzeugen / create
var converter = new EunormiaConverter(new EunormiaOptions {
    LicenseKey = Environment.GetEnvironmentVariable("EUNORMIA_LICENSE"),
    Profile    = ZugferdProfile.EN16931,
    UseDaemon  = true
});
EunormiaResult r = await converter.ConvertAsync(invoiceJson, pdfBytes);
File.WriteAllBytes(r.FileName, r.Pdf);

// Empfangen: lesen / receive: read
ReadResult data = await new EunormiaReader().ReadAsync(incomingPdf);
Console.WriteLine(data.Header?.Number);        // Kurzform / header
var fullJson = data.Invoice;                   // volles InvoiceRequest-JSON

// Empfangen: validieren / receive: validate
var v = await new EunormiaValidator(new EunormiaOptions {
    KositValidation = true, FrCtcValidation = true
}).ValidateAsync(incomingPdf);
Console.WriteLine($"{v.Valid} {v.VeraPdf.Passed} {v.En16931.Passed} {v.Kosit?.Passed}");