Kasseneck Flutter API
The Austrian RKSV-compliant cash register, right inside your Flutter app.
Issue signed receipts, take card payments and print β in a few lines of Dart.
kasseneck_api is the official Flutter client for Kasseneck β a fully RKSV-compliant
(Austrian Registrierkassensicherheitsverordnung) point-of-sale backend by
Kreiseck Software Solutions. It takes care of the signed
Datenerfassungsprotokoll, card-payment terminals, receipt printing and PDF reports, so you
can focus on your app.
π You need an API key & a cashregister token to operate a register. Request yours at office@kreiseck.com Β· kreiseck.com
β¨ Features
- π§Ύ RKSV receipts β standard, cancellation, zero & training; signed JWS chain + QR code
- πΆ All Austrian VAT rates β incl. the new 4.9 % Grundnahrungsmittel rate (from 1 Jul 2026)
- πͺ Exact money β amounts are integer cents internally (no floating-point drift)
- π³ Card payments out of the box β Hobex (Cloud & on-terminal HPS), myPOS, GP Tom, SumUp β and any other method via
CreditCardProvider.custom - ποΈ Vouchers β value & promo, sell & redeem, with proportional VAT split
- π¨οΈ Printing β Bluetooth & Wi-Fi (ESC/POS) plus the myPOS built-in printer
- π± Drop-in receipt widget for on-screen display
- π Reports & invoices β daily / monthly PDF
- π Stripe payment links for remote & online payments
π§© Requirements
- Flutter Β· Dart
>= 3.6 - A Kasseneck API key + cashregister token (β Kreiseck)
- An Android device/terminal for card payments & Bluetooth printing
π¦ Installation
dependencies:
kasseneck_api: ^3.0.0
flutter pub get
π Quick start
import 'package:kasseneck_api/kasseneck_api.dart';
import 'package:kasseneck_api/models/kasseneck_item.dart';
import 'package:kasseneck_api/enums/vat_rate.dart';
import 'package:kasseneck_api/enums/keck_payment_method.dart';
final kasseneck = KasseneckApi(
apiKey: 'YOUR_API_KEY',
cashregisterToken: 'YOUR_CASHREGISTER_TOKEN',
);
// A cash sale with two items β prices are integer cents (320 = β¬ 3.20)
final receipt = await kasseneck.sellReceipt(
paymentMethod: KeckPaymentMethod.cash,
customerDetails: ['Max Mustermann'],
items: [
KasseneckItem(name: 'Coffee', quantity: 2, vat: VatRate.vat20, priceCents: 320),
KasseneckItem(name: 'Bread', quantity: 1, vat: VatRate.vat4komma9, priceCents: 240),
// or, if you have euro doubles: KasseneckItem.euro(..., singlePrice: 3.20)
],
);
print('Receipt ${receipt?.receiptId} β signed: ${receipt?.signatureSuccess}');
π‘ Models & enums live in their own files β import the ones you use (
models/β¦,enums/β¦). Payment, refund, cancellation, zero & training receipts all run through the sameKasseneckApiinstance.
π³ Card payments
Card payments work out of the box with several terminals β and you're never locked in:
| Method | How |
|---|---|
| Hobex Cloud | kasseneck.hobexPay(...) / hobexRefund(...) |
| Hobex HPS (local terminal) | import 'package:kasseneck_api/hobex_hps.dart'; β HpsClient |
| myPOS Β· GP Tom Β· SumUp | supported & rendered on the receipt |
| Any other terminal/method | CreditCardProvider.custom β just pass your own card data |
Whatever terminal you use, hand the result to sellReceipt(...) as cardPaymentData and it is
stored and printed on the receipt.
Example β local Hobex terminal (HPS) β signed receipt
import 'package:kasseneck_api/hobex_hps.dart'; // HpsClient, TransactionResponse, HobexReceipt
final hps = HpsClient(tid: '3600335'); // TID without leading zero
// 1) Charge the card on the terminal
final res = await hps.payment(amount: 12.50);
if (!res.isApproved) return; // declined -> res.responseCode / res.responseText
// 2) Adapt the terminal result, 3) create the signed receipt
final card = HobexReceipt.fromHps(res);
await kasseneck.sellReceipt(
paymentMethod: KeckPaymentMethod.creditCard,
creditCardProvider: card.creditCardProvider, // hobexHps
cardPaymentId: card.transactionId,
cardPaymentData: card.toCardPaymentData(),
items: [KasseneckItem(name: 'Lunch', quantity: 1, vat: VatRate.vat10, priceCents: 1250)],
);
Also available: hps.refund(...), hps.cancel(...), hps.transactionStatus(...),
hps.diagnosis(). A declined payment is not an exception β it's res.isApproved == false.
π¨οΈ Printing
// Bluetooth (ESC/POS)
await kasseneck.initBluetoothPrinter(printerAddress: 'AA:BB:CC:DD:EE:FF');
await receipt!.printReceiptBluetooth();
// QR garbled or missing? Printers differ in which command they support:
await receipt.printReceiptBluetooth(qrMode: QrPrintMode.imageBitImage); // or .native
// Wi-Fi
await kasseneck.initWifiPrinter('192.168.0.50', KeckPaperSize.mm80);
await receipt.printReceiptWifi();
// Open the cash drawer
await KasseneckApi.openCashDrawer();
π± On-screen receipt
A ready-made widget renders the full receipt (logo, items, VAT table, QR, card details):
KeckReceiptWidget(receipt: receipt);
π Reports & invoices
final monthly = await kasseneck.downloadMonthlyReport(ReportMonth.now()); // Uint8List (PDF)
final daily = await kasseneck.downloadDailyReport(DateTime.now());
final history = await kasseneck.getReceipts(start, end);
π¦πΉ RKSV compliance
Every receipt is chained and signed (ES256 / JWS) and exposed as the machine-readable QR
payload, exactly as required by the Austrian RKSV. Signature-device outages are detected
(receipt.signatureSuccess / receipt.isSigFailed) and printed on the receipt.
ποΈ Versioning
This package follows semantic versioning β see the CHANGELOG. Latest: 3.2.0 β optional Kreiseck branding at the end of receipts (print, widget & PDF).
π¬ Support
Kreiseck Software Solutions β office@kreiseck.com Β· kreiseck.com
π License
See LICENSE.
Libraries
- enums/cashbox_status
- enums/credit_card_provider
- enums/keck_invoice_payment_methode
- enums/keck_month
- enums/keck_paper_size
- enums/keck_payment_method
- enums/qr_print_mode
- enums/receipt_print_type
- enums/receipt_type
- enums/signature_status
- enums/stripe_link_mode
- enums/vat_rate
- enums/voucher_action
- enums/voucher_type
- hobex_hps
- hobex Payment Service (HPS) β typed client for the terminal's local REST
API (
http://127.0.0.1:8080when the app runs on the terminal). - kasse
- Kassen-Einstellungen der Browser- und der App-Kasse.
- kasseneck_api
- models/beleg_layout
- Beleg-Zeilenmodell (Zwilling von
@kreiseck/kasseneck-api/receiptReceiptLayout): das Backend liefert es beigetReceiptalslayoutmit, damit App, Bondrucker, Browser-Kasse und PDF dieselben Zeilen zeigen β Kopf/FuΓ wie beim Ausstellen des Belegs, Belegart-Aufdruck (STORNOBELEG, TRAININGSBELEG, NULLBELEG β¦), reduzierter Nullbeleg, Testkasse/Testsignatur. - models/beleg_raster
- Zeichenraster (Zwilling von
renderReceiptGridim JS-Paket@kreiseck/kasseneck-api): der Beleg als Zeilen mit exakt N Zeichen (58 mm = 32, 80 mm = 48) β die eine Wahrheit fΓΌr Bildschirm, Bondruck und PDF. Regeln (fest, damit ΓΌberall dasselbe herauskommt): - models/cashregister
- models/hobex_receipt
- models/kasseneck_item
- models/kasseneck_receipt
- models/keck_customer
- models/keck_customer_address
- models/keck_invoice
- models/keck_invoice_item
- models/keck_print_result
- models/keck_sepa_info
- models/keck_user
- models/keck_voucher
- models/print_paper
- models/report_month
- models/stripe_url_seesion
- models/sumup_checkout_response
- printing
- Oeffentliches Barrel fuer den vendierten ESC/POS-Druck-Stack.
- register
- Kopplung und Anmeldung eines KassengerΓ€ts (RKSV-Kasse).
- services/keck_printer
- services/logo_service
- services/printer_service
- services/rksv_service
- services/sumup_service
- services/vienna_time
- widgets/keck_receipt_lines_widget
- widgets/keck_receipt_widget