APRO Dokumentation · Stand 6. November 2026

Revenue API

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

PDF erzeugen

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.

Tip: Revenue API or SQL Views?
The Revenue API and the SQL Views expose the
same underlying data, but in different shapes for different runtimes:

- Revenue API — served over the public cloud endpoint
(my.apro.at). Returns a hierarchical JSON document per receipt
with positions, payments, tax, staff and table already nested. Ideal
for off-premise systems, SaaS integrations, mobile clients and any
consumer that wants a ready-to-use object tree.
- SQL Views — read-only views on the on-premise cash register
database. Flat, relational, queryable with any tool that speaks
SQL Server. Ideal for on-premise integrations, ETL pipelines and
existing BI workflows (Power BI, Tableau, Qlik, Metabase).

Pick the cloud API for real-time system-to-system integration, pick
the SQL views for bulk analytics and dashboards.
  • 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

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

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.

Caution: Do not add side dishes to your totals
A side dish that carries a surcharge is **already included in its
parent item's grossAmount / netAmount** and in the receipt's
totalAmount. Summing sideDishes[].grossAmount on top of the parent
line double-counts revenue. Treat the amounts as a breakdown for
display, not as separate positions.

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.

Note: Always null today
The receipts endpoint never populates customer — it is reserved in the
response contract but not filled by the query. Do not build invoice-
recipient logic on it; resolve customers through their own endpoints
instead.

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" },
    "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.

Errors

See Authentication → Error responses.