コンテンツにスキップ

Webhook 通知

汎用 Webhook を使って、任意の HTTPS エンドポイントにインシデント通知を JSON 形式で送信できます。自社のシステムや自動化ツールとの連携に便利です。

  • HTTPS 必須: HTTP(非暗号化)の URL は使用できません
  • パブリックエンドポイント: プライベートネットワークの URL はブロックされます
  • 署名検証用シークレット: 1 文字以上の任意の文字列
  1. ダッシュボードの「通知チャンネル」メニューを開く
  2. 「Add Channel」で Type に Webhook を選択
  3. 受信先の HTTPS URL を入力
  4. 署名検証用のシークレットを入力
  5. チャンネル名を入力して「Add Channel」をクリック

通知は POST リクエストとして送信されます。Content-Typeapplication/json です。

すべてのイベントに含まれるフィールド:

フィールド説明
eventstringイベント種別(incident.created, incident.resolved, webchange.detected)
monitorNamestringモニター名
monitorIdstring | nullモニター ID(モニター削除済みの場合は null)
teamIdstringチーム ID
incidentIdstringインシデント ID
timestampstringISO 8601 形式のタイムスタンプ
イベントフィールド説明
incident.createdmonitorUrlstring監視対象の URL
incident.createdseveritystring重大度("critical" または "warning")
incident.created / incident.resolvedtitlestring | undefined手動インシデントのタイトル(自動インシデントでは省略)
webchange.detecteddiffSummarystring変更差分の概要
{
"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"
}

通知リクエストには X-Manako-Signature ヘッダーが付与されます。リクエストボディの HMAC-SHA256 署名をシークレットで検証することで、リクエストが Manako から送信されたものであることを確認できます。

署名のフォーマットは 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 の例
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");
});