REST APIPOST

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.

POSThttps://post.adaptlypost.com/post/api/v1/webhooks

Enregistrez un endpoint de webhook. Chaque webhook reçoit tous les événements, signés avec son secret.

Clé API (jeton Bearer)
Permission:webhooks.manageRôles et permissions

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ètreTaperDescription
urlREQUISstringEndpoint 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énementDescription
post.publishedToutes les plateformes de la publication ont publié avec succès
post.partially_failedCertaines plateformes ont publié, d’autres ont échoué
post.failedLa publication a échoué sur toutes les plateformes
post.scheduledUne publication a été planifiée
account.unauthorizedUne plateforme a rejeté le jeton d'un compte ; le compte est unauthorized jusqu'à sa reconnexion
image.completedUne image lancée avec POST /ai/images est terminée ; data.image.imageUrl est prête à l'emploi
image.failedUne 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.
Vérifier une livraison (Node.js)
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 event

Vous 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.json
Enregistrer un webhook
curl --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"
}'
Envoyer un événement de test
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/webhooks/<webhook-id>/test \
  --header 'Authorization: Bearer <api-key>'
Exemple de livraison d’événement
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"
    }
  }
}
201
{
  "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
}