API Wiri Connect

Une API REST orientée lecture pour extraire vos données Wiri dans des systèmes tiers, tableaux de bord et intégrations. Disponible sur les plans Enterprise.


Enterprise uniquement. L'API Wiri Connect est disponible sur le plan Enterprise. Pour générer une clé API, allez dans Paramètres → Accès API dans votre compte Wiri.

Authentification

Chaque requête doit inclure votre clé API dans l'en-tête Authorization en tant que jeton Bearer :

# Exemple avec curl
curl https://app.wiri.food/api/v1/items \
  -H "Authorization: Bearer wk_votre_cle_api"

Si la clé est manquante ou invalide, l'API retourne 401 Unauthorized :

{
  "error": "Invalid API key."
}

URL de base

Tous les points de terminaison sont servis depuis la plateforme cloud Wiri :

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

Points de terminaison

MéthodePoint de terminaisonDescription
GET /api/v1/items Lister tous les articles du menu
GET /api/v1/contacts Lister tous les clients / contacts
GET /api/v1/invoices Lister les factures — supporte ?status, ?from, ?to
GET /api/v1/sales Lister les ventes caisse — supporte ?status, ?from, ?to
GET /api/v1/orders Lister les commandes du marketplace — supporte ?status, ?from, ?to
POST /api/v1/orders Créer une commande marketplace prépayée
GET /api/v1/reservations Lister les réservations à venir — supporte ?days, ?date
POST /api/v1/reservations Créer une réservation de table depuis le marketplace

Format de réponse

Toutes les réponses réussies retournent 200 OK avec un corps JSON contenant deux champs :

{
  "data": [ /* tableau d'objets */ ],
  "count": 42
}

GET /api/v1/items

Retourne tous les articles du menu de votre compte, classés alphabétiquement. Chaque article inclut un tableau modifier_groups — les mêmes groupes/options de modificateurs configurés dans Paramètres → Modificateurs pour cet article, afin que vous puissiez présenter et facturer les suppléments exactement comme configurés dans Wiri.

# Requête
curl https://app.wiri.food/api/v1/items \
  -H "Authorization: Bearer wk_..."

