Skip to content

Revenue API

The Revenue API returns every fiscal transaction in a date range — with its positions, payments and tax breakdown — in a single call. Use it for accounting exports, revenue reconciliation, BI warehouses or ad-hoc reports.

  • Host: my.apro.at
  • Auth: API key in x-api-key
  • Content type: application/json

Endpoints

VariantEndpointLocation derived from
Path + keyPOST /api/v1/locations/{location}/reports/receipts{location} must match the key’s location.
Key onlyPOST /api/v1/reports/receiptsThe API key itself.

Both variants require a location-scoped API key. The key itself determines which location’s data is returned — there is no tenant-wide variant. Pick whichever feels more explicit in your client code — both return the same data and require the same key.

Request body

FieldTypeRequiredDescription
afterISO 8601 timestampReturn receipts after this point in time.
beforeISO 8601 timestampReturn receipts before this point in time.
limitintegerCap the number of results returned.
afterTransactionIDGUIDCursor — return transactions after this ID. Combine with limit for paging.

Example request

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

Response

An array of receipts. Each element is one transaction with its positions, payments and metadata.

Top-level fields

FieldTypeDescription
transactionIdGUIDUnique transaction ID.
transactionTypestringSee Transaction types.
receiptTypestringBeleg, Ausgangsrechnung, or Lieferschein.
totalAmountdecimalGross total of the receipt.
tipdecimalTip included in totalAmount.
discountdecimalDiscount applied to the receipt.
dateTimeISO 8601When the transaction happened.
businessBusinessTenant / operator record.
staffStaffOperator / waiter.
tableTableTable or delivery spot (e.g. “Bar 1”, “Room 301”).
customerCustomer · nullableInvoice recipient, if any.
paymentsPayment[]Payments settling the receipt.
itemsItem[]Line items.

Item

FieldTypeDescription
idintegerUnique item ID.
numberstringProduct number (as used in APRO).
namestringProduct name.
bookDateISO 8601Time the line was booked.
grossAmountdecimalGross price.
netAmountdecimalNet price.
quantitydecimalUnits sold.
taxTaxApplied tax rate.
categoryCategoryProduct category (a.k.a. “Sparte”).

Tax

FieldTypeDescription
idintegerUnique tax rate ID.
valuedecimalRate, e.g. 20.0 for 20 %.
namestringDisplay name, e.g. Mwst 20 %.

Category

FieldTypeDescription
idstringUnique category ID.
numberintegerCategory number.
namestringDisplay name.

Payment

FieldTypeDescription
idstringUnique payment ID.
amountdecimalAmount paid.
paymentTypePaymentTypeMethod used.

Payment type

FieldTypeDescription
idstringUnique payment method ID.
numberintegerPayment method number.
namestringDisplay name, e.g. Bar, Kreditkarte.

Business

FieldTypeDescription
idstringTenant ID from the POS database.
namestringLegal name.

Staff

FieldTypeDescription
idstringUnique staff ID.
numberintegerPersonnel number.
namestringStaff name.

Table

FieldTypeDescription
idstringUnique table ID.
numberintegerTable number.
namestringTable label, e.g. Bar 1, Restaurant 5.

Example response

Response · two receipts settled back-to-back
[
{
"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" },
"staff": { "id": "8", "number": 9500, "name": "Onlinekellner" },
"table": { "id": "76", "number": 76, "name": "Daniel Z" },
"customer": null,
"payments": [
{
"id": "04b2d2f5-8765-41b5-ad5c-aed802dc23bc",
"amount": 3.2,
"paymentType": { "id": 26, "nr": 200, "name": "Smorder Kreditkarte" }
}
],
"items": [
{
"id": "38",
"number": 216,
"name": "Cola 0,5",
"bookDate": "03.10.2021 21:59:55",
"grossAmount": 3.2,
"netAmount": 3.2,
"quantity": 1.0,
"tax": { "id": "5", "value": 5.0, "name": "Mwst 5 %" }
}
]
},
{
"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" },
"staff": { "id": "8", "number": 9500, "name": "Onlinekellner" },
"table": { "id": "76", "number": 76, "name": "Daniel Z" },
"customer": null,
"payments": [
{
"id": "bb3e6300-0cc3-4922-80c4-a8a4c3530d3c",
"amount": 3.2,
"paymentType": { "id": 26, "nr": 200, "name": "Smorder Kreditkarte" }
}
],
"items": [
{
"id": "38",
"number": 216,
"name": "Cola 0,5",
"bookDate": "03.10.2021 22:00:11",
"grossAmount": 3.2,
"netAmount": 3.2,
"quantity": 1.0,
"tax": { "id": "5", "value": 5.0, "name": "Mwst 5 %" }
}
]
}
]

Download the same payload as a standalone file: revenue-response.json

Transaction types

The transactionType discriminates what the row represents. For revenue-effective reports, filter on Abrechnen (and RechnungZurückholen for reversals).

TypeMeaning
BonierenItem booked on an open table.
VerschiebenTable change.
AbrechnenSettlement — a paid receipt.
StornierenReversal of a booking.
RechnungZurückholenReversal of a settlement.
DebitBonierenDebit booking.
ARAusstellen · ARPreview · ARNachdruck · ARNachdruckOriginalOutgoing invoice lifecycle.
Tagesabschluss · TagesabschlussPreviewDay-end close / preview.
Kellnerabschlag · KellnerabschlagPreview · KellnerabschlagUndo · KelleruebergabeWaiter hand-over / settlement.
Startbeleg · Schlussbeleg · Nullbeleg · Monatsbeleg · JahresBeleg · NacherfassungssammelbelegLegal fiscal receipts (RKSV).
TischOeffnen · TischSchliessen · GaesteanzahlAendern · GaesteanzahlKorrigierenTable lifecycle.
BestellmanagerBestellung · …NextState · …SetFinaleState · …Undo · …Stornieren · …Verschieben · …NaechsterGang · …StatistikOrder-manager events.
WarenkorbErstellen · WarenkorbUpdate · WarenkorbVerwerfenCart lifecycle.
DatenExport · UndoDatenExportData export markers.
Kassabuch · Bargeldzählung · TerminalKassenschnitt · Lieferantabschlag · LieferantabschlagVorschau · Ansehen · Information · SchankanlageQrCode · Abrechnen HSK · Abrechnen AR · AbrechnenNachdruckOther operational events.

Calculating revenue

To compute revenue-effective turnover over a response, keep only paid settlements and their reversals, and sum the net line totals:

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

There is no cursor-in-response — use the deterministic transactionId of the last row you saw as afterTransactionID on the next request, keeping after/before unchanged. Continue until the response contains fewer rows than your limit.

Errors

See Authentication → Error responses.