Réception de webhooks
Lorsque DiffHook détecte une modification, il envoie un HTTP POST à l'URL de livraison résolue : notification_config.webhook_url par moniteur si elle est définie, sinon le webhook par défaut de votre espace de travail à partir de Intégrations. Le corps JSON ci-dessous correspond à la charge utile envoyée par DiffHook (et non à la configuration du moniteur).
Charge utile du webhook
{
"event": "page.changed",
"monitor_id": "mon_abc123",
"url": "https://competitor.com/pricing",
"triggered_at": "2026-03-16T14:22:00Z",
"content": "Pro plan: $59/month — …"
}
Référence du champ
event — Toujours page.changed pour les événements de modification de contenu.
monitor_id — ID du moniteur qui a déclenché l'événement.
url : URL surveillée pour cet événement.
triggered_at : horodatage ISO 8601 indiquant le moment où le changement a été détecté.
content — Le nouveau contenu de la page après la modification (texte normalisé/extrait utilisé pour la surveillance — identique à l'instantané DiffHook comparé à la version précédente).
Garanties de livraison
- À chaque modification détectée, DiffHook effectue **un ** HTTP POST immédiat. En cas d'échec (non-2xx, erreur réseau ou délai d'attente), il planifie jusqu'à 10 tentatives supplémentaires — 11 tentatives de livraison au total si votre point de terminaison ne réussit jamais.
- L'intervalle entre les tentatives est exponentiel en minutes : après chaque échec, la prochaine tentative est éligible après 1, 2, 4, 8, 16, 32, 64, 128, 256, puis 512 minutes (chaque délai est le double du précédent). Les tentatives sont récupérées selon un calendrier environ une fois par minute, le timing n'est donc pas précis à la seconde près.
- Une livraison est considérée comme réussie lorsque votre point de terminaison renvoie 2xx dans les 10 secondes.
- Une fois toutes les tentatives utilisées, la livraison s'arrête ; la ligne dans App → Logs affiche
failedouexhaustedselon l'état du canal.
Répondre aux webhooks
Votre point de terminaison doit renvoyer 200 OK le plus rapidement possible. Traitez la charge utile de manière asynchrone :
app.post('/webhook', (req, res) => {
res.status(200).send('OK') // Respond first
processChangeAsync(req.body) // Then process
})
Comportement de nouvelle tentative
| Tentative | Quand elle s'exécute |
|---|---|
| 1er | Immédiatement lorsque le changement est détecté |
| 2ème | ≥ 1 minute après le 1er échec |
| 3ème | ≥ 2 minutes après le 2ème échec |
| 4ème | ≥ 4 minutes après le 3ème échec |
| 5ème | ≥ 8 minutes après le 4ème échec |
| 6ème | ≥ 16 minutes après le 5ème échec |
| 7ème | ≥ 32 minutes après le 6ème échec |
| 8ème | ≥ 64 minutes (~1 h) après le 7ème échec |
| 9ème | ≥ 128 minutes (~2 h) après le 8ème échec |
| 10e | ≥ 256 minutes (~4 h) après le 9ème échec |
| 11e | ≥ 512 minutes (~8,5 h) après le 10ème échec |
Après 11 tentatives infructueuses (1 tentative initiale + 10 tentatives), aucune autre diffusion automatique n'est exécutée pour cet événement. Corrigez votre point de terminaison et utilisez Déclencher maintenant sur le moniteur si vous avez besoin d'une autre tentative.