Skip to content

Webhook Notifications

Using generic webhooks, you can send incident notifications in JSON format to any HTTPS endpoint. This is convenient for integrating with your own systems or automation tools.

  • HTTPS required: HTTP (unencrypted) URLs cannot be used
  • Public endpoint: Private network URLs are blocked
  • Signature verification secret: Any string of 1 or more characters
  1. Open the “Notification Channels” menu in the dashboard
  2. Click “Add Channel” and select Webhook as the Type
  3. Enter the destination HTTPS URL
  4. Enter the signature verification secret
  5. Enter a channel name and click “Add Channel”

Notifications are sent as POST requests. The Content-Type is application/json.

Fields included in all events:

FieldTypeDescription
eventstringEvent type (incident.created, incident.resolved, webchange.detected)
monitorNamestringMonitor name
monitorIdstring | nullMonitor ID (null if the monitor has been deleted)
teamIdstringTeam ID
incidentIdstringIncident ID
timestampstringISO 8601 formatted timestamp
EventFieldTypeDescription
incident.createdmonitorUrlstringMonitored URL
incident.createdseveritystringSeverity ("critical" or "warning")
incident.created / incident.resolvedtitlestring | undefinedTitle for manual incidents (omitted for automatic incidents)
webchange.detecteddiffSummarystringSummary of changes
{
"event": "incident.created",
"monitorName": "API Server",
"monitorId": "01JWAB1234567890ABCDEF",
"teamId": "01JWAB0987654321FEDCBA",
"incidentId": "01JWABINCIDENT12345678",
"monitorUrl": "https://api.example.com/health",
"severity": "critical",
"timestamp": "2025-01-15T10:30:00.000Z"
}

Notification requests include an X-Manako-Signature header. You can verify that the request was sent from Manako by validating the HMAC-SHA256 signature of the request body using your secret.

The signature format is sha256=\{hex_digest\}.

import crypto from "node:crypto";
function verifySignature(body, secret, signature) {
const expected =
"sha256=" +
crypto.createHmac("sha256", secret).update(body).digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
);
}
// Express example
app.post("/webhook", express.text({ type: "application/json" }), (req, res) => {
const signature = req.headers["x-manako-signature"];
if (!verifySignature(req.body, process.env.WEBHOOK_SECRET, signature)) {
return res.status(401).send("Invalid signature");
}
const payload = JSON.parse(req.body);
console.log(`Event: ${payload.event}, Monitor: ${payload.monitorName}`);
res.status(200).send("OK");
});