Webhooks
Recevez des notifications HTTP signées lorsque vos publications sont publiées, planifiées ou échouent, et lorsqu'une image finit d'être générée, puis vérifiez la signature.
https://post.adaptlypost.com/post/api/v1/webhooksEnregistrez un endpoint de webhook. Chaque webhook reçoit tous les événements, signés avec son secret.
Créer, mettre à jour, supprimer et tester un webhook exige webhooks.manage (Administrateur et Éditeur). Lister et lire les webhooks exige webhooks.read, que les clés Contributeur ne détiennent pas.
Paramètres du corps
| Paramètre | Taper | Description |
|---|---|---|
urlREQUIS | string | Endpoint http(s) accessible publiquement qui recevra les livraisons d’événements. Les hôtes privés sont rejetés. Max. 10 webhooks par espace de travail. |
Événements
Chaque webhook enregistré reçoit tous les événements suivants. Le nom de l’événement est envoyé dans le payload et dans l’en-tête x-adaptly-event, afin que vous puissiez filtrer de votre côté.
| Événement | Description |
|---|---|
post.published | Toutes les plateformes de la publication ont publié avec succès |
post.partially_failed | Certaines plateformes ont publié, d’autres ont échoué |
post.failed | La publication a échoué sur toutes les plateformes |
post.scheduled | Une publication a été planifiée |
account.unauthorized | Une plateforme a rejeté le jeton d'un compte ; le compte est unauthorized jusqu'à sa reconnexion |
image.completed | Une image lancée avec POST /ai/images est terminée ; data.image.imageUrl est prête à l'emploi |
image.failed | Une image lancée avec POST /ai/images a échoué ; data.image.error en donne la raison |
Contenu de l'événement
Chaque livraison est un corps JSON avec id, event, createdAt et data. data contient post, la publication complète sous la même forme que GET /api/v1/social-posts/:id, pour les événements post.* ; account (id, platform, displayName, pageId pour Facebook, status et le motif donné par la plateforme) pour account.unauthorized ; et image (jobId, sessionId, prompt, puis imageUrl et imageId, ou error) pour les événements image.*. Une livraison de test envoie l'événement webhook.test avec l'id du webhook et la liste des événements.
Vérification des signatures
Chaque livraison est signée avec le secret de votre webhook (whsec_...). Calculez un HMAC-SHA256 sur "{timestamp}.{rawBody}" et comparez-le à l’en-tête x-adaptly-signature avant de faire confiance au payload.
Le secret n’est affiché qu’une seule fois
Le secret de signature (whsec_...) n’est renvoyé que dans la réponse à la requête de création, jamais dans les réponses de liste, de récupération ou de mise à jour. Conservez-le en lieu sûr. Si vous le perdez, supprimez le webhook et créez-en un nouveau.const crypto = require('crypto');
const expected =
'sha256=' +
crypto
.createHmac('sha256', webhookSecret)
.update(`${req.headers['x-adaptly-timestamp']}.${rawBody}`)
.digest('hex');
const isValid = expected === req.headers['x-adaptly-signature'];Livraison et nouvelles tentatives
Votre endpoint doit répondre avec un statut 2xx en 10 secondes. Les livraisons échouées sont retentées jusqu’à 5 fois avec un backoff exponentiel. Les livraisons peuvent arriver plusieurs fois, rendez votre handler idempotent. Une livraison vers un hôte privé ou interne est refusée et enregistrée avec une erreur.
Désactivation automatique
Après 20 livraisons échouées consécutives, le webhook est automatiquement désactivé. Réactivez-le via PATCH { "active": true } ou depuis le tableau de bord.Gestion des webhooks
Les webhooks se gèrent avec les endpoints suivants, avec la même authentification par clé API :
GET /api/v1/webhooks # list registered webhooks
GET /api/v1/webhooks/:id # get one webhook
PATCH /api/v1/webhooks/:id # update url or active
DELETE /api/v1/webhooks/:id # delete a webhook
POST /api/v1/webhooks/:id/test # send a signed webhook.test eventVous pouvez aussi gérer les webhooks visuellement depuis le tableau de bord, sur la page API et agents IA.
Spécification OpenAPI
Une spécification OpenAPI 3.0 lisible par machine de toute l’API REST: y compris les webhooks et le schéma du payload d’événements, est disponible publiquement. Importez-la dans Make, n8n ou tout outil compatible OpenAPI.
curl https://post.adaptlypost.com/post/api/v1/openapi.jsoncurl --request POST \
--url https://post.adaptlypost.com/post/api/v1/webhooks \
--header 'Authorization: Bearer <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"url": "https://your-server.com/webhook"
}'curl --request POST \
--url https://post.adaptlypost.com/post/api/v1/webhooks/<webhook-id>/test \
--header 'Authorization: Bearer <api-key>'POST <your-url>
x-adaptly-event: post.published
x-adaptly-webhook-id: wh_abc123
x-adaptly-timestamp: 1784643600
x-adaptly-signature: sha256=3f5a...
{
"id": "deliver-webhook-...",
"event": "post.published",
"createdAt": "2026-07-21T14:20:00.000Z",
"data": {
"post": {
"id": "post_xyz789",
"status": "COMPLETED",
"recurringPostId": "rp_abc123",
"occurrenceAt": "2026-07-21T14:19:00.000Z",
"platforms": [
{
"platform": "TWITTER",
"status": "PUBLISHED",
"platformPostId": "1234567890",
"publishedAt": "2026-07-21T14:19:58.000Z"
}
]
}
}
}
POST <your-url>
x-adaptly-event: account.unauthorized
{
"id": "deliver-webhook-...",
"event": "account.unauthorized",
"createdAt": "2026-09-13T09:10:00.000Z",
"data": {
"account": {
"id": "conn_jkl012",
"platform": "FACEBOOK",
"displayName": "Your Page",
"pageId": "123456789012345",
"status": "unauthorized",
"reason": "Error validating access token: Sessions for the user are not allowed because the user is not a confirmed user."
}
}
}
POST <your-url>
x-adaptly-event: image.completed
{
"id": "deliver-webhook-...",
"event": "image.completed",
"createdAt": "2026-09-20T10:02:31.000Z",
"data": {
"image": {
"jobId": "generate-image-8f2a1c40-6d3b-4e91-b7c2-0a5d9e13f846",
"sessionId": "b31c7a44-2f19-4c85-9d60-7e2af4c81b93",
"prompt": "a red bicycle leaning against a yellow wall, soft morning light",
"imageUrl": "https://cdn.adaptlypost.com/ai-images/ai-studio-4c81b93.png",
"imageId": "d7e44a10-93bc-4f27-8ae5-1b06c2f4d938"
}
}
}{
"id": "wh_abc123",
"url": "https://your-server.com/webhook",
"active": true,
"secret": "whsec_c99807...",
"createdAt": "2026-07-21T14:00:00.000Z",
"updatedAt": "2026-07-21T14:00:00.000Z",
"lastSuccessAt": null,
"lastFailureAt": null,
"disabledAt": null
}