API documentation

Eunormia.Sdk — the offline .NET library Beta

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.

Beta: the package is not yet published on nuget.org — access via the pilot programme.

Installation & requirements

Installationdotnet add package Eunormia.Sdk
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. Two types:

devshort-lived (default 45 days), for development/CI; renewed while your subscription is active.
runtimelong-lived, embedded in the software you ship. Keeps working at your customers — even after cancellation. New eunormia versions require an active subscription (version binding).

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 if I cancel?Shipped software with a runtime licence keeps working unchanged; only new versions and dev builds require an active subscription.
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}");