Wiri Connect API

Eine leseorientierte REST API zum Abrufen Ihrer Wiri-Daten in Drittanbietersysteme, Dashboards und Integrationen. Verfügbar in Enterprise-Plänen.


Nur Enterprise. Die Wiri Connect API ist im Enterprise-Plan verfügbar. Um einen API-Schlüssel zu generieren, gehen Sie zu Einstellungen → API-Zugang in Ihrem Wiri-Konto.

Authentifizierung

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

Basis-URL

Alle Endpunkte werden von der Wiri-Cloud-Plattform bereitgestellt:

https://app.wiri.food/api/v1/

Endpunkte

MethodeEndpunktBeschreibung
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

Antwortformat

Alle erfolgreichen Antworten geben 200 OK mit einem JSON-Body zurück, der zwei Felder enthält:

{
  "data": [ /* Array von Objekten */ ],
  "count": 42
}

GET /api/v1/items

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
}

GET /api/v1/contacts

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
}

GET /api/v1/invoices

Gibt Rechnungen in absteigender Datumsreihenfolge zurück. Unterstützt folgende Abfrageparameter:

ParameterTypBeispielBeschreibung
statusstringPaidPaid, Unpaid oder Overdue
fromDatum2026-01-01Beginn des Datumsbereichs (einschließlich)
toDatum2026-01-31Ende 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
}

GET /api/v1/sales

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
}

GET /api/v1/orders

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
}

POST /api/v1/orders

Erstellt eine vorausbezahlte Marketplace-Bestellung als Kassensystem-Verkauf mit source=online und payment_status=paid. Gibt bei Erfolg 201 Created zurück.

Anfrage-Body

FeldTypErforderlichBeschreibung
branch_idintegerJaID der Filiale, die die Bestellung erhält
itemsarrayJaPositionen — mindestens eine erforderlich (siehe unten)
customer_namestringNeinAnzeigename des Kunden
customer_phonestringNeinTelefonnummer des Kunden
delivery_addressstringNeinLieferadresse (wird in den Verkaufsnotizen gespeichert)
payment_methodstringNeinZahlungsbezeichnung, z. B. card, mobile_money (wird in den Notizen gespeichert)
marketplace_refstringNeinIhre Bestellreferenz — empfohlen für den Abgleich
tipnumberNeinTrinkgeldbetrag, Standard 0
table_idintegerNeinTisch, dem die Bestellung zugeordnet wird
coversintegerNeinAnzahl der Gedecke / Gäste, Standard 0

Artikel-Objekt

FeldTypErforderlichBeschreibung
item_idintegerNeinKatalog-Artikel-ID — weglassen oder null setzen für nicht gelistete / individuelle Artikel
namestringJaArtikelname, wie er auf dem Beleg erscheinen soll
qtynumberJaMenge, muss größer als 0 sein
pricenumberJaEinzelpreis, 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
notestringNeinKüchenhinweis, z. B. Extra scharf
modifiersarrayNeinMomentaufnahme 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"
}
Nicht gelistete Artikel: Wenn 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.

GET /api/v1/reservations

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
}

POST /api/v1/reservations

Erstellt eine Tischreservierung vom Marketplace. Gibt bei Erfolg 201 Created zurück.

Anfrage-Body

FeldTypErforderlichBeschreibung
party_namestringJaName der Gruppe / des Buchungskontakts
party_sizeintegerJaAnzahl der Gäste (muss ≥ 1 sein)
datestringJaReservierungsdatum im Format YYYY-MM-DD
timestringJaReservierungszeit im Format HH:MM (24-Stunden)
branch_idintegerNeinFiliale, der die Reservierung zugeordnet wird
table_idintegerNeinBestimmter zu reservierender Tisch
duration_minsintegerNeinErwartete Dauer in Minuten, Standard 90
notesstringNeinBesondere Wünsche oder Hinweise
marketplace_refstringNeinIhre 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"
}

Fehlerantworten

HTTP-StatusBodyWann
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

API-Schlüssel generieren

  1. Melden Sie sich in Ihrem Wiri-Konto an (Enterprise-Plan erforderlich).
  2. Gehen Sie zu Einstellungen → API-Zugang.
  3. Klicken Sie auf API-Schlüssel generieren. Ihr Schlüssel beginnt mit wk_.
  4. Kopieren Sie den Schlüssel sofort — er wird nach der Generierung nur einmal vollständig angezeigt.
  5. Um den Schlüssel zu rotieren, klicken Sie auf Schlüssel neu generieren. Der alte Schlüssel hört sofort auf zu funktionieren.
Halten Sie Ihren Schlüssel geheim. Jeder mit Ihrem API-Schlüssel kann alle Ihre Geschäftsdaten lesen. Committen Sie ihn nicht in die Versionskontrolle oder stellen Sie ihn nicht in clientseitigem Code bloß.

Verwandt: Einstellungen · WiriMarket Connect (Integration von Drittanbieter-Kassensystemen)