Event catalog, payload schema, signature verification, retry policy.
Webhooks push events to your endpoint instead of you polling our API. Available on Management+. This page documents the event catalog, the signed-payload format, and retry semantics.
| audit.complete | Manual or scheduled audit finished. Includes audit_id, score, issue counts. |
| audit.failed | Audit failed before producing usable data. Includes error reason. |
| keyword.moved | Tracked keyword position changed by more than your configured threshold. |
| keyword.feature_change | SERP feature appeared or disappeared (AI Overview, featured snippet, etc.). |
| conversion.detected | A conversion event was attributed to a tracked keyword or page. |
| alert.triggered | A rule-based alert fired. |
| integration.disconnected | An OAuth integration was revoked (by us or by the provider). |
httpPOST /your/endpoint HTTP/1.1 Content-Type: application/json User-Agent: SEMOptimiser-Webhook/1.0 X-SEMO-Event: audit.complete X-SEMO-Delivery: 7f3b... X-SEMO-Signature: t=1717000000,v1=abc123def... { "event": "audit.complete", "occurred_at": "2026-05-30T10:00:00Z", "data": { "audit_id": "aud_42", "site_id": "site_1", "url": "https://example.com", "score": 87, "issues": { "critical": 3, "warning": 12, "info": 28 } } }
If you set a secret, every payload has an X-SEMO-Signature header. To verify:
javascriptimport crypto from 'crypto' function verify(req, secret) { const [tPart, v1Part] = req.headers['x-semo-signature'].split(',') const t = tPart.split('=')[1] const v1 = v1Part.split('=')[1] if (Math.abs(Date.now()/1000 - parseInt(t)) > 300) return false const expected = crypto.createHmac('sha256', secret) .update(`${t}.${req.rawBody}`).digest('hex') return crypto.timingSafeEqual( Buffer.from(expected, 'hex'), Buffer.from(v1, 'hex')) }
We expect 2xx within 10s. If we don't get one, we retry with exponential backoff up to 8 times over 24 hours: 30s, 2m, 10m, 30m, 2h, 6h, 12h, 24h. After the 8th failure we mark delivery as permanently failed and email you.
Settings → Webhooks → [your webhook] → Deliveries shows the last 100 attempts with timestamp, event, response code, response time, and the exact payload+response. Replay individual deliveries during debugging.
One platform. Five fewer subscriptions.
Join 1,200+ agencies and in-house teams using SEMOptimiser to replace Semrush, Ahrefs, GA4 add-ons and rank trackers – with one workflow that actually ships fixes.