Rechercher dans la documentation

Trouver une page ou une section

Webhooks — être prévenu chez toi

S’abonner

POST /seller/webhooks (authentifié en tant que vendeur) avec l’URL de ton endpoint et les évènements voulus :

JSON
{ "url": "https://ma-boutique.ci/webhooks/generale-ci", "events": ["ORDER_CREATED"] }

La réponse contient le secret de signature — affiché une seule fois.

Évènements disponibles : ORDER_CREATED, ORDER_STATUS_CHANGED, ORDER_CANCELLED, STOCK_CHANGED.

Ce que tu reçois

JSON
{
  "event": "ORDER_CREATED",
  "deliveryId": "cly…",
  "data": {
    "orderId": "CMD-4821",
    "status": "confirmed",
    "createdAt": "2026-07-21T15:04:11.000Z",
    "currency": "XOF",
    "lines": [
      { "itemId": "cl…", "sourceRef": "998877", "name": "Sac cuir", "qty": 1, "unitPrice": 25000, "discount": 0 }
    ]
  }
}

sourceRef est l’identifiant du produit chez toi — c’est lui qui te permet de retrouver ta propre fiche produit.

Tu ne reçois que tes lignes : si la commande contient les articles de plusieurs boutiques, chacun ne voit que les siennes.

Vérifier la signature (obligatoire)

Chaque appel porte deux en-têtes :

HTTP
x-gci-signature: t=1800000000,v1=<hmac_sha256_hex>
x-gci-timestamp: 1800000000

La signature est le HMAC-SHA256 de "<timestamp>.<corps brut>" avec ton secret. Vérifie-la avant de traiter quoi que ce soit — sinon n’importe qui peut t’envoyer de fausses commandes.

JavaScript
const crypto = require('crypto');
 
function verifierSignature(secret, corpsBrut, entete) {
  const parts = Object.fromEntries(entete.split(',').map((p) => p.split('=')));
  const age = Math.abs(Math.floor(Date.now() / 1000) - Number(parts.t));
  if (!Number.isFinite(age) || age > 300) return false; // anti-rejeu
 
  const attendu = crypto
    .createHmac('sha256', secret)
    .update(`${parts.t}.${corpsBrut}`)
    .digest('hex');
  return crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(attendu));
}

Réponse attendue et réessais

Réponds 2xx rapidement (moins de 8 secondes). Tout le reste est considéré comme un échec et rejoué avec un espacement croissant : 1 min, 5 min, 15 min, 1 h, 4 h, jusqu’à 6 tentatives.

Après 10 échecs consécutifs, l’abonnement est suspendu — tu le réactives depuis l’app.

Outils

MéthodeCheminRôle
GET/seller/webhooks/deliveriesJournal de tes livraisons
POST/seller/webhooks/:id/testEnvoyer un évènement de test à ton URL

Pour voir ton endpoint appelé par une vraie commande de test signée, utilise une clé sandbox : Tester sans risque.

Simuler une commande maintenant

POST/partner/v1/sandbox/ordersEssayer
Colle ta clé d’API d’abord.
Commande cURL équivalente
curl -X POST 'https://backend.generale-ci.com/partner/v1/sandbox/orders' \
  -H 'X-Api-Key: VOTRE_CLE' \
  -H 'Content-Type: application/json' \
  -d '{
  "itemIds": []
}'