Umsatz API
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.
- 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
{ "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. |
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. |
Beispielantwort
[ { "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.