Aller au contenu principal

Webhooks

STOA Platform peut notifier des systèmes externes lorsque des événements du cycle de vie des abonnements se produisent. Les webhooks délivrent des requêtes HTTP POST à vos endpoints avec des payloads signés.

Types d'Événements

ÉvénementDéclencheurPayload Inclus
subscription.createdNouvelle demande d'abonnementID d'abonnement, API, consommateur, plan
subscription.approvedAbonnement approuvé par un adminID d'abonnement, clé API (si générée)
subscription.revokedAbonnement révoquéID d'abonnement, raison
subscription.key_rotatedClé API renouveléeID d'abonnement, nouveau préfixe de clé
subscription.expiredTTL d'abonnement expiréID d'abonnement, date d'expiration

Utilisez ["*"] pour vous abonner à tous les types d'événements.

Créer un Webhook

Via l'API

Configure your environment

The examples below use environment variables. Set them for your STOA instance:

export STOA_API_URL="https://api.gostoa.dev"       # Replace with your domain
export STOA_AUTH_URL="https://auth.gostoa.dev" # Keycloak OIDC provider
export STOA_GATEWAY_URL="https://mcp.gostoa.dev" # MCP Gateway endpoint

Self-hosted? Replace gostoa.dev with your domain.

curl -X POST "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-system.example.com/stoa-events",
"events": ["subscription.created", "subscription.approved"],
"secret": "your-hmac-secret-min-32-chars-long",
"enabled": true,
"custom_headers": {
"X-Source": "stoa-platform"
}
}'

Via le Portail

  1. Accédez à Webhooks dans la barre latérale du Portail
  2. Cliquez sur Créer un Webhook
  3. Saisissez l'URL cible et sélectionnez les types d'événements
  4. Définissez un secret de signature (minimum 32 caractères)
  5. Ajoutez optionnellement des en-têtes personnalisés
  6. Cliquez sur Enregistrer

Format du Payload

Chaque livraison webhook envoie un payload JSON :

{
"event": "subscription.approved",
"timestamp": "2026-02-13T10:30:00Z",
"webhook_id": "wh_abc123",
"data": {
"subscription_id": "sub_xyz789",
"api_id": "api_456",
"api_name": "Payment API",
"consumer_id": "consumer_012",
"plan": "standard",
"status": "approved"
}
}

Vérification de Signature HMAC-SHA256

Chaque livraison inclut un en-tête de signature pour la vérification du payload :

X-STOA-Signature: sha256=<hex-encoded-hmac>

Exemple de Vérification (Python)

import hmac
import hashlib

def verify_signature(payload: bytes, secret: str, signature_header: str) -> bool:
expected = hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
received = signature_header.removeprefix("sha256=")
return hmac.compare_digest(expected, received)

Exemple de Vérification (Node.js)

const crypto = require('crypto');

function verifySignature(payload, secret, signatureHeader) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
const received = signatureHeader.replace('sha256=', '');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(received)
);
}

Utilisez toujours une comparaison à temps constant pour prévenir les attaques temporelles.

Politique de Nouvelle Tentative

Les livraisons échouées (réponse non-2xx ou timeout) sont réessayées avec un backoff exponentiel :

TentativeDélaiAttente Cumulée
1Immédiat0
21 minute1 min
35 minutes6 min
415 minutes21 min
51 heure1h 21min

Après 5 tentatives échouées, la livraison est marquée comme failed. Aucune nouvelle tentative automatique n'est effectuée.

Suivi des Livraisons

Consulter l'Historique des Livraisons

curl "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks/{webhook_id}/deliveries" \
-H "Authorization: Bearer $TOKEN"

Chaque enregistrement de livraison inclut :

ChampDescription
statussuccess, failed, pending
status_codeCode de réponse HTTP de votre endpoint
response_bodyPremier Ko de la réponse (pour débogage)
attemptNuméro de tentative (1-5)
created_atHorodatage de livraison

Réessayer une Livraison Échouée

curl -X POST "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks/{webhook_id}/deliveries/{delivery_id}/retry" \
-H "Authorization: Bearer $TOKEN"

Tester les Webhooks

Envoyez un événement de test pour vérifier votre endpoint avant la mise en production :

curl -X POST "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks/{webhook_id}/test" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"event_type": "subscription.created"}'

La livraison de test utilise des données synthétiques et est marquée test: true dans le payload.

Gérer les Webhooks

Lister les Webhooks

curl "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks" \
-H "Authorization: Bearer $TOKEN"

Désactiver un Webhook

curl -X PATCH "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks/{webhook_id}" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled": false}'

Supprimer un Webhook

curl -X DELETE "${STOA_API_URL}/v1/tenants/{tenant_id}/webhooks/{webhook_id}" \
-H "Authorization: Bearer $TOKEN"

Bonnes Pratiques

  1. Vérifiez toujours les signatures — rejetez les payloads non signés ou incorrectement signés
  2. Répondez rapidement — retournez un 200 dans les 5 secondes ; traitez de manière asynchrone
  3. Gérez les doublons — utilisez webhook_id + timestamp pour l'idempotence
  4. Utilisez HTTPS — les URLs de webhook doivent utiliser TLS en production
  5. Renouvelez les secrets — mettez à jour le secret webhook périodiquement via PATCH
  6. Surveillez les livraisons — vérifiez l'historique des livraisons dans le Portail pour les échecs

Voir Aussi