Webhook-format

Här är formatet på de webhooks du får om du prenumererar via webhooks:

När en incident läggs till eller uppdateras:

{
"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": ""
}
]
}
}

När ett underhåll läggs till eller uppdateras:

{
"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": ""
}
]
}
}

När en komponent uppdateras:

{
"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": ""
}
}

Möjliga statusar för statussidan:

  • UP
  • HASISSUES
  • UNDERMAINTENANCE

Möjliga komponentstatusar:

  • OPERATIONAL
  • UNDERMAINTENANCE
  • DEGRADEDPERFORMANCE
  • PARTIALOUTAGE
  • MAJOROUTAGE

Möjliga incidentstatusar:

  • INVESTIGATING
  • IDENTIFIED
  • MONITORING
  • RESOLVED

Möjliga underhållsstatusar:

  • NOTSTARTEDYET
  • INPROGRESS
  • COMPLETED

Verifiering av webhook-payload

Vi rekommenderar starkt att du validerar webhook-payloaden i din webhook-endpoint.

Vi signerar webhook-payloader med en hemlighet och skickar med signaturen i en header som heter x-instatus-webhook-signature. Med signaturen kan du verifiera att webhooken kom från Instatus.

Steg för att verifiera en webhook

  1. Spara din webhook-hemlighet som du genererade när du prenumererade på webhooken (du hittar den när du prenumererar på en sida via webhook, och du kan även anpassa den där).
Webhook-hemlighet
  1. Skapa en ny endpoint på din server som tar emot webhooken.

  2. Jämför signaturen med den signatur din server genererar för att validera den.

  3. Om signaturerna stämmer överens kan du behandla webhooken.

Kodexempel

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'))

Varför verifiering är viktigt

  • Säkerställer äkthet: Garanterar att webhooken kommer från vår plattform.
  • Förhindrar manipulation: Upptäcker ändringar i payloaden.
  • Ökar säkerheten: Skyddar mot replay-attacker och obehörig åtkomst.