Webhooks
Les webhooks délivrent des notifications HTTP POST en temps réel lorsque des tâches asynchrones en arrière-plan se terminent, comme une publication réussie, un échec ou l’envoi d’une réponse.
📌 Points de terminaison (Endpoints)
Section intitulée « 📌 Points de terminaison (Endpoints) »| Méthode | Chemin | Description | Portée (Scope) requise |
|---|---|---|---|
POST | /v1/brand/webhooks | Enregistrer un nouveau point de terminaison de webhook | webhooks:write ou * |
GET | /v1/brand/webhooks | Lister les abonnements aux webhooks enregistrés | webhooks:read ou * |
DELETE | /v1/brand/webhooks/{webhook_id} | Supprimer un abonnement au webhook | webhooks:write ou * |
🔔 Types d’événements pris en charge
Section intitulée « 🔔 Types d’événements pris en charge »| Nom de l’événement | Condition de déclenchement |
|---|---|
sns.publish.succeeded | Publication réussie sur le réseau social cible |
sns.publish.failed | Échec de la publication (inclut le code d’erreur et l’éligibilité à une tentative) |
sns.publish.blocked_entitlement | Publication bloquée en raison des limites de quota ou d’un forfait expiré |
sns.reply.succeeded | Commentaire de réponse publié avec succès |
sns.reply.failed | Échec de l’envoi du commentaire de réponse |
sns.provider.notification_received | Webhook en temps réel reçu du fournisseur SNS externe |
📦 Exemple de charge utile de webhook (sns.publish.succeeded)
Section intitulée « 📦 Exemple de charge utile de webhook (sns.publish.succeeded) »{ "event_id": "evt_01jm8za2example", "event_type": "sns.publish.succeeded", "schema_version": 1, "occurred_at": "2026-08-16T03:30:00Z", "brand_ref": "brand_01jm8v4k9example", "trace_id": "trc_9a8b7c6d", "data": { "content_id": "content_01jm8za2example", "publish_job_id": "job_01jm8za2jobexample", "sns_type": "instagram", "connection_id": "conn_01jm8x9k2example", "provider_post_id": "18029384756102938", "status": "succeeded" }}🔐 Vérification de signature (HMAC SHA256)
Section intitulée « 🔐 Vérification de signature (HMAC SHA256) »Les requêtes de webhook incluent des en-têtes de vérification personnalisés :
Social-Webhook-Signature: Charge utile de signature (v1=hex_signature)Social-Webhook-Timestamp: Horodatage Unix en secondesSocial-Webhook-Id: Identifiant de livraison
Vérification Node.js (Crypto)
Section intitulée « Vérification Node.js (Crypto) »import crypto from 'node:crypto';
export function verifyWebhookSignature(rawBody: string, signatureHeader: string, timestampHeader: string, secret: string): boolean { const signedPayload = `${timestampHeader}.${rawBody}`; const expectedSignature = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
const actual = Buffer.from(signatureHeader); const expected = Buffer.from(`v1=${expectedSignature}`); return actual.length === expected.length && crypto.timingSafeEqual(actual, expected);}Vérification Python (hmac)
Section intitulée « Vérification Python (hmac) »import hmacimport hashlib
def verify_webhook_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool: signed_payload = f"{timestamp}.".encode('utf-8') + raw_body expected = hmac.new(secret.encode('utf-8'), signed_payload, hashlib.sha256).hexdigest() return hmac.compare_digest(signature, f"v1={expected}")[!CAUTION] La vérification de la signature doit utiliser le corps de requête brut (raw request body) non analysé.