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
| Variant | Endpoint | Location derived from |
|---|---|---|
| Path + key | POST /api/v1/locations/{location}/reports/receipts | {location} must match the key’s location. |
| Key only | POST /api/v1/reports/receipts | The 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
| Field | Type | Required | Description |
|---|---|---|---|
after | ISO 8601 timestamp | ✅ | Return receipts after this point in time. |
before | ISO 8601 timestamp | ✅ | Return receipts before this point in time. |
limit | integer | — | Cap the number of results returned. |
afterTransactionID | GUID | — | Cursor — return transactions after this ID. Combine with limit for paging. |
Example request
{ "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
| Field | Type | Description |
|---|---|---|
transactionId | GUID | Unique transaction ID. |
transactionType | string | See Transaction types. |
receiptType | string | Beleg, Ausgangsrechnung, or Lieferschein. |
totalAmount | decimal | Gross total of the receipt. |
tip | decimal | Tip included in totalAmount. |
discount | decimal | Discount applied to the receipt. |
dateTime | ISO 8601 | When the transaction happened. |
business | Business | Tenant / operator record. |
location | Location | The APRO location the data was queried for. |
staff | Staff | Operator / waiter. |
table | Table | Table or delivery spot (e.g. “Bar 1”, “Room 301”). |
area | Area | Room / zone the table belongs to (e.g. Garden, Bar). |
customer | Customer · nullable | Invoice recipient. Always null on this endpoint — see below. |
paymentGroup | Payment group | Grouping the payment types roll up into. |
payments | Payment[] | Payments settling the receipt. |
items | Item[] | Line items. |
guestCount | integer | Number of guests, summed over the receipt’s line items. 0 when not recorded. |
Item
| Field | Type | Description |
|---|---|---|
id | string | Unique item ID. |
number | integer | Product number (as used in APRO). 0 when it cannot be parsed. |
name | string | Product name. |
uniqueId | string · nullable | Stable per-line identifier. Use it to deduplicate or reconcile lines across repeated queries. null on older query configurations. |
externalId | string · nullable | Reference assigned by an external system. null on older query configurations. |
bookDate | ISO 8601 | Time the line was booked. |
grossAmount | decimal | Gross price. |
netAmount | decimal | Net price. |
purchasePrice | decimal | Cost price of the line, for margin reporting. 0 on older query configurations. |
quantity | decimal | Units sold. |
course | integer · nullable | Course number in a multi-course service (Gang). null when not assigned. |
tax | Tax | Applied tax rate. |
category | Category | Product category (a.k.a. “Sparte”). |
sideDishes | Side dish[] · nullable | Side dishes / modifiers booked on this line. null when there are none. |
Side dish
Side dishes (Unterartikel) are the modifiers booked underneath a line item — the Pommes under a schnitzel, the ohne Zwiebel on a burger. They are returned nested inside their parent item, never as items of their own.
A side dish reuses the Item shape, but only the following
fields are populated. Every other field — bookDate, externalId,
purchasePrice, course, tax, category, sideDishes — is null
or its zero value, and side dishes do not nest recursively.
| Field | Type | Description |
|---|---|---|
id | string | Unique side dish ID. |
number | integer | Product number of the side dish. 0 when it cannot be parsed. |
name | string | Side dish name. |
uniqueId | string | Stable per-side-dish identifier. Also the key the API deduplicates on. |
grossAmount | decimal | Gross price of the side dish. |
netAmount | decimal | Net price of the side dish. |
quantity | decimal | Units of the side dish. |
sideDishes is null — not [] — when a line has none, and also on
older query configurations that predate the feature. Test for
null-or-empty rather than assuming an array is present.
Tax
| Field | Type | Description |
|---|---|---|
id | string | Unique tax rate ID. |
value | decimal | Rate, e.g. 20.0 for 20 %. |
name | string | Display name, e.g. Mwst 20 %. |
Category
| Field | Type | Description |
|---|---|---|
id | string | Unique category ID. |
number | integer | Category number. |
name | string | Display name. |
Payment
| Field | Type | Description |
|---|---|---|
id | string | Unique payment ID. Payments are deduplicated on this value. |
amount | decimal | Amount paid. |
paymentType | PaymentType | Method used. |
fibuAccountNr | string · nullable | Financial-accounting account number the payment posts to. Use it to map payments onto ledger accounts in an export. |
Payment type
| Field | Type | Description |
|---|---|---|
id | integer · nullable | Unique payment method ID. |
nr | integer · nullable | Payment method number. Note the key is nr, not number. |
name | string | Display name, e.g. Bar, Kreditkarte. |
Business
| Field | Type | Description |
|---|---|---|
id | string | Tenant ID from the POS database. |
name | string | Legal name. |
Staff
| Field | Type | Description |
|---|---|---|
id | string | Unique staff ID. |
number | integer | Personnel number. |
name | string | Staff name. |
Table
| Field | Type | Description |
|---|---|---|
id | string | Unique table ID. |
number | integer | Table number. |
name | string | Table label, e.g. Bar 1, Restaurant 5. |
Location
| Field | Type | Description |
|---|---|---|
id | string | APRO location ID — the locationId the query resolved to. |
name | string · nullable | Location name. |
Area
The room or zone a table sits in.
| Field | Type | Description |
|---|---|---|
id | string | Unique area ID. |
number | integer | Area number. |
name | string | Area label, e.g. Garten, Bar. |
Payment group
The grouping payment types roll up into — used for cash-book and settlement reporting.
| Field | Type | Description |
|---|---|---|
id | integer | Payment group ID. 0 when not set. |
name | string | Group label. |
Customer
| Field | Type | Description |
|---|---|---|
id | string | Unique customer ID. |
number | integer | Customer number. |
name | string | Customer name. |
Example response
[ { "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 }]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).
| Type | Meaning |
|---|---|
Bonieren | Item booked on an open table. |
Verschieben | Table change. |
Abrechnen | Settlement — a paid receipt. |
Stornieren | Reversal of a booking. |
RechnungZurückholen | Reversal of a settlement. |
DebitBonieren | Debit booking. |
ARAusstellen · ARPreview · ARNachdruck · ARNachdruckOriginal | Outgoing invoice lifecycle. |
Tagesabschluss · TagesabschlussPreview | Day-end close / preview. |
Kellnerabschlag · KellnerabschlagPreview · KellnerabschlagUndo · Kelleruebergabe | Waiter hand-over / settlement. |
Startbeleg · Schlussbeleg · Nullbeleg · Monatsbeleg · JahresBeleg · Nacherfassungssammelbeleg | Legal fiscal receipts (RKSV). |
TischOeffnen · TischSchliessen · GaesteanzahlAendern · GaesteanzahlKorrigieren | Table lifecycle. |
BestellmanagerBestellung · …NextState · …SetFinaleState · …Undo · …Stornieren · …Verschieben · …NaechsterGang · …Statistik | Order-manager events. |
WarenkorbErstellen · WarenkorbUpdate · WarenkorbVerwerfen | Cart lifecycle. |
DatenExport · UndoDatenExport | Data export markers. |
Kassabuch · Bargeldzählung · TerminalKassenschnitt · Lieferantabschlag · LieferantabschlagVorschau · Ansehen · Information · SchankanlageQrCode · Abrechnen HSK · Abrechnen AR · AbrechnenNachdruck | Other 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.