Skip to content
fiskaly KassenSichV client for .NET Core -
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
FiskalyClient fix: consistently use async await and configureawait Sep 27, 2019
FiskalyClientTest fix: consistently use async await and configureawait Sep 27, 2019
FiskalySma @ df840a0 Initial import Sep 17, 2019
.gitignore Initial import Sep 17, 2019
.gitmodules Initial import Sep 17, 2019

fiskaly KassenSichV client for .NET Core

The fiskaly KassenSichV client is an HTTP client that is needed1 for accessing the API that implements a cloud-based, virtual CTSS (Certified Technical Security System) / TSE (Technische Sicherheitseinrichtung) as defined by the German KassenSichV (Kassen­sich­er­ungsver­ord­nung).

Conceptually this client is a thin (convenience) wrapper above the System.Net.Http.HttpClient for .NET Core. This means you will have to look up the API documentation of System.Net.Http.HttpClient to learn how this client is used. From a developer's point of view, the only difference is that you have to use the Fiskaly.Client.ClientFactory class for the instantiation of a new HttpClient.


  • Automatic authentication handling (fetch/refresh JWT and re-authenticate upon 401 errors).
  • Automatic retries on failures (server errors or network timeouts/issues).
  • Automatic JSON parsing and serialization of request and response bodies.
  • Future: [1] compliance regarding BSI CC-PP-0105-2019 which mandates a locally executed SMA component for creating signed log messages.
  • Future: Automatic offline-handling (collection and documentation according to Anwendungserlass zu § 146a AO)


First of all, you have to initialize the required git submodule(s) using:

$ git submodule update

Then you can build FiskalyClient using:

$ dotnet build

The test suite in FiskalyClientTest is run using:

$ dotnet test


using System;
using System.Net.Http;
using Fiskaly.Client;
using Serilog;
using System.Text;
using System.Threading.Tasks;

namespace Fiskaly.Client
    class Demo
        static String ApiKey = Environment.GetEnvironmentVariable("API_KEY"); // create your own API key and secret at
        static String ApiSecret = Environment.GetEnvironmentVariable("API_SECRET");
        static HttpClient client;

        public static StringContent Content(string payload)
            return new StringContent(payload, Encoding.UTF8, "application/json");

        public static async Task<String> CreateTss()
            Log.Information("creating tss...");
            var tssGuid = Guid.NewGuid().ToString();
            var url = $"tss/{tssGuid}";
            var payload = $"{{\"description\": \"{tssGuid}\", \"state\": \"INITIALIZED\"}}";

            HttpResponseMessage response = await client
              .PutAsync(url, Content(payload))

            String content = await response.Content

            return content;

        public static async Task<String> ListTss()
            Log.Information("listing tss...");
            HttpResponseMessage response = await client

            String content = await response.Content

            return content;

        static async Task Main(string[] args)
            Log.Logger = new LoggerConfiguration()

            client = await ClientFactory.Create(ApiKey, ApiSecret).ConfigureAwait(false);
            var createTssResponse = await CreateTss().ConfigureAwait(false);
            var listTssResponse = await ListTss().ConfigureAwait(false);
            Log.Information("createTssResponse: {Response}", createTssResponse);
            Log.Information("listTssResponse: {Response}", listTssResponse);


You can’t perform that action at this time.