API-Referenz

Kasseneck API v2.0.0

Österreichische Registrierkassen-/RKSV-API für Belegerstellung und -abruf.

Basis-URL https://api.kasseneck.at empfohlen: /v2
Antwort-Envelope { status, message, data }

Die Kasseneck API ist eine HTTPS-Schnittstelle für österreichische Registrierkassen nach RKSV (Registrierkassensicherheitsverordnung, BAO §131, BMF-DEP). Damit erstellst du signierte Belege (Startbeleg, Umsatzbeleg, Storno, Training, Nullbeleg), rufst Belege ab und lädst Beleg-PDFs.

Kasseneck ist ein Produkt der Kreiseck und richtet sich an POS-/Kassensysteme, Kassenhersteller und Integrationspartner in Österreich.

Für Flutter/Dart gibt es das offizielle Paket kasseneck_api auf pub.dev.

Authentifizierung

Geräte-Endpunkte nutzen zwei Merkmale:

  • Authorization: Bearer <api_key> — der Geräte-/API-Schlüssel (Format kr_live_… bzw. kr_test_… für die Testumgebung).
  • cashregister-token: <token> — der Kassen-Token (Format cb_live_… /cb_test_…), identifiziert die konkrete Registrierkasse.

Umgebungen

  • Live: echte, rechtsgültige RKSV-Belege (Schlüssel kr_live_…).
  • Test: Sandbox mit Testsignatur (kr_test_…), production:false — strukturell valide, aber keine rechtsgültigen Signaturen. Ideal zum Integrieren ohne echte steuerliche Wirkung.

Antwortformat

Alle JSON-Endpunkte liefern HTTP 200 mit einem Envelope: { "status": "success" | "error", "message": string, "data": object }. Fachliche Fehler kommen ebenfalls mit HTTP 200 und status: "error".

Versionen

Empfohlen ist v2 (/v2/…) mit der Positionsform { name, quantity, unitPriceCents, vatRate } — Preise in ganzen Cent (keine Fließkommazahlen). Die v1-Endpunkte (/v1/…) und die v1-Positionsform (amount, priceOne, vat) bleiben aus Kompatibilität gültig (deprecated).

In drei Schritten produktiv

1
API-Key anfordern — Sandbox-Zugang (kr_test_…) sofort, ohne Vertrag.
2
Startbeleg signieren — der erste Aufruf von createReceipt muss receiptType: start sein.
3
Umsatzbelege signieren — danach jeder Barbeleg per createReceipt, signiert samt QR-Code-Daten zurück.
# Startbeleg (einmalig zuerst)
curl -X POST https://api.kasseneck.at/v2/createReceipt \
-H "Authorization: Bearer kr_test_…" \
-H "cashregister-token: cb_test_…" \
-d '{"params":{"receiptType":"start"}}'
→ status: "success" · signatureSuccess: true
# Umsatzbeleg (bar)
curl -X POST https://api.kasseneck.at/v2/createReceipt \
-d '{"params":{"receiptType":"standard","paymentMethod":"cash","items":[{"name":"Kaffee","quantity":2,"unitPriceCents":350,"vatRate":20},{"name":"Brot","quantity":1,"unitPriceCents":220,"vatRate":10}]}}'
→ data.receipt.qr: "…"

Endpunkte

POST /v2/createReceipt

Beleg erstellen und RKSV-signieren

Erstellt einen Beleg und signiert ihn (ES256, verkettete RKSV-Signatur → DEP). Der erste Beleg einer Kasse muss ein start-Beleg sein und erfolgreich signiert werden; danach standard-Belege usw.

Voraussetzung: aktives Modul registrierkasse für das Konto.

Hinweis: receiptId und Zeitstempel werden serverseitig vergeben.

Auth
ApiKeyAuth: Geräte-/API-Schlüssel im Bearer-Header (kr_live_… / kr_test_…).
CashregisterToken: Kassen-Token der Registrierkasse (cb_live_… / cb_test_…).

Alle Felder werden innerhalb von params gesendet: { "params": { … } }

FeldTypPflichtBeschreibung
receiptTypestring (start | standard | zero | cancellation | training)Pflichtstart = Startbeleg (einmalig zuerst, ohne Positionen). standard = Umsatzbeleg. cancellation = Storno. training = Trainingsbeleg (kein Umsatz). zero = Nullbeleg.
paymentMethodstring (cash | creditCard | online | uberApp | uberCard | uberCash | boltApp | boltCash | boltCard)optionalZahlungsart. Pflicht bei standard, cancellation, training.
itemsReceiptItem[]optionalBelegpositionen (Pflicht bei standard/cancellation/training).
vouchersVoucher[]optionalOptionale Gutschein-Vorgänge (Verkauf/Einlösung).
customerDetailsstringoptionalOptionale Kundenangabe auf dem Beleg.
legalMessagestringoptionalOptionaler rechtlicher Hinweistext.
customProjectIdstringoptionalOptionale eigene Projekt-/Referenz-ID.
Startbeleg (einmalig zuerst)
{
  "params": {
    "receiptType": "start"
  }
}
Standard-Umsatzbeleg (bar)
{
  "params": {
    "receiptType": "standard",
    "paymentMethod": "cash",
    "items": [
      {
        "name": "Kaffee",
        "quantity": 2,
        "unitPriceCents": 350,
        "vatRate": 20
      },
      {
        "name": "Brot",
        "quantity": 1,
        "unitPriceCents": 220,
        "vatRate": 10
      }
    ]
  }
}
Antwort
CodeTypBeschreibung
200 ReceiptEnvelope Envelope mit signiertem Beleg oder Fehler.
POST /v2/getReceipt

