Eine leseorientierte REST API zum Abrufen Ihrer Wiri-Daten in Drittanbietersysteme, Dashboards und Integrationen. Verfügbar in Enterprise-Plänen.
Jede Anfrage muss Ihren API-Schlüssel im Authorization-Header als Bearer-Token enthalten:
# Beispiel mit curl curl https://app.wiri.food/api/v1/items \ -H "Authorization: Bearer wk_ihr_api_schluessel_hier"
Wenn der Schlüssel fehlt oder ungültig ist, gibt die API 401 Unauthorized zurück:
{
"error": "Invalid API key."
}
Alle Endpunkte werden von der Wiri-Cloud-Plattform bereitgestellt:
https://app.wiri.food/api/v1/
| Methode | Endpunkt | Beschreibung |
|---|---|---|
| GET | /api/v1/items |
Alle Menüartikel auflisten |
| GET | /api/v1/contacts |
Alle Kunden / Kontakte auflisten |
| GET | /api/v1/invoices |
Rechnungen auflisten — unterstützt ?status, ?from, ?to |
| GET | /api/v1/sales |
Kassensystem-Verkäufe auflisten — unterstützt ?status, ?from, ?to |
| GET | /api/v1/orders |
Marketplace-Bestellungen auflisten — unterstützt ?status, ?from, ?to |
| POST | /api/v1/orders |
Eine vorausbezahlte Marketplace-Bestellung erstellen |
| GET | /api/v1/reservations |
Anstehende Reservierungen auflisten — unterstützt ?days, ?date |
| POST | /api/v1/reservations |
Eine Tischreservierung vom Marketplace erstellen |
Alle erfolgreichen Antworten geben 200 OK mit einem JSON-Body zurück, der zwei Felder enthält:
{
"data": [ /* Array von Objekten */ ],
"count": 42
}
Gibt alle Menüartikel Ihres Kontos zurück, alphabetisch geordnet. Jeder Artikel enthält ein modifier_groups-Array — dieselben Modifikationsgruppen/-optionen, die unter Einstellungen → Modifikatoren für diesen Artikel konfiguriert sind, sodass Sie Zusatzoptionen genau so darstellen und bepreisen können, wie sie in Wiri konfiguriert wurden.
# Anfrage curl https://app.wiri.food/api/v1/items \ -H "Authorization: Bearer wk_..." # Antwort { "data": [ { "id": 1, "name": "Jollof Rice", "rate": "45.00", "unit": "plate", "description": null, "category": 3, "modifier_groups": [ { "id": 2, "name": "Spice Level", "min_selections": 1, "max_selections": 1, "is_required": true, "options": [ { "id": 5, "name": "Mild", "price": 0 }, { "id": 6, "name": "Hot", "price": 0 } ] } ] } ], "count": 1 }
Gibt alle Kontakte (Kunden) Ihres Kontos zurück, nach Name geordnet.
# Antwort { "data": [ { "id": 12, "display_name": "Ama Owusu", "email": "ama@example.com", "mobile": "+233201234567", "address": null, "type": "individual", "created_at": "2026-01-15 09:22:00" } ], "count": 1 }
Gibt Rechnungen in absteigender Datumsreihenfolge zurück. Unterstützt folgende Abfrageparameter:
| Parameter | Typ | Beispiel | Beschreibung |
|---|---|---|---|
status | string | Paid | Paid, Unpaid oder Overdue |
from | Datum | 2026-01-01 | Beginn des Datumsbereichs (einschließlich) |
to | Datum | 2026-01-31 | Ende des Datumsbereichs (einschließlich) |
# Alle bezahlten Rechnungen für Januar 2026 abrufen curl "https://app.wiri.food/api/v1/invoices?status=Paid&from=2026-01-01&to=2026-01-31" \ -H "Authorization: Bearer wk_..." # Antwort { "data": [ { "id": 88, "invoice_number": "INV-00088", "date": "2026-01-20", "due_date": "2026-02-03", "amount": "250.00", "tax": "37.50", "total": "287.50", "status": "Paid", "customer": "Ama Owusu" } ], "count": 1 }
Gibt Kassensystem-Verkäufe in absteigender Datumsreihenfolge zurück. Unterstützt dieselben Abfrageparameter wie Rechnungen, wobei status die Werte paid oder voided akzeptiert.
# Alle Verkäufe eines Tages abrufen curl "https://app.wiri.food/api/v1/sales?from=2026-07-01&to=2026-07-01" \ -H "Authorization: Bearer wk_..." # Antwort { "data": [ { "id": 201, "receipt_number": "RCP-00201", "date": "2026-07-01 13:45:00", "amount_due": "120.00", "payment_mode": "0", "covers": 3, "status": "paid", "voided_at": null, "voided_reason": null, "customer": null } ], "count": 1 }
Gibt Marketplace-Bestellungen (source = online) in absteigender Datumsreihenfolge zurück, bis zu 200 Ergebnisse. Unterstützt dieselben Abfrageparameter ?status, ?from und ?to wie /api/v1/sales.
# Die heutigen Marketplace-Bestellungen abrufen curl "https://app.wiri.food/api/v1/orders?from=2026-07-01&to=2026-07-01" \ -H "Authorization: Bearer wk_..." # Antwort { "data": [ { "id": 142, "receipt_number": "MKT-000142", "marketplace_ref": "MKT-20260701-001", "date": "2026-07-01 12:30:00", "status": "open", "payment_status": "paid", "amount_due": "85.00", "tip": "5.00", "customer_name": "Jane Doe", "customer_phone": "+233241234567", "branch": "Main Branch" } ], "count": 1 }
Erstellt eine vorausbezahlte Marketplace-Bestellung als Kassensystem-Verkauf mit source=online und payment_status=paid. Gibt bei Erfolg 201 Created zurück.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
branch_id | integer | Ja | ID der Filiale, die die Bestellung erhält |
items | array | Ja | Positionen — mindestens eine erforderlich (siehe unten) |
customer_name | string | Nein | Anzeigename des Kunden |
customer_phone | string | Nein | Telefonnummer des Kunden |
delivery_address | string | Nein | Lieferadresse (wird in den Verkaufsnotizen gespeichert) |
payment_method | string | Nein | Zahlungsbezeichnung, z. B. card, mobile_money (wird in den Notizen gespeichert) |
marketplace_ref | string | Nein | Ihre Bestellreferenz — empfohlen für den Abgleich |
tip | number | Nein | Trinkgeldbetrag, Standard 0 |
table_id | integer | Nein | Tisch, dem die Bestellung zugeordnet wird |
covers | integer | Nein | Anzahl der Gedecke / Gäste, Standard 0 |
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
item_id | integer | Nein | Katalog-Artikel-ID — weglassen oder null setzen für nicht gelistete / individuelle Artikel |
name | string | Ja | Artikelname, wie er auf dem Beleg erscheinen soll |
qty | number | Ja | Menge, muss größer als 0 sein |
price | number | Ja | Einzelpreis, muss ≥ 0 sein. Muss bereits den Preiszuschlag ausgewählter Modifikatoren enthalten — dies ist der berechnete Betrag; modifiers weiter unten ist nur eine Anzeige-/Berichts-Momentaufnahme |
note | string | Nein | Küchenhinweis, z. B. Extra scharf |
modifiers | array | Nein | Momentaufnahme der gewählten Modifikatoren für den Küchenbeleg / die Berichterstattung, z. B. [{"name": "Large", "price_adjustment": 5.00}] — nur informativ, wirkt sich nicht auf den berechneten price aus |
# Eine Marketplace-Bestellung erstellen curl -X POST https://app.wiri.food/api/v1/orders \ -H "Authorization: Bearer wk_..." \ -H "Content-Type: application/json" \ -d '{ "branch_id": 1, "items": [ { "item_id": 5, "name": "Jollof Rice", "qty": 2, "price": 40.00, "note": "Extra spicy", "modifiers": [{ "name": "Spicy", "price_adjustment": 5.00 }] }, { "name": "Bottled Water", "qty": 2, "price": 5.00 } ], "customer_name": "Jane Doe", "customer_phone": "+233241234567", "delivery_address": "15 Independence Ave", "payment_method": "card", "marketplace_ref": "MKT-20260701-001", "tip": 5.00 }' # Antwort 201 { "id": 142, "receipt_number": "MKT-000142", "total": 95.00, "status": "open" }
item_id weggelassen oder null ist, wird der Artikel als individuelle Position auf dem Verkauf gespeichert. Nützlich für Extras, Aktionsangebote oder Artikel, die noch nicht in Ihrem Katalog sind.
Gibt anstehende Reservierungen mit Status pending oder confirmed zurück. Verwenden Sie ?days=N (Standard 7, max. 90), um N Tage vorauszuschauen, oder ?date=YYYY-MM-DD für ein einzelnes Datum.
# Reservierungen für die nächsten 14 Tage abrufen curl "https://app.wiri.food/api/v1/reservations?days=14" \ -H "Authorization: Bearer wk_..." # Antwort { "data": [ { "id": 23, "party_name": "Smith party", "party_size": 4, "reserved_date": "2026-07-15", "reserved_time": "19:30:00", "duration_mins": 90, "status": "pending", "source": "marketplace", "marketplace_ref": "MKT-RES-20260715-1", "notes": "Anniversary dinner", "table_name": "Table 4", "branch": "Main Branch" } ], "count": 1 }
Erstellt eine Tischreservierung vom Marketplace. Gibt bei Erfolg 201 Created zurück.
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
party_name | string | Ja | Name der Gruppe / des Buchungskontakts |
party_size | integer | Ja | Anzahl der Gäste (muss ≥ 1 sein) |
date | string | Ja | Reservierungsdatum im Format YYYY-MM-DD |
time | string | Ja | Reservierungszeit im Format HH:MM (24-Stunden) |
branch_id | integer | Nein | Filiale, der die Reservierung zugeordnet wird |
table_id | integer | Nein | Bestimmter zu reservierender Tisch |
duration_mins | integer | Nein | Erwartete Dauer in Minuten, Standard 90 |
notes | string | Nein | Besondere Wünsche oder Hinweise |
marketplace_ref | string | Nein | Ihre Buchungsreferenz — empfohlen für Statusaktualisierungen |
# Eine Reservierung erstellen curl -X POST https://app.wiri.food/api/v1/reservations \ -H "Authorization: Bearer wk_..." \ -H "Content-Type: application/json" \ -d '{ "party_name": "Smith party", "party_size": 4, "date": "2026-07-15", "time": "19:30", "branch_id": 1, "table_id": 3, "duration_mins": 90, "notes": "Anniversary dinner", "marketplace_ref": "MKT-RES-20260715-1" }' # Antwort 201 { "id": 23, "status": "pending" }
| HTTP-Status | Body | Wann |
|---|---|---|
401 | {"error": "Invalid API key."} | Schlüssel fehlt, falsch oder widerrufen |
401 | {"error": "Missing or malformed Authorization header."} | Header fehlt oder nicht im Bearer-Format |
400 | {"error": "Invalid JSON body."} | POST-Body fehlt oder ist kein gültiges JSON |
404 | {"error": "Unknown endpoint."} | Ressourcenname nicht in der erlaubten Liste |
405 | {"error": "Method not allowed."} | Falsche HTTP-Methode für einen reinen POST-Endpunkt |
422 | {"error": "..."} oder {"errors": ["..."]} | Anfrage-Body hat die Validierung nicht bestanden — z. B. fehlendes Pflichtfeld, Filiale/Tisch nicht gefunden |
500 | {"error": "Failed to create ... Please try again."} | Unerwarteter Serverfehler beim Speichern der Anfrage |
wk_.Verwandt: Einstellungen · WiriMarket Connect (Integration von Drittanbieter-Kassensystemen)