Webhooks
Add an https endpoint under Developer. We POST to it as soon as a mention has been classified — no polling required.
Events
mention.created— a new mention passed classification and was judged relevant.
Payload
{
"event": "mention.created",
"created_at": "2026-09-01T09:20:11.412Z",
"data": {
"id": "7b0f1e3a-1c4d-4a0a-9f2b-2f4a8c1d0e11",
"source": "reddit",
"url": "https://reddit.com/r/SaaS/comments/abc123",
"author_handle": "ops_kate",
"text": "Our analytics bill tripled…",
"category": "complaint",
"sentiment": "negative",
"urgency": 72,
"ai_summary": "User is priced out of a competitor and asking for alternatives."
}
}Verifying the signature
Each delivery carries x-herculeradar-signature in the form t=1756713611,v1=…. Recompute HMAC-SHA256 over the timestamp, a dot and the raw request body, using your endpoint secret, and compare in constant time. Reject anything older than five minutes.
import crypto from "node:crypto";
export function verify(rawBody, header, secret) {
const parts = Object.fromEntries(
header.split(",").map((part) => part.split("=")),
);
const expected = crypto
.createHmac("sha256", secret)
.update(parts.t + "." + rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(parts.v1),
Buffer.from(expected),
);
}Delivery
- Respond with any 2xx within ten seconds.
- Every attempt is recorded with its response code and is visible in the dashboard.
- Alert rules can also target a webhook URL, if you want filtering applied first.