Beleg abrufen

Liefert einen zuvor erstellten Beleg der Kasse anhand seiner receiptId.

Auth
ApiKeyAuth: Geräte-/API-Schlüssel im Bearer-Header (kr_live_… / kr_test_…).
CashregisterToken: Kassen-Token der Registrierkasse (cb_live_… / cb_test_…).

Alle Felder werden innerhalb von params gesendet: { "params": { … } }

FeldTypPflichtBeschreibung
receiptIdstringPflichtID des Belegs (aus der createReceipt-Antwort).
{
  "params": {
    "receiptId": "abc123"
  }
}
Antwort
CodeTypBeschreibung
200 ReceiptEnvelope Envelope mit dem Beleg oder Fehler.
GET /v2/downloadReceipt

Beleg-PDF laden (Capability-Link)

Liefert das Beleg-PDF direkt (application/pdf). Autorisierung erfolgt ausschließlich über den verschlüsselten fullReceiptId-Token aus der createReceipt-Antwort — kein API-Schlüssel nötig. Der Token ist ein Capability-Link (wer ihn hat, sieht das PDF).

Auth
Kein API-Schlüssel nötig.
FeldOrtTypPflichtBeschreibung
fullReceiptIdQuerystringPflichtVerschlüsselter Beleg-Token aus data.receipt.fullReceiptId.
Antwort
CodeTypBeschreibung
200 PDF (binär) PDF-Datei.
400 Beleg-Link unvollständig.
404 User oder Beleg nicht gefunden.

Schema-Referenz

Die vollständigen Felder der Objekte, die in den Endpunkten oben verwendet werden.

CreateReceiptParams
FeldTypPflichtBeschreibung
receiptTypestring (start | standard | zero | cancellation | training)Pflichtstart = Startbeleg (einmalig zuerst, ohne Positionen). standard = Umsatzbeleg. cancellation = Storno. training = Trainingsbeleg (kein Umsatz). zero = Nullbeleg.
paymentMethodstring (cash | creditCard | online | uberApp | uberCard | uberCash | boltApp | boltCash | boltCard)optionalZahlungsart. Pflicht bei standard, cancellation, training.
itemsReceiptItem[]optionalBelegpositionen (Pflicht bei standard/cancellation/training).
vouchersVoucher[]optionalOptionale Gutschein-Vorgänge (Verkauf/Einlösung).
customerDetailsstringoptionalOptionale Kundenangabe auf dem Beleg.
legalMessagestringoptionalOptionaler rechtlicher Hinweistext.
customProjectIdstringoptionalOptionale eigene Projekt-/Referenz-ID.
ReceiptItem

Empfohlene v2-Form. Die v1-Felder (amount, priceOne, vat) werden aus Kompatibilität weiterhin akzeptiert, sind aber deprecated.

FeldTypPflichtBeschreibung
namestringPflichtBezeichnung der Position.
quantitynumberPflichtMenge.
unitPriceCentsintegerPflichtEinzelpreis (brutto) in ganzen Cent — keine Fließkommazahlen (vermeidet Rundungsfehler).
vatRatenumber (20 | 10 | 13 | 0 | 19 | 4.9)PflichtUSt-Satz in Prozent (österreichische Sätze inkl. Sonder-/Grundnahrungssätze).
amountveraltetnumberoptionalv1 (deprecated): Menge — nutze stattdessen quantity.
priceOneveraltetnumberoptionalv1 (deprecated): Einzelpreis in Euro (Fließkomma) — nutze stattdessen unitPriceCents.
vatveraltetnumberoptionalv1 (deprecated): USt-Satz — nutze stattdessen vatRate.
Voucher
FeldTypPflichtBeschreibung
actionstring (sell | redeem)Pflicht
typestring (value | promo)Pflicht
codestringoptionalGutscheincode (Default "no-code").
valuenumberoptionalWert (>0). Pflicht bei type=value.
namestringoptional
valueCentsintegeroptionalWert in Cent (Vorrang).
ReceiptEnvelope
FeldTypPflichtBeschreibung
statusstring (success | error)optional
messagestringoptional
dataobjectoptional
data.receiptReceiptoptional
data.companystringoptionalFirmenname des Unternehmers.
data.uidstring | nulloptionalUSt-IdNr des Unternehmers.
data.taxnrstring | nulloptional
data.is_small_businessbooleanoptional
Receipt

Der gespeicherte, signierte Beleg.

FeldTypPflichtBeschreibung
counterintegeroptionalFortlaufender Zähler der Kasse.
receiptTypestringoptional
receiptIdstringoptional
cashregisterIdstringoptional
timeStampstringoptionalBeleg-Zeitstempel (Europe/Vienna).
amountRateStandardnumberoptional
amountRateReduced1numberoptional
amountRateReduced2numberoptional
amountRateZeronumberoptional
amountRateSpecialnumberoptional
certificateSerialNumberstringoptional
signaturePreviousReceiptstringoptionalVerkettung zum Vorbeleg (RKSV).
fullReceiptIdstringoptionalVerschlüsselter Token für den PDF-Download.
sigstringoptionalJWS ES256: header.payload.signature.
signatureSuccessbooleanoptional
qrstringoptionalMaschinenlesbarer QR-Text des Belegs.