Skip to Content
🛠 APIWebhooks (à venir)

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.

⚠️ Les webhooks sont en bêta. L’API peut changer sans préavis. Inscris-toi à la newsletter dev  pour être prévenu des breaking changes.

Enregistrer un webhook

POST https://app.petitpanda.io/api/webhooks
curl -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" }
⚠️ Le champ 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ènementDéclenché quand
post.publishedUn post est publié avec succès sur la plateforme cible
post.failedUne publication échoue (token expiré, rate limit plateforme, contenu rejeté)
credits.lowTes 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), ) }
💡 Utilise 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 ?

Last updated on