Skip to main content
OpenFiskal’s v1 integration contract is shared across countries, but the fiscal regime, merchant identity shape, and signed receipt fields differ. Pick your country to follow the correct flow.

🇩🇪 Germany

KassenSichV: Sign transactions and get a QR code with the signature.

🇦🇹 Austria

RKSV: Sign transactions and get a QR code with the signature.

🇮🇹 Italy

Registratore Telematico: Transmit transactions to AdE and get DCW numbers.
All three guides use https://sandbox.api.openfiskal.com/v1. Replace with https://api.openfiskal.com/v1 when you go live.
Generate API keys at console.openfiskal.com. Each key is tenant- and country-scoped — see Authentication for details.

Live OpenAPI spec

The current production spec is served at https://api.openfiskal.com/openapi-json (sandbox: https://sandbox.api.openfiskal.com/openapi-json). Import it into Postman, Insomnia, or an OpenAPI code generator to scaffold a client in minutes.The OpenAPI spec always matches the live API implementation.

Scope

OpenFiskal is a server-to-server fiscalization API. Your backend calls the API on behalf of your POS devices. There’s no direct device-to-API path today. The current public scope covers Germany, Austria, and Italy.

What’s the same across countries

These mechanics are identical regardless of the country guide you follow:
  • API key formatof_{env}_{country}_{random}, one key per country + environment.
  • Request shape — bearer auth on every request, X-OpenFiskal-Merchant on every merchant-scoped request, ETag + If-Match on mutating calls.
  • Resource ordering — merchant → location → register → fiscalize → session → operation → complete.
  • POS sessions — every sale, return, and exchange on a POS register must bind to an open session. See Sessions.
  • IdempotencyIdempotency-Key on POST /operations and POST /operations/{id}/complete|void.
  • Money fields — decimal strings, not integers. pretax_amount + tax_amount + tip_amount = total_amount.

What’s different per country

🇩🇪 Germany🇦🇹 Austria🇮🇹 Italy
RegimeKassenSichVRKSVRT
country_codeDEUAUTITA
Fiscal identity required fieldstax_number (Steuernummer), vat_id (USt-IdNr)legal_entity_id_type (VAT_ID | TAX_ID | GLN); gln (13 digits) when the type is GLN. vat_id and tax_number are optional.legal_entity_type (COMPANY | INDIVIDUAL), tax_number (Codice Fiscale: 11 digits or 16 alphanumeric), vat_number (Partita IVA: 11 digits), fisconline_user (16 alphanumeric), fisconline_password, fisconline_pin
Receipt obligationRender all fiscal fields exactlyPreserve fiscal values + local formatRender the DCW number
The format constraints in the table are enforced by the API. See the country-specific guides for full payload examples.
This matrix is a product scope guide, not legal advice. Your implementation owner should review the regime-specific onboarding checklist before go-live.

Next steps