DiffHook/Docs
GuidesReceiving Webhooks

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.