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
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
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
Utilisez Envoyer un test. Un événement
webhook.testest 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 exempletarget.published.x-spreva-event-id: identique à l’iddu 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.
{
"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.
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);
}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.