# Réponse
{
  "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

Retourne tous les contacts (clients) de votre compte, classés par nom.

# Réponse
{
  "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

Retourne les factures classées par date décroissante. Supporte les paramètres de requête suivants :

ParamètreTypeExempleDescription
statusstringPaidPaid, Unpaid ou Overdue
fromdate2026-01-01Début de la plage de dates (inclus)
todate2026-01-31Fin de la plage de dates (inclus)
# Récupérer toutes les factures payées de janvier 2026
curl "https://app.wiri.food/api/v1/invoices?status=Paid&from=2026-01-01&to=2026-01-31" \
  -H "Authorization: Bearer wk_..."

# Réponse
{
  "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

Retourne les ventes caisse classées par date décroissante. Supporte les mêmes paramètres que les factures, status acceptant paid ou voided.

# Récupérer toutes les ventes d'une journée
curl "https://app.wiri.food/api/v1/sales?from=2026-07-01&to=2026-07-01" \
  -H "Authorization: Bearer wk_..."

# Réponse
{
  "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

Retourne les commandes du marketplace (source = online) classées par date décroissante, jusqu'à 200 résultats. Supporte les mêmes paramètres ?status, ?from et ?to que /api/v1/sales.

# Récupérer les commandes marketplace d'aujourd'hui
curl "https://app.wiri.food/api/v1/orders?from=2026-07-01&to=2026-07-01" \
  -H "Authorization: Bearer wk_..."

# Réponse
{
  "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

Crée une commande marketplace prépayée sous forme de vente caisse avec source=online et payment_status=paid. Retourne 201 Created en cas de succès.

Corps de la requête

ChampTypeRequisDescription
branch_idintegerOuiID de la filiale qui reçoit la commande
itemsarrayOuiLignes de commande — au moins une requise (voir ci-dessous)
customer_namestringNonNom affiché du client
customer_phonestringNonNuméro de téléphone du client
delivery_addressstringNonAdresse de livraison (stockée dans les notes de la vente)
payment_methodstringNonLibellé du mode de paiement, ex. card, mobile_money (stocké dans les notes)
marketplace_refstringNonVotre référence de commande — recommandé pour le rapprochement
tipnumberNonMontant du pourboire, par défaut 0
table_idintegerNonTable à associer à la commande
coversintegerNonNombre de couverts / convives, par défaut 0

Objet article

ChampTypeRequisDescription
item_idintegerNonID de l'article au catalogue — omettre ou mettre null pour un article non répertorié / personnalisé
namestringOuiNom de l'article tel qu'il doit apparaître sur le reçu
qtynumberOuiQuantité, doit être supérieure à 0
pricenumberOuiPrix unitaire, doit être ≥ 0. Doit déjà inclure l'ajustement de prix des modificateurs sélectionnés — c'est ce qui est facturé ; modifiers ci-dessous n'est qu'un aperçu d'affichage/de reporting
notestringNonNote pour la cuisine, ex. Extra spicy
modifiersarrayNonAperçu des modificateurs sélectionnés pour le bon de cuisine / le reporting, ex. [{"name": "Large", "price_adjustment": 5.00}] — informatif uniquement, n'affecte pas le price facturé
# Créer une commande marketplace
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
  }'

# Réponse 201
{
  "id": 142,
  "receipt_number": "MKT-000142",
  "total": 95.00,
  "status": "open"
}
Articles non répertoriés : Si item_id est omis ou null, l'article est enregistré comme une ligne personnalisée sur la vente. Utile pour les suppléments, les spéciaux ou les articles pas encore dans votre catalogue.

GET /api/v1/reservations

Retourne les réservations à venir avec le statut pending ou confirmed. Utilisez ?days=N (par défaut 7, max 90) pour regarder N jours à l'avance, ou ?date=YYYY-MM-DD pour une seule date.

# Récupérer les réservations des 14 prochains jours
curl "https://app.wiri.food/api/v1/reservations?days=14" \
  -H "Authorization: Bearer wk_..."

# Réponse
{
  "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

Crée une réservation de table depuis le marketplace. Retourne 201 Created en cas de succès.

Corps de la requête

ChampTypeRequisDescription
party_namestringOuiNom du groupe / contact de la réservation
party_sizeintegerOuiNombre de convives (doit être ≥ 1)
datestringOuiDate de réservation au format YYYY-MM-DD
timestringOuiHeure de réservation au format HH:MM (24 heures)
branch_idintegerNonFiliale à laquelle affecter la réservation
table_idintegerNonTable spécifique à réserver
duration_minsintegerNonDurée prévue en minutes, par défaut 90
notesstringNonDemandes spéciales ou notes
marketplace_refstringNonVotre référence de réservation — recommandé pour les mises à jour de statut
# Créer une réservation
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"
  }'

# Réponse 201
{
  "id": 23,
  "status": "pending"
}

Réponses d'erreur

Statut HTTPCorpsQuand
401{"error": "Invalid API key."}Clé manquante, incorrecte ou révoquée
401{"error": "Missing or malformed Authorization header."}En-tête absent ou pas au format Bearer
400{"error": "Invalid JSON body."}Corps POST manquant ou JSON invalide
404{"error": "Unknown endpoint."}Nom de ressource non dans la liste autorisée
405{"error": "Method not allowed."}Mauvaise méthode HTTP pour un point de terminaison POST uniquement
422{"error": "..."} ou {"errors": ["..."]}Le corps de la requête a échoué la validation — ex. champ requis manquant, filiale/table introuvable
500{"error": "Failed to create ... Please try again."}Erreur serveur inattendue lors de l'enregistrement de la requête

Générer une clé API

  1. Connectez-vous à votre compte Wiri (plan Enterprise requis).
  2. Allez dans Paramètres → Accès API.
  3. Cliquez sur Générer une clé API. Votre clé commence par wk_.
  4. Copiez la clé immédiatement — elle est affichée en entier une seule fois après la génération.
  5. Pour renouveler la clé, cliquez sur Régénérer la clé. L'ancienne clé cesse de fonctionner immédiatement.
Gardez votre clé secrète. Toute personne disposant de votre clé API peut lire toutes vos données commerciales. Ne la commitez pas dans le contrôle de version et ne l'exposez pas dans du code côté client.

Voir aussi : Paramètres · WiriMarket Connect (intégration POS tierce)