Webhooks
Recevez des notifications HTTP signées lorsque vos publications sont publiées, planifiées ou échouent
https://post.adaptlypost.com/post/api/v1/webhooksEnregistrez un endpoint de webhook. Chaque webhook reçoit tous les événements de publication, signés avec son secret.
Paramètres du corps
| Parametre | 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 |
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.
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 des tokens API.
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",
"platforms": [
{
"platform": "TWITTER",
"status": "PUBLISHED",
"platformPostId": "1234567890",
"publishedAt": "2026-07-21T14:19:58.000Z"
}
]
}
}
}{
"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
}