Формат вебхуків

Ось формати вебхуків, які ви отримуватимете, якщо підписалися через вебхуки:

Коли інцидент додано або оновлено:

{
"meta": {
"unsubscribe": "",
"documentation": ""
},
"page": {
"id": "",
"status_indicator": "",
"status_description": "",
"url": ""
},
"incident": {
"backfilled": false,
"created_at": "",
"impact": "",
"name": "",
"resolved_at": "",
"status": "",
"updated_at": "",
"id": "",
"url": "",
"incident_updates": [
{
"id": "",
"incident_id": "",
"body": "",
"status": "",
"created_at": "",
"updated_at": ""
}
]
}
}

Коли технічне обслуговування додано або оновлено:

{
"meta": {
"unsubscribe": "",
"documentation": ""
},
"page": {
"id": "",
"status_indicator": "",
"status_description": "",
"url": ""
},
"maintenance": {
"backfilled": false,
"created_at": "",
"impact": "",
"name": "",
"resolved_at": "",
"status": "",
"updated_at": "",
"id": "",
"url": "",
"duration": "",
"maintenance_updates": [
{
"id": "",
"maintenance_id": "",
"body": "",
"status": "",
"created_at": "",
"updated_at": ""
}
]
}
}

Коли компонент оновлено:

{
"meta": {
"unsubscribe": "https://<status-page-domain>/unsubscribe?id=${subscriber.id}&token=${subscriber.unsubscribeToken}",
"documentation": ""
},
"page": {
"id": "",
"status_indicator": "",
"status_description": "",
"url": ""
},
"component_update": {
"created_at": "",
"new_status": "",
"component_id": ""
},
"component": {
"created_at": "",
"id": "",
"name": "",
"status": ""
}
}

Можливі статуси сторінки статусу:

  • UP
  • HASISSUES
  • UNDERMAINTENANCE

Можливі статуси компонента:

  • OPERATIONAL
  • UNDERMAINTENANCE
  • DEGRADEDPERFORMANCE
  • PARTIALOUTAGE
  • MAJOROUTAGE

Можливі статуси інциденту:

  • INVESTIGATING
  • IDENTIFIED
  • MONITORING
  • RESOLVED

Можливі статуси технічного обслуговування:

  • NOTSTARTEDYET
  • INPROGRESS
  • COMPLETED

Перевірка корисного навантаження вебхука

Наполегливо рекомендуємо перевіряти корисне навантаження вебхука на своєму ендпоїнті.

Ми підписуємо корисне навантаження вебхука секретом і додаємо підпис у заголовок x-instatus-webhook-signature. Цей підпис дає змогу переконатися, що вебхук надійшов від Instatus.

Кроки перевірки вебхука

  1. Збережіть секрет вебхука, який ви згенерували під час підписки на вебхук (його видно, коли ви підписуєте сторінку через вебхук; там само його можна змінити).
Секрет вебхука
  1. Створіть на своєму сервері новий ендпоїнт, який прийматиме вебхук.

  2. Для перевірки порівняйте отриманий підпис із підписом, згенерованим на вашому сервері.

  3. Якщо підписи збігаються, обробіть вебхук.

Приклад коду

import crypto from 'crypto'
import express from 'express'
const app = express()
app.use(express.json())
const WEBHOOK_SECRET = 'your-webhook-secret'
function isVerifiedPayload(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret)
const digest = hmac.update(JSON.stringify(payload)).digest('hex')
return crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(signature))
}
app.post('/endpoint/to/webhook', (req, res) => {
const payload = req.body
const signature = req.header('x-instatus-webhook-signature')
if (!signature) {
return res.status(400).send('Signature missing')
}
if (!isVerifiedPayload(payload, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature')
}
// Process the valid webhook
res.status(200).send('Webhook received')
})
app.listen(3000, () => console.log('Server running on port 3000'))

Чому перевірка важлива

  • Підтверджує справжність: гарантує, що вебхук надійшов саме з нашої платформи.
  • Запобігає підробці: виявляє зміни в корисному навантаженні.
  • Підвищує безпеку: захищає від атак повторного відтворення та несанкціонованого доступу.