Skip to main content
This guide walks the v1 integration contract for Austria. You create an aut API key, onboard a merchant with an Austrian fiscal_identity, register a location and terminal, fiscalize the register under RKSV, open a register session, start an operation, and complete it with the typed payment contract.
Examples use https://sandbox.api.openfiskal.com/v1. Replace with https://api.openfiskal.com/v1 when you go live.
Register fiscalization on the public API today is only supported for DE / KassenSichV. Calling POST /registers/{id}/fiscalize on an Austrian location currently returns 422 validation_error. Austrian RKSV fiscalization is rolling out — contact support@openfiskal.com for current AT enablement status before scheduling go-live. The merchant, location, and register data shapes shown here are stable and safe to integrate against now; the fiscalize step and the RKSV fiscal_information payload are the parts that activate when AT is enabled for your tenant.

Prerequisites

  • An OpenFiskal tenant
  • A tenant-scoped, country-scoped API key (of_test_aut_… or of_live_aut_…)
  • curl or an HTTP client
  • A backend service / database to store your API key, entity IDs and ETags

Authentication model

Use the standard bearer header on every request. The key encodes the environment and country — of_test_aut_… for the Austrian sandbox, of_live_aut_… for Austrian production. An aut key rejects payloads for any other country.
Every merchant-scoped request must also include:
This header value is the merchant ID returned by POST /merchants, not your API key.

Create resources

Create these resources in order. The register cannot fiscalize until the merchant has an AUT fiscal_identity.
1

Create your API key

Generate an aut key at console.openfiskal.com. Store it in your secrets manager. Format: of_{env}_aut_{random}, e.g. of_test_aut_abcdefgh12345678.
2

Create a merchant

country_code and every address.country_code must be AUT (ISO 3166-1 alpha-3). The Austrian fiscal_identity requires legal_entity_id_type (one of VAT_ID, TAX_ID, GLN). Provide the corresponding identifier — vat_id (UID, e.g. ATU12345678), tax_number (Steuernummer), or gln (13-digit Global Location Number).
The returned id becomes the X-OpenFiskal-Merchant header on every merchant-scoped request that follows.
3

Create a location

A location is a physical point of sale. timezone is a required IANA zone string.
4

Create a register

A register is the logical checkout (Registrierkasse) that creates operations.
5

Fiscalize the register (rolling out)

Once enabled for AT, POST /registers/{id}/fiscalize provisions the RKSV components — the SCU and Registrierkasse — using the merchant’s AUT fiscal_identity and the location’s country. The response is 202 Accepted; poll GET /registers/{id} until fiscalization_status is "fiscalized" (the timestamp is fiscalization.fiscalized_at). Until AT is enabled for your tenant this call returns 422 validation_error.
6

Verify your saved IDs

Persist the returned merchant, location, and register IDs. You will use them for every later operation request.

Perform a fiscalized sale

Once your register is fiscalized, you can create and complete sale operations. The request body is identical to other countries; the response’s fiscal_information carries the RKSV-specific shape.
1

Open a session

Every POS sale, return, or exchange must bind to an open register session. Send a session_open operation with the register, currency, and counted opening cash float. Without an open session, POST /operations with source: POS is rejected.
Persist the returned session_id. See Sessions for cash adjustments, end-of-shift counting, and closing.
2

Start an operation

POST /operations is a single-shot create. All monetary fields are decimal strings, not integers. pretax_amount + tax_amount + tip_amount must equal total_amount. line_items is required with at least one entry.
Always send line_items[].taxes[].
3

Complete the operation

Completion includes typed payment legs. Use one entry per tender leg and include processor references where available. Send the latest ETag in If-Match. The completed operation returns fiscal_information with the RKSV regime.
Response:

Void an open operation

If the sale is abandoned before completion, void the open operation:

Next steps