APRO Dokumentation · Stand 6. November 2026

Umsatz API

Zuletzt aktualisiert: 5. November 2026ca. 6 Min. Lesezeit

PDF erzeugen

Die Umsatz-API liefert alle umsatzrelevanten Transaktionen eines Zeitraums — samt Positionen, Zahlungen und Steueraufteilung — in einer einzigen Abfrage. Ideal für Buchhaltungsexporte, Umsatzabstimmung, BI-Warehouses oder Ad-hoc-Reports.

Tipp: Umsatz API oder SQL Views?
Die Umsatz-API und die SQL Views liefern
dieselben Daten in unterschiedlicher Form für unterschiedliche
Laufzeiten:

- Umsatz API — über den öffentlichen Cloud-Endpunkt
(my.apro.at). Pro Beleg ein hierarchisches JSON-Objekt mit
Positionen, Zahlungen, Steuersätzen, Bediener und Tisch bereits
verschachtelt. Ideal für Off-Premise-Systeme, SaaS-Integrationen,
Mobile Clients — überall, wo ein fertiger Objektbaum gewünscht ist.
- SQL Views — lesende Views direkt auf der
On-Premise-Kassendatenbank. Flach, relational, mit jedem
SQL-Server-fähigen Tool abfragbar. Ideal für On-Premise-
Integrationen, ETL-Pipelines und **bestehende BI-Workflows
(Power BI, Tableau, Qlik, Metabase)**.

Cloud-API für Realtime-System-zu-System-Integration, SQL-Views für
Bulk-Analytics und Dashboards.
  • Host: my.apro.at
  • Auth: API-Key im x-api-key
  • Content type: application/json

Endpunkte

Variante

Endpunkt

Standort aus

Pfad + Key

POST /api/v1/locations/{location}/reports/receipts

{location} muss mit dem Standort des Keys übereinstimmen.

Nur Key

POST /api/v1/reports/receipts

dem API-Key selbst.

Beide Varianten erfordern einen standortgebundenen API-Key. Der Key selbst bestimmt, welche Standortdaten geliefert werden — einen mandantenweiten Endpunkt gibt es nicht. Wähle, was im Client-Code klarer ist — beide liefern dieselben Daten und benötigen denselben Key.

Request-Body

Feld

Typ

Pflicht

Beschreibung

after

ISO 8601 Timestamp

✅

Nur Belege nach diesem Zeitpunkt.

before

ISO 8601 Timestamp

✅

Nur Belege vor diesem Zeitpunkt.

limit

integer

—

Anzahl zurückgelieferter Belege begrenzen.

afterTransactionID

GUID

—

Cursor — Transaktionen nach dieser ID liefern. Für Paging zusammen mit limit nutzen.

Beispielanfrage

POST /api/v1/reports/receipts

{
  "after":  "2026-01-01T00:00:00Z",
  "before": "2026-02-01T00:00:00Z",
  "limit":  100,
  "afterTransactionID": "f03e11de-6330-4a03-a8a8-b6e5fd4e32a5"
}

Download: revenue-request.json

Antwort

Ein Array von Belegen. Jedes Element ist eine Transaktion mit Positionen, Zahlungen und Metadaten.

Top-Level-Felder

Feld

Typ

Beschreibung

transactionId

GUID

Eindeutige Transaktions-ID.

transactionType

string

Siehe Transaktionstypen.

receiptType

string

Beleg, Ausgangsrechnung oder Lieferschein.

totalAmount

decimal

Bruttogesamtbetrag.

tip

decimal

Im totalAmount enthaltenes Trinkgeld.

discount

decimal

Abgezogener Rabatt.

dateTime

ISO 8601

Zeitpunkt der Transaktion.

business

Business

Unternehmen / Mandant.

location

Location

Der APRO-Standort, für den abgefragt wurde.

staff

Staff

Bediener / Kellner.

table

Table

Tisch oder Bestellziel (z. B. Bar 1, Zimmer 301).

area

Area

Bereich / Zone des Tisches (z. B. Garten, Bar).

customer

Customer · nullable

Rechnungsempfänger. Auf diesem Endpunkt immer null — siehe unten.

paymentGroup

Payment group

Gruppierung, in die die Zahlungsarten zusammenlaufen.

payments

[Payment]

Zahlungen zum Beleg.

items

[Item]

Belegpositionen.

guestCount

integer

