Die Externe-Bestellung-API nimmt eine vollständig formulierte Bestellung aus einem beliebigen Fremdsystem entgegen — Lieferaggregator, White-Label- App, Kiosk, Voice-Agent — und steuert sie in die laufende APRO-Kassa am Zielstandort ein. Ein einziger POST genügt; die Bestellung erscheint sofort im Bestellmanager.
- Endpunkt:
POST https://my.apro.at/api/v1/external/order - Auth: API-Key im
x-api-key - Content type:
application/json
Bestellung einem Standort zuordnen
Die Bestellung muss genau einem Standort zugeordnet sein. Geben Sie einen der folgenden Werte mit — der erste nicht-leere Wert gewinnt:
LocationID— numerische IDLocationShortCode— Kurz-Identifier (z. B.vienna-main)SpotID— konkreter Tisch/Zimmer/Abholpunkt (Standort wird abgeleitet)QRCode— gescannter APRO-QR-Code (Standort und Spot werden abgeleitet)
Fehlen alle, wird die Anfrage abgelehnt.
Request-Body
Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| string | — | Idempotenz-Schlüssel. Kommt derselbe |
| int? | ◻︎ | Siehe Routing oben. |
| string | ◻︎ | Siehe Routing oben. |
| int? | — | ID des Bestellziels (Tisch, Zimmer, Abhol-, Lieferstandort — alles Spots, nur unterschiedliche Typen). Entspricht |
| int? | — | Nummer des Spots, wenn die ID unbekannt ist. Aufgelöst über |
| string | — | Fallback, wenn weder |
| int? | — | Nummer des Zimmer-Spots für Hotel-/Zimmerabrechnungs-Flows. Aufgelöst gegen einen |
| int? | — | Für zukünftige Erweiterungen reserviert. Wird aktuell akzeptiert, aber ignoriert — für ein Zimmer den |
| ✅ | Wer bestellt — | |
| — | Lieferadresse. Pflicht bei Zustellung. | |
| bool | ✅ |
|
| string | — | Freitext-Notiz des Gastes (Allergene, Sonderwünsche). |
| string | — | Siehe Routing. |
| [Entry] | ✅ | Bestellte Artikel. |
| long? | — | Vorbestellzeitpunkt, Unix-Zeit in Millisekunden UTC. |
| string | — | Abhol-/Lieferreferenz (z. B. |
| decimal? | — | Trinkgeldhöhe. |
| bool | — |
|
| decimal? | ✅ | Summe aller Artikel + Tip. Wird serverseitig gegengeprüft. |
Entry
Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| string | ✅ | Produktnummer in APRO. |
| string | — | Anzeigename — rein informativ; APRO vertraut auf |
| long? | — | Vorbestellzeit pro Artikel. |
| double | ✅ | Bestellmenge. |
| double? | — | Übersteuert den Systempreis dieser Position (Rabatte, Kampagnen). |
| string | — | Artikel-Notiz (z. B. |
| [Addon] | — | Zusatzoptionen. |
Addon
Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| string | ✅ | Produktnummer des Addons. |
| string | — | Anzeigename. |
| double | ✅ | Menge. |
| double? | — | Übersteuert den Systempreis. |
UserInfo
Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| string | — | |
| string | — | |
| string | ✅ | Kontakt-E-Mail für Belege und Status-Updates. |
| string | — | |
| string | — | IETF-Locale, z. B. |
| string | — | Kurzname für Besteller/Abholer. |
DeliveryInfo
Feld | Typ | Beschreibung |
|---|---|---|
| string | Bezeichnung der Lieferadresse. |
| string | Firmenname. |
| string | Ort. |
| string | PLZ. |
| string | Straße. |
| string | Land. |
| string | Stockwerk. |
| string | Stiege. |
| string | Türe. |
| string | Hinweis zur Lieferadresse. |
Beispiele
Minimalbestellung
POST /api/v1/external/order
{
"locationShortCode": "vienna-main",
"takeaway": true,
"userInfo": { "email": "guest@example.com" },
"entries": [{ "productNr": "123", "quantity": 1 }],
"grandTotal": 9.99
}Download: external-order-minimal.json
Vollständige Bestellung mit Lieferung und Beilagen
POST /api/v1/external/order
{
"guid": "123e4567-e89b-12d3-a456-426614174000",
"locationId": 101,
"spotId": 15,
"spotNumber": 10,
"shortCode": "zw1356",
"userInfo": {
"firstName": "Max",
"lastName": "Mustermann",
"email": "max.mustermann@example.com",
"phone": "+491234567890",
"locale": "de-DE",
"nickname": "Max"
},
"takeaway": false,
"note": "Bitte schnell liefern",
"qrCode": "QR1234567890",
"deliveryInfo": {
"name": "Max Mustermann",
"city": "Wien",
"zip": "1010",
"street": "Stephansplatz 1",
"country": "AT",
"floor": "3",
"stairway": "A",
"door": "12"
},
"entries": [
{
"productNr": "123",
"name": "Wiener Schnitzel",
"quantity": 2,
"price": 9.99,
"note": "Extra scharf",
"addons": [
{ "productNr": "501", "name": "Pommes", "quantity": 2, "price": 3.5 }
]
},
{ "productNr": "31231", "name": "Burger Classic", "quantity": 1, "note": "Ohne Zwiebeln" }
],
"preOrderTime": 1723574400000,
"tip": 1.2,
"isPaid": true,
"grandTotal": 28.18
}Download: external-order-full.json
Idempotenz
Setzen Sie guid immer auf eine stabile, client-generierte UUID. APRO nutzt sie zur Deduplizierung bei Retries — geht eine Antwort verloren und Sie senden erneut, ist der zweite POST ein No-Op und liefert Erfolg.
Preisberechnung
APRO berechnet jede Position serverseitig aus productNr neu. price auf einem Entry oder Addon greift nur, wenn explizit übergeben; grandTotal wird mit dem Server-Total abgeglichen, inkonsistente Payloads werden abgelehnt. So wird der Wert zugleich Sicherheitsnetz und Vehikel für Kampagnen-Rabatte.
