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.Prerequisites
- An OpenFiskal tenant
- A tenant-scoped, country-scoped API key (
of_test_aut_…orof_live_aut_…) curlor 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.
POST /merchants, not your API key.
Create resources
Create these resources in order. The register cannot fiscalize until the merchant has anAUT 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).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’sfiscal_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 Persist the returned
session_open operation with the register, currency, and counted opening cash float. Without an open session, POST /operations with source: POS is rejected.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.3
Complete the operation
Completion includes typed payment legs. Use one entry per tender leg and include processor references where available. Send the latest Response:
ETag in If-Match. The completed operation returns fiscal_information with the RKSV regime.Void an open operation
If the sale is abandoned before completion, void the open operation:Next steps
- Transaction lifecycle — operation lifecycle in detail
- Payment lifecycle — split tender, asynchronous settlement