Gästeanzahl, summiert über die Positionen des Belegs. 0, wenn nicht erfasst.

Item

Feld

Typ

Beschreibung

id

string

Eindeutige Artikel-ID.

number

integer

Artikelnummer (in APRO). 0, wenn nicht parsebar.

name

string

Artikelname.

uniqueId

string · nullable

Stabiler Identifier je Position. Zum Deduplizieren bzw. Abgleichen über wiederholte Abfragen hinweg. null bei älteren Query-Konfigurationen.

externalId

string · nullable

Referenz aus einem Fremdsystem. null bei älteren Query-Konfigurationen.

bookDate

ISO 8601

Buchungszeitpunkt.

grossAmount

decimal

Bruttopreis.

netAmount

decimal

Nettopreis.

purchasePrice

decimal

Einkaufspreis der Position, für Deckungsbeitrags-Auswertungen. 0 bei älteren Query-Konfigurationen.

quantity

decimal

Stückzahl.

course

integer · nullable

Gang bei mehrgängigem Service. null, wenn nicht zugeordnet.

tax

Tax

Angewendeter Steuersatz.

category

Category

Sparte.

sideDishes

[Side dish] · nullable

Unterartikel / Beilagen zu dieser Position. null, wenn keine vorhanden sind.

Side dish

Unterartikel sind die Beilagen und Modifikatoren, die unter einer Position gebucht werden — die Pommes zum Schnitzel, das ohne Zwiebel zum Burger. Sie werden verschachtelt in der übergeordneten Position zurückgegeben, nie als eigene Positionen.

Ein Unterartikel nutzt dieselbe Item-Struktur, befüllt aber nur die folgenden Felder. Alle übrigen — bookDate, externalId, purchasePrice, course, tax, category, sideDishes — sind null bzw. ihr Default-Wert; Unterartikel verschachteln sich nicht rekursiv.

Feld

Typ

Beschreibung

id

string

Eindeutige Unterartikel-ID.

number

integer

Artikelnummer des Unterartikels. 0, wenn nicht parsebar.

name

string

Bezeichnung des Unterartikels.

uniqueId

string

Stabiler Identifier je Unterartikel. Zugleich der Schlüssel, über den dedupliziert wird.

grossAmount

decimal

Bruttopreis des Unterartikels.

netAmount

decimal

Nettopreis des Unterartikels.

quantity

decimal

Stückzahl des Unterartikels.

Achtung: Unterartikel nicht zu den Summen addieren
Ein Unterartikel mit Aufpreis ist **bereits im grossAmount /
netAmount der übergeordneten Position** und im totalAmount des
Belegs enthalten. Wer sideDishes[].grossAmount zusätzlich aufaddiert,
zählt Umsatz doppelt. Die Beträge sind eine Aufschlüsselung für die
Anzeige, keine eigenständigen Positionen.

sideDishes ist null — nicht [] — wenn eine Position keine Unterartikel hat, ebenso bei älteren Query-Konfigurationen aus der Zeit vor diesem Feature. Daher auf null-oder-leer prüfen, statt ein Array vorauszusetzen.

Tax

Feld

Typ

Beschreibung

id

string

Eindeutige ID des Steuersatzes.

value

decimal

Höhe, z. B. 20.0 für 20 %.

name

string

Bezeichnung, z. B. Mwst 20 %.

Category

Feld

Typ

Beschreibung

id

string

Eindeutige Sparten-ID.

number

integer

Sparten-Nummer.

name

string

Bezeichnung.

Payment

Feld

Typ

Beschreibung

id

string

Eindeutige Zahlungs-ID. Zahlungen werden über diesen Wert dedupliziert.

amount

decimal

Gezahlter Betrag.

paymentType

PaymentType

Verwendetes Zahlungsmittel.

fibuAccountNr

string · nullable

Fibu-Kontonummer, auf die die Zahlung gebucht wird. Für die Zuordnung auf Sachkonten im Export.

Payment type

Feld

Typ

Beschreibung

id

integer · nullable

Eindeutige Zahlungsmittel-ID.

nr

integer · nullable

Zahlungsmittel-Nummer. Der Schlüssel heißt nr, nicht number.

name

string

Bezeichnung, z. B. Bar, Kreditkarte.

Business

Feld

Typ

Beschreibung

id

string

Mandanten-ID aus der Kassendatenbank.

name

string

Firmenname.

Staff

Feld

Typ

Beschreibung

id

string

Eindeutige Mitarbeiter-ID.

number

integer

Personalnummer.

name

string

Mitarbeitername.

Table

Feld

Typ

Beschreibung

id

string

Eindeutige Tisch-ID.

number

integer

Tischnummer.

name

string

Tischbezeichnung, z. B. Bar 1, Restaurant 5.

Location

Feld

Typ

Beschreibung

id

string

APRO-Standort-ID — die locationId, auf die die Abfrage aufgelöst wurde.

name

string · nullable

Standortname.

Area

Der Bereich bzw. die Zone, in der ein Tisch steht.

Feld

Typ

Beschreibung

id

string

Eindeutige Bereichs-ID.

number

integer

Bereichsnummer.

name

string

Bezeichnung, z. B. Garten, Bar.

Payment group

Die Gruppierung, in der die Zahlungsarten zusammenlaufen — für Kassabuch- und Abschluss-Auswertungen.

Feld

Typ

Beschreibung

id

integer

Zahlungsgruppen-ID. 0, wenn nicht gesetzt.

name

string

Bezeichnung der Gruppe.

Customer

Feld

Typ

Beschreibung

id

string

Eindeutige Kunden-ID.

number

integer

Kundennummer.

name

string

Kundenname.

Hinweis: Aktuell immer null
Der Receipts-Endpunkt befüllt customer nicht — das Feld ist im
Response-Contract reserviert, wird von der Abfrage aber nicht gesetzt.
Keine Rechnungsempfänger-Logik darauf aufbauen; Kunden stattdessen über
die eigenen Endpunkte auflösen.

Beispielantwort

Response · zwei direkt aufeinanderfolgende Abrechnungen

[
  {
    "transactionId": "f03e11de-6330-4a03-a8a8-b6e5fd4e32a5",
    "transactionType": "Abrechnen",
    "receiptType": "Beleg",
    "totalAmount": 3.2,
    "tip": 0.0,
    "discount": 0.0,
    "dateTime": "03.10.2021 21:59:57",
    "business": { "id": "1", "name": "APRO Kassensysteme" },
    "location": { "id": "7236", "name": "Wien Haupthaus" },
    "staff":    { "id": "8", "number": 9500, "name": "Onlinekellner" },
    "table":    { "id": "76", "number": 76, "name": "Daniel Z" },
    "area":     { "id": "3", "number": 3, "name": "Garten" },
    "customer": null,
    "paymentGroup": { "id": 2, "name": "Kartenzahlung" },
    "payments": [
      {
        "id": "04b2d2f5-8765-41b5-ad5c-aed802dc23bc",
        "amount": 3.2,
        "paymentType": { "id": 26, "nr": 200, "name": "Smorder Kreditkarte" },
        "fibuAccountNr": "2751"
      }
    ],
    "items": [
      {
        "id": "38",
        "number": 216,
        "name": "Wiener Schnitzel",
        "uniqueId": "0f6c2c14-3f8a-4f0b-9a1e-2b7d5c8e4411",
        "externalId": null,
        "bookDate": "03.10.2021 21:59:55",
        "grossAmount": 3.2,
        "netAmount": 3.2,
        "purchasePrice": 1.1,
        "quantity": 1.0,
        "course": 2,
        "tax": { "id": "5", "value": 5.0, "name": "Mwst 5 %" },
        "category": { "id": "12", "number": 12, "name": "Hauptspeisen" },
        "sideDishes": [
          {
            "id": "512",
            "number": 9001,
            "name": "Pommes",
            "uniqueId": "b41d9a77-55c2-4e3d-8f10-6cc0a2b93d88",
            "grossAmount": 1.5,
            "netAmount": 1.36,
            "quantity": 1.0
          },
          {
            "id": "518",
            "number": 9007,
            "name": "ohne Zwiebel",
            "uniqueId": "c9a70e31-1d44-4a92-b7e5-30f8c1d6a204",
            "grossAmount": 0.0,
            "netAmount": 0.0,
            "quantity": 1.0
          }
        ]
      }
    ],
    "guestCount": 2
  },
  {
    "transactionId": "db2b90d1-ab37-4557-b169-2289c3004a0a",
    "transactionType": "Abrechnen",
    "receiptType": "Beleg",
    "totalAmount": 3.2,
    "tip": 0.0,
    "discount": 0.0,
    "dateTime": "03.10.2021 22:00:12",
    "business": { "id": "1", "name": "APRO Kassensysteme" },
    "location": { "id": "7236", "name": "Wien Haupthaus" },
    "staff":    { "id": "8", "number": 9500, "name": "Onlinekellner" },
    "table":    { "id": "76", "number": 76, "name": "Daniel Z" },
    "area":     { "id": "3", "number": 3, "name": "Garten" },
    "customer": null,
    "paymentGroup": { "id": 2, "name": "Kartenzahlung" },
    "payments": [
      {
        "id": "bb3e6300-0cc3-4922-80c4-a8a4c3530d3c",
        "amount": 3.2,
        "paymentType": { "id": 26, "nr": 200, "name": "Smorder Kreditkarte" },
        "fibuAccountNr": "2751"
      }
    ],
    "items": [
      {
        "id": "38",
        "number": 216,
        "name": "Cola 0,5",
        "uniqueId": "7d2f3b90-6c11-4c8e-93aa-5e4419c7f0d3",
        "externalId": null,
        "bookDate": "03.10.2021 22:00:11",
        "grossAmount": 3.2,
        "netAmount": 3.2,
        "purchasePrice": 0.7,
        "quantity": 1.0,
        "course": null,
        "tax": { "id": "5", "value": 5.0, "name": "Mwst 5 %" },
        "category": { "id": "20", "number": 20, "name": "Alkoholfreie Getränke" },
        "sideDishes": null
      }
    ],
    "guestCount": 1
  }
]

