Zum Inhalt springen

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

VarianteEndpunktStandort aus
Pfad + KeyPOST /api/v1/locations/{location}/reports/receipts{location} muss mit dem Standort des Keys übereinstimmen.
Nur KeyPOST /api/v1/reports/receiptsdem 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

FeldTypPflichtBeschreibung
afterISO 8601 TimestampNur Belege nach diesem Zeitpunkt.
beforeISO 8601 TimestampNur Belege vor diesem Zeitpunkt.
limitintegerAnzahl zurückgelieferter Belege begrenzen.
afterTransactionIDGUIDCursor — 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

FeldTypBeschreibung
transactionIdGUIDEindeutige Transaktions-ID.
transactionTypestringSiehe Transaktionstypen.
receiptTypestringBeleg, Ausgangsrechnung oder Lieferschein.
totalAmountdecimalBruttogesamtbetrag.
tipdecimalIm totalAmount enthaltenes Trinkgeld.
discountdecimalAbgezogener Rabatt.
dateTimeISO 8601Zeitpunkt der Transaktion.
businessBusinessUnternehmen / Mandant.
locationLocationDer APRO-Standort, für den abgefragt wurde.
staffStaffBediener / Kellner.
tableTableTisch oder Bestellziel (z. B. Bar 1, Zimmer 301).
areaAreaBereich / Zone des Tisches (z. B. Garten, Bar).
customerCustomer · nullableRechnungsempfänger. Auf diesem Endpunkt immer null — siehe unten.
paymentGroupPayment groupGruppierung, in die die Zahlungsarten zusammenlaufen.
paymentsPayment[]Zahlungen zum Beleg.
itemsItem[]Belegpositionen.
guestCountintegerGästeanzahl, summiert über die Positionen des Belegs. 0, wenn nicht erfasst.

Item

FeldTypBeschreibung
idstringEindeutige Artikel-ID.
numberintegerArtikelnummer (in APRO). 0, wenn nicht parsebar.
namestringArtikelname.
uniqueIdstring · nullableStabiler Identifier je Position. Zum Deduplizieren bzw. Abgleichen über wiederholte Abfragen hinweg. null bei älteren Query-Konfigurationen.
externalIdstring · nullableReferenz aus einem Fremdsystem. null bei älteren Query-Konfigurationen.
bookDateISO 8601Buchungszeitpunkt.
grossAmountdecimalBruttopreis.
netAmountdecimalNettopreis.
purchasePricedecimalEinkaufspreis der Position, für Deckungsbeitrags-Auswertungen. 0 bei älteren Query-Konfigurationen.
quantitydecimalStückzahl.
courseinteger · nullableGang bei mehrgängigem Service. null, wenn nicht zugeordnet.
taxTaxAngewendeter Steuersatz.
categoryCategorySparte.
sideDishesSide dish[] · nullableUnterartikel / 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.

FeldTypBeschreibung
idstringEindeutige Unterartikel-ID.
numberintegerArtikelnummer des Unterartikels. 0, wenn nicht parsebar.
namestringBezeichnung des Unterartikels.
uniqueIdstringStabiler Identifier je Unterartikel. Zugleich der Schlüssel, über den dedupliziert wird.
grossAmountdecimalBruttopreis des Unterartikels.
netAmountdecimalNettopreis des Unterartikels.
quantitydecimalStü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

FeldTypBeschreibung
idstringEindeutige ID des Steuersatzes.
valuedecimalHöhe, z. B. 20.0 für 20 %.
namestringBezeichnung, z. B. Mwst 20 %.

Category

FeldTypBeschreibung
idstringEindeutige Sparten-ID.
numberintegerSparten-Nummer.
namestringBezeichnung.

Payment

FeldTypBeschreibung
idstringEindeutige Zahlungs-ID. Zahlungen werden über diesen Wert dedupliziert.
amountdecimalGezahlter Betrag.
paymentTypePaymentTypeVerwendetes Zahlungsmittel.
fibuAccountNrstring · nullableFibu-Kontonummer, auf die die Zahlung gebucht wird. Für die Zuordnung auf Sachkonten im Export.

Payment type

FeldTypBeschreibung
idinteger · nullableEindeutige Zahlungsmittel-ID.
nrinteger · nullableZahlungsmittel-Nummer. Der Schlüssel heißt nr, nicht number.
namestringBezeichnung, z. B. Bar, Kreditkarte.

Business

FeldTypBeschreibung
idstringMandanten-ID aus der Kassendatenbank.
namestringFirmenname.

Staff

FeldTypBeschreibung
idstringEindeutige Mitarbeiter-ID.
numberintegerPersonalnummer.
namestringMitarbeitername.

Table

FeldTypBeschreibung
idstringEindeutige Tisch-ID.
numberintegerTischnummer.
namestringTischbezeichnung, z. B. Bar 1, Restaurant 5.

Location

FeldTypBeschreibung
idstringAPRO-Standort-ID — die locationId, auf die die Abfrage aufgelöst wurde.
namestring · nullableStandortname.

Area

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

FeldTypBeschreibung
idstringEindeutige Bereichs-ID.
numberintegerBereichsnummer.
namestringBezeichnung, z. B. Garten, Bar.

Payment group

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

FeldTypBeschreibung
idintegerZahlungsgruppen-ID. 0, wenn nicht gesetzt.
namestringBezeichnung der Gruppe.

Customer

FeldTypBeschreibung
idstringEindeutige Kunden-ID.
numberintegerKundennummer.
namestringKundenname.

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).

TypBedeutung
BonierenArtikel auf offenen Tisch boniert.
VerschiebenTischwechsel.
AbrechnenAbschluss — bezahlter Beleg.
StornierenStornierung einer Buchung.
RechnungZurückholenRücknahme einer Abrechnung.
DebitBonierenDebit-Buchung.
ARAusstellen · ARPreview · ARNachdruck · ARNachdruckOriginalAusgangsrechnungs-Lifecycle.
Tagesabschluss · TagesabschlussPreviewTagesabschluss / Vorschau.
Kellnerabschlag · KellnerabschlagPreview · KellnerabschlagUndo · KellneruebergabeKellnerübergabe / Abschlag.
Startbeleg · Schlussbeleg · Nullbeleg · Monatsbeleg · JahresBeleg · NacherfassungssammelbelegGesetzliche Fiskalbelege (RKSV).
TischOeffnen · TischSchliessen · GaesteanzahlAendern · GaesteanzahlKorrigierenTisch-Lifecycle.
BestellmanagerBestellung · …NextState · …SetFinaleState · …Undo · …Stornieren · …Verschieben · …NaechsterGang · …StatistikBestellmanager-Events.
WarenkorbErstellen · WarenkorbUpdate · WarenkorbVerwerfenWarenkorb-Lifecycle.
DatenExport · UndoDatenExportDatenexport-Markierungen.
Kassabuch · Bargeldzählung · TerminalKassenschnitt · Lieferantabschlag · LieferantabschlagVorschau · Ansehen · Information · SchankanlageQrCode · Abrechnen HSK · Abrechnen AR · AbrechnenNachdruckWeitere 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.