Webhooks
Les webhooks PetitPanda te permettent de recevoir des notifications HTTP en temps réel sur ton serveur dès qu’un évènement se produit (post publié, échec de publication, crédits bas). Plus besoin de poller GET /schedules toutes les 30 secondes.
Enregistrer un webhook
POST https://app.petitpanda.io/api/webhookscurl -X POST https://app.petitpanda.io/api/webhooks \
-H "Authorization: Bearer $PETITPANDA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.tonsite.com/webhooks/petitpanda",
"events": ["post.published", "post.failed"]
}'Réponse
{
"webhook_id": "whk_3f8a1b2c9d4e7f5a",
"url": "https://api.tonsite.com/webhooks/petitpanda",
"events": ["post.published", "post.failed"],
"secret": "whsec_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"created_at": "2026-05-20T14:40:11Z"
}secret n’est retourné qu’à la création. Stocke-le immédiatement, tu en auras besoin pour vérifier la signature de chaque payload entrant.Évènements disponibles
| Évènement | Déclenché quand |
|---|---|
post.published | Un post est publié avec succès sur la plateforme cible |
post.failed | Une publication échoue (token expiré, rate limit plateforme, contenu rejeté) |
credits.low | Tes crédits passent sous 10% du quota mensuel |
Format du payload
PetitPanda envoie une requête POST JSON à ton URL avec ce format :
{
"event": "post.published",
"delivered_at": "2026-05-22T09:00:42Z",
"data": {
"schedule_id": "sch_b4e2d9f1a8c3e6b5",
"draft_id": "drft_8f3a1c2b9e7d4f5a",
"platform": "linkedin",
"published_at": "2026-05-22T09:00:38Z",
"external_url": "https://www.linkedin.com/feed/update/urn:li:activity:7321234567890",
"external_id": "urn:li:activity:7321234567890"
}
}Pour post.failed, le data contient en plus :
{
"error_code": "platform_token_expired",
"error_message": "Le token LinkedIn a expiré. Reconnecte le compte depuis Réglages > Comptes."
}Vérification de signature
Chaque requête inclut un header X-PetitPanda-Signature qui est le HMAC-SHA256 du body brut avec ta clé whsec_.... Vérifie-le toujours avant de traiter le payload, sinon n’importe qui peut forger des évènements.
Exemple Node.js :
import crypto from 'crypto'
function verifyWebhook(rawBody, signatureHeader, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expected),
)
}crypto.timingSafeEqual plutôt que === pour comparer les signatures. C’est plus lent mais ça évite les attaques par timing.Retry policy
Si ton endpoint renvoie un statut autre que 2xx, PetitPanda réessaie 3 fois avec un backoff exponentiel :
- Tentative 1 : immédiate
- Tentative 2 : +30 secondes
- Tentative 3 : +5 minutes
Après 3 échecs, l’évènement est abandonné et logué dans Réglages > API > Webhooks . Réponds rapidement avec un 200 (en moins de 5 secondes) puis traite la logique métier en arrière-plan via une file de tâches.
Et après ?
- Programme tes posts pour générer des évènements : Programmer un post