WebhooksEnregistrer un webhook

Webhooks

Enregistrer un webhook

Enregistre une URL https que Sofia appelle avec un événement JSON signé, rejoué jusqu’à cinq fois en cas d’échec. Secret affiché une fois ; 10 webhooks max.

POSThttps://api.sofia-post.com/api/v1/webhooks
POSThttps://api.sofia-post.com/api/v1/webhooks

Enregistrer un webhook

Enregistre une URL https que Sofia appelle avec un événement JSON signé, rejoué jusqu’à cinq fois en cas d’échec. Secret affiché une fois ; 10 webhooks max.

Autorisations

Authorizationstringrequis

Votre clé personnelle ou jeton d’accès OAuth, envoyé sous la forme Bearer <token>.

Conservé dans cet onglet uniquement, et envoyé uniquement à api.sofia-post.com. Obtenir une clé API

Corps

Cette requête agit sur votre vrai compte.

Enregistrer un webhook

Enregistrez une adresse https publique et les événements souhaités. Le secret de signature (whsec_…) n’est affiché que dans cette réponse. Une application peut avoir jusqu’à 10 webhooks.

curl -X POST https://api.sofia-post.com/api/v1/webhooks \
  -H "Authorization: Bearer $SOFIA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://app.example.com/hooks/sofia","events":["post.published","post.failed"]}'

Événements

Événementdata
post.publishedpostId, establishmentId, platform, publishedAt, permalink
post.failedpostId, establishmentId, platform, error
webhook.testwebhookId

Sofia envoie chaque événement en POST au format JSON { id, type, createdAt, data }, avec les en-têtes Sofia-Event-Id, Sofia-Event-Type et Sofia-Signature. Seules les publications créées par votre application sont annoncées.

Vérifier la signature

Sofia-Signature vaut t=<unix time>,v1=<hex>, où v1 est le HMAC-SHA256 de <t>.<raw body> avec votre secret. Vérifiez-la sur le corps brut, et refusez un horodatage ancien :

import { createHmac, timingSafeEqual } from 'node:crypto';

const isSignedBySofia = (header, rawBody, secret) => {
  const parts = Object.fromEntries(
    (header ?? '').split(',').map((part) => part.trim().split('=', 2)),
  );
  const timestamp = Number(parts.t);
  if (!Number.isInteger(timestamp) || typeof parts.v1 !== 'string') return false;
  if (Math.abs(Date.now() / 1000 - timestamp) > 300) return false;
  const expected = createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest();
  const received = Buffer.from(parts.v1, 'hex');
  return received.length === expected.length && timingSafeEqual(received, expected);
};

Livraison et nouvelles tentatives

  • Une réponse 2xx livre l’événement. Toute autre réponse, une redirection (jamais suivie) ou 10 secondes sans réponse déclenchent une nouvelle tentative après 1 minute, 5 minutes, 30 minutes et 2 heures, jusqu’à 5 tentatives.
  • Un même événement peut arriver deux fois : dédupliquez sur Sofia-Event-Id.
  • Répondez vite et traitez l’événement ensuite.

Autorisations

  • Authorizationstringheaderrequis

    Votre clé personnelle ou jeton d’accès OAuth, envoyé sous la forme Bearer <token>.

Corps

application/json
  • urlstringrequis

    L’adresse https que Sofia appelle. Un hôte qui résout vers une adresse privée, loopback ou link-local est refusé

  • eventsstring[]requis

    Les événements à recevoir

Réponse

Le webhook et son secret de signature, affiché une seule fois.

  • idstringrequis

    Identifiant du webhook.

  • urlstringrequis

    Adresse appelée par Sofia

  • eventsstring[]requis

    Les événements souscrits

  • createdAtstring<date-time>requis

    Moment où le webhook a été enregistré

  • secretstringrequis

    La clé HMAC-SHA256 qui signe chaque envoi (Sofia-Signature). Affichée cette seule fois

Cette page vous a-t-elle aidé ?