Aller au contenu

Référence

Webhooks

Recevez une requête signée sur votre propre serveur quand une publication est envoyée en relecture, approuvée, publiée ou en échec, quand un fichier est prêt, ou quand un compte social requiert votre attention.

Ajouter un endpoint

  1. 1

    Dans SPREVA, ouvrez Développeurs, puis Webhooks, ajoutez l’adresse de votre serveur et choisissez les événements dont il doit être informé. L’adresse doit être publique et répondre avec un statut 2xx en moins de 10 secondes.

  2. 2

    Copiez le secret de l’endpoint. Il n’est affiché qu’une seule fois, et c’est avec lui que vous vérifiez la signature de chaque requête.

  3. 3

    Utilisez Envoyer un test. Un événement webhook.test est envoyé, signé comme les vrais, et Envois récents affiche le statut renvoyé par votre serveur et le temps de réponse.

Un endpoint peut aussi être ajouté via l’API REST, avec une clé qui dispose de webhooks:write.

Ce que contient chaque requête

Un POST avec un corps JSON et quatre en-têtes :

  • x-spreva-event : l’événement, par exemple target.published.
  • x-spreva-event-id : identique à l’id du corps, et identique à chaque nouvelle tentative et à chaque renvoi.
  • x-spreva-timestamp : le moment où la requête a été signée, en secondes Unix.
  • x-spreva-signature : v1= suivi de la signature.
JSON
{
  "id": "7f3c2d10-0000-4000-8000-000000000000",
  "type": "target.published",
  "createdAt": "2026-10-01T09:00:02.412Z",
  "workspaceId": "0b9f6c1e-0000-4000-8000-000000000001",
  "data": {
    "type": "TargetPublished",
    "workspaceId": "0b9f6c1e-0000-4000-8000-000000000001",
    "postId": "5d2a7c3e-0000-4000-8000-000000000002",
    "targetId": "9a1f4b7d-0000-4000-8000-000000000003",
    "provider": "instagram",
    "remoteId": "17900000000000000",
    "remoteUrl": "https://www.instagram.com/p/EXAMPLE/"
  }
}

data est l’événement lui-même, et data.type est son nom dans SPREVA. Utilisez les identifiants de data pour récupérer l’objet complet via l’API REST.

Événements

Un endpoint reçoit les événements qu’il a choisis. Envoyer un test l’atteint quels que soient ses choix.

Publications

post.created
Une publication a été créée
post.review_requested
Une publication a été envoyée en relecture
post.approved
Une publication a été approuvée et a reçu son heure
post.changes_requested
Un relecteur a renvoyé une publication avec une note
post.scheduled
Une publication a reçu une date
post.published
Une publication est partie sur tous les comptes
post.partial
Une publication a eu des résultats variables selon ses comptes
post.failed
Une publication a échoué sur tous les comptes

Diffusions (une par compte)

target.published
La publication est partie sur un compte
target.failed
Un compte n’a pas pu publier
target.awaiting_user
Un compte attend que vous terminiez la publication dans sa propre application

Médias

media.ready
Un fichier importé est prêt à l’emploi
media.failed
Un fichier n’a pas pu être traité ou généré

Comptes sociaux

connection.expired
Un compte social doit être reconnecté
connection.revoked
Un compte social a retiré son autorisation

Statistiques

analytics.updated
De nouveaux chiffres sont arrivés pour une publication publiée

Vérifier la signature

La signature est un HMAC-SHA256 de l’horodatage, d’un point et du corps brut, avec le secret de l’endpoint comme clé. Rejetez toute requête dont la signature ne correspond pas.

JavaScript
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body as a string, before any JSON parsing
export function isFromSpreva(rawBody, headers, secret) {
  const signed = headers["x-spreva-timestamp"] + "." + rawBody;
  const expected = Buffer.from("v1=" + createHmac("sha256", secret).update(signed).digest("hex"));
  const received = Buffer.from(headers["x-spreva-signature"] ?? "");
  return received.length === expected.length && timingSafeEqual(received, expected);
}
Vérifiez-la sur le corps exactement tel qu’il est arrivé, avant toute analyse du JSON : l’analyser puis le réécrire modifie les octets, et la signature ne correspond plus.

Nouvelles tentatives et renvois

  • Répondez avec un statut 2xx en moins de 10 secondes. Toute autre réponse, ou une absence de réponse, entraîne jusqu’à 5 nouvelles tentatives : après 30 secondes, 2 minutes, 10 minutes, 1 heure et 6 heures.
  • Les redirections ne sont pas suivies : utilisez l’adresse finale de votre endpoint.
  • Une nouvelle tentative ou un renvoi porte le même x-spreva-event-id : utilisez-le pour ignorer un événement que vous avez déjà traité.
  • Rejouer l’envoi, dans Envois récents, renvoie un événement, avec ses nouvelles tentatives si votre serveur échoue encore, pour que vous puissiez corriger votre endpoint sans publier deux fois.