API Checkout v1

La fidélité Sourdi, intégrée à votre checkout.

Affichez un QR à usage unique après le paiement afin que le client collecte ses tampons ou ses points dans l’application Sourdi.

Parcourir la documentation

Démarrage rapide

L’API est disponible pour les commerces actifs ayant un programme de fidélité à tampons ou à points.

1Créez votre clé

Dans Tableau marchand → Paramètres → API checkout.

2Appelez Sourdi côté serveur

Après paiement, envoyez le montant de fidélité et l’identifiant unique de la commande.

3Affichez le QR retourné

Transmettez uniquement l’image à la page de confirmation pour que le client la scanne.

Authentification

Transmettez la clé avec le schéma Bearer dans l’en-tête Authorization. Les clés dans l’URL ou le corps sont refusées.

Authorization: Bearer sourdi_live_KEY_ID.API_SECRET
Content-Type: application/json
La clé n’est visible qu’une fois.

Une seule clé peut être active. Après révocation, elle cesse de fonctionner immédiatement et une nouvelle clé peut être créée.

Affichage web

Checkout d’une carte à tampons

À la confirmation du paiement, votre serveur demande un stamp_code signé. Le QR est lié à votre commerce, expire après 10 minutes par défaut et ne peut être validé qu’une fois.

POST/api/v1/checkout/stamps

Requête serveur

curl --request POST "/api/v1/checkout/stamps" \
  --header "Authorization: Bearer $SOURDI_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "stamps": 2,
    "transaction_id": "order-2026-000184"
  }'
ChampTypeDescription
stamps requisintegerNombre de tampons à collecter : 1, 2 ou 3.
transaction_id requisstringIdentifiant stable et unique de la commande, de 8 à 128 caractères.

Réponse — HTTP 201

{
  "status": true,
  "data": {
    "reward_type": "stamps",
    "stamps": 2,
    "stamp_code": "sourdi_checkout_v1.…",
    "transaction_id": "order-2026-000184",
    "expires_at": "2026-08-14T12:10:00.000Z",
    "qr": {
      "data": "sourdi_checkout_v1.…",
      "image_data_url": "data:image/png;base64,iVBOR…"
    }
  },
  "idempotent_replay": false
}
Affichage web

Checkout d’une carte à points

Pour une carte à points, le checkout retourne un QR adapté au solde de crédits. Le client le scanne avec la même fonctionnalité de scan de l’application ; les points sont ajoutés après validation serveur.

POST/api/v1/checkout/points

Requête serveur

curl --request POST "/api/v1/checkout/points" \
  --header "Authorization: Bearer $SOURDI_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "points": 25,
    "transaction_id": "order-2026-000185",
    "purchases": ["PRODUCT-001", "PRODUCT-002"]
  }'
ChampTypeDescription
points requisintegerDe 1 à 100 000 points à créditer.
transaction_id requisstringIdentifiant stable et unique de la commande.
purchasesstring[]Jusqu’à 100 références produit facultatives.

Réponse — HTTP 201

{
  "status": true,
  "data": {
    "reward_type": "points",
    "points": 25,
    "transaction_id": "order-2026-000185",
    "expires_at": "2026-08-14T12:10:00.000Z",
    "qr": {
      "data": "sourdi_checkout_v1.…",
      "image_data_url": "data:image/png;base64,iVBOR…"
    }
  },
  "idempotent_replay": false
}

Afficher le QR sur la page de confirmation

Votre backend appelle Sourdi avec la clé secrète, puis renvoie uniquement data.qr.image_data_url à votre navigateur. L’exemple suivant suppose que votre propre endpoint /api/order/reward effectue cet appel serveur-à-serveur.


        
Ne transmettez jamais la clé API au navigateur.

Le navigateur reçoit l’image du QR, jamais l’en-tête Authorization. Servez la page et votre endpoint de commande en HTTPS.

Points directs

Alternative : transaction directe de points

Une caisse qui lit déjà l’identifiant de carte peut créditer ou débiter le solde sans afficher de QR. Cette route est réservée aux programmes à points.

POST/api/v1/points/transactions
curl --request POST "/api/v1/points/transactions" \
  --header "Authorization: Bearer $SOURDI_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "card_id": "66b8a42f9759d5ee8c90c123",
    "points": -20,
    "transaction_id": "ticket-2026-000186"
  }'

Retries, expiration et usage unique

En cas de coupure réseau, renvoyez exactement la même requête avec le même transaction_id. Tant que le QR est valide et inutilisé, l’API retourne le même QR avec HTTP 200 et idempotent_replay: true.

Un transaction_id ne peut pas être réutilisé avec un autre type, montant ou panier. Après expiration, créez une nouvelle opération avec un nouvel identifiant. Dès qu’un QR est scanné, toute nouvelle tentative est refusée globalement, même depuis une autre carte.

Erreurs

HTTPCodeAction recommandée
400Invalid inputCorriger les champs envoyés.
401INVALID_API_KEYVérifier la clé ou en créer une nouvelle après révocation.
403LOYALTY_API_NOT_ENABLEDActiver le programme de fidélité du commerce.
403STAMPS_API_NOT_ENABLED / POINTS_API_NOT_ENABLEDUtiliser la route correspondant au type de carte du commerce.
409IDEMPOTENCY_CONFLICTUtiliser un nouvel identifiant pour une nouvelle commande.
409CHECKOUT_QR_ALREADY_USEDNe pas appliquer la fidélité une seconde fois.
410CHECKOUT_QR_EXPIREDGénérer un nouveau QR avec un nouveau transaction_id.
429RATE_LIMITEDRespecter RateLimit-Reset avant de réessayer.

Bonnes pratiques de sécurité

  • Appelez l’API exclusivement depuis votre serveur ou un terminal sécurisé, toujours en HTTPS.
  • N’insérez jamais la clé dans le JavaScript du navigateur, une application mobile, Git, les logs ou les outils d’analytics.
  • Masquez les en-têtes Authorization et les données QR dans les journaux.
  • Rendez le QR uniquement après confirmation effective du paiement et ne le placez pas dans une page mise en cache.
  • Révoquez immédiatement une clé suspectée d’avoir fuité, puis générez-en une nouvelle.
  • Utilisez un transaction_id unique par commerce et conservez-le avec la commande.