Receiving Webhooks
When DiffHook detects a change, it sends an HTTP POST to your configured webhookUrl with a structured JSON payload.
Webhook payload
{
"event": "page.changed",
"monitor_id": "mon_abc123",
"url": "https://competitor.com/pricing",
"label": "Competitor pricing page",
"triggered_at": "2026-03-16T14:22:00Z",
"interval_minutes": 60,
"diff": {
"summary": "Pro plan price changed from $49 to $59",
"added": ["$59/month"],
"removed": ["$49/month"],
"full_text_before": "Pro plan: $49/month...",
"full_text_after": "Pro plan: $59/month..."
},
"snapshot_url": "https://diffhook.com/snapshots/snap_xyz"
}
Field reference
event — Always page.changed for content change events.
monitor_id — The ID of the monitor that triggered the event.
triggered_at — ISO 8601 timestamp of when the change was detected.
diff.summary — A human-readable one-line description of what changed.
diff.added / diff.removed — Arrays of added and removed text fragments.
diff.full_text_before / diff.full_text_after — Full page text before and after the change.
snapshot_url — Link to a visual diff in the DiffHook dashboard.
Delivery guarantees
- DiffHook attempts delivery up to 3 times with exponential backoff (1s, 5s, 30s)
- A delivery is considered successful when your endpoint returns 2xx within 10 seconds
- Failed deliveries are logged and visible in App → Logs
Responding to webhooks
Your endpoint should return 200 OK as quickly as possible. Process the payload asynchronously:
app.post('/webhook', (req, res) => {
res.status(200).send('OK') // Respond first
processChangeAsync(req.body) // Then process
})
Retry behavior
| Attempt | Delay |
|---|---|
| 1st | Immediate |
| 2nd | 5 seconds |
| 3rd | 30 seconds |
After 3 failed attempts, the delivery is marked as failed in your logs.