# Webhook-format

Source: https://instatus.com/help/sv/webhooks

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

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

```json
{
  "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:**

```json
{
  "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:**

```json
{
  "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](https://instatus.com/help/notification/webhook-subscribe-example.png)

2. Skapa en ny endpoint på din server som tar emot webhooken.

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

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

#### Kodexempel

```javascript
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.