Dieselbe Payload als eigenständige Datei herunterladen: revenue-response.json

Transaktionstypen

Der transactionType unterscheidet, was eine Zeile repräsentiert. Für umsatzrelevante Reports auf Abrechnen filtern (und RechnungZurückholen für Rückholungen).

Typ

Bedeutung

Bonieren

Artikel auf offenen Tisch boniert.

Verschieben

Tischwechsel.

Abrechnen

Abschluss — bezahlter Beleg.

Stornieren

Stornierung einer Buchung.

RechnungZurückholen

Rücknahme einer Abrechnung.

DebitBonieren

Debit-Buchung.

ARAusstellen · ARPreview · ARNachdruck · ARNachdruckOriginal

Ausgangsrechnungs-Lifecycle.

Tagesabschluss · TagesabschlussPreview

Tagesabschluss / Vorschau.

Kellnerabschlag · KellnerabschlagPreview · KellnerabschlagUndo · Kellneruebergabe

Kellnerübergabe / Abschlag.

Startbeleg · Schlussbeleg · Nullbeleg · Monatsbeleg · JahresBeleg · Nacherfassungssammelbeleg

Gesetzliche Fiskalbelege (RKSV).

TischOeffnen · TischSchliessen · GaesteanzahlAendern · GaesteanzahlKorrigieren

Tisch-Lifecycle.

BestellmanagerBestellung · …NextState · …SetFinaleState · …Undo · …Stornieren · …Verschieben · …NaechsterGang · …Statistik

Bestellmanager-Events.

WarenkorbErstellen · WarenkorbUpdate · WarenkorbVerwerfen

Warenkorb-Lifecycle.

DatenExport · UndoDatenExport

Datenexport-Markierungen.

Kassabuch · Bargeldzählung · TerminalKassenschnitt · Lieferantabschlag · LieferantabschlagVorschau · Ansehen · Information · SchankanlageQrCode · Abrechnen HSK · Abrechnen AR · AbrechnenNachdruck

Weitere operative Ereignisse.

Umsatzberechnung

Um den umsatzrelevanten Umsatz einer Antwort zu berechnen, behält man bezahlte Abrechnungen samt Rückholungen und summiert die Netto-Positionen:

response
  .filter(x =>
    x.paymentGroup.name === "Umsatzwirksam" &&
    ["Abrechnen", "RechnungZurückholen"].includes(x.transactionType)
  )
  .map(x =>
    x.items.reduce((sum, item) => sum + item.netAmount * item.quantity, 0)
  )
  .reduce((sum, val) => sum + val, 0);

Paging

Es gibt keinen Cursor in der Antwort — nutzen Sie die deterministische transactionId der zuletzt gesehenen Zeile als afterTransactionID der nächsten Anfrage, after/before bleiben unverändert. So lange iterieren, bis die Antwort weniger Zeilen liefert als Ihr limit.

Fehler

Siehe Authentifizierung → Fehlerantworten.