# Format webhook

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

Berikut format webhook yang akan Anda terima jika Anda berlangganan lewat webhook:

**Saat sebuah insiden ditambahkan atau diperbarui:**

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

**Saat sebuah pemeliharaan ditambahkan atau diperbarui:**

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

**Saat sebuah komponen diperbarui:**

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

### Status halaman status yang mungkin:

- `UP`
- `HASISSUES`
- `UNDERMAINTENANCE`

### Status komponen yang mungkin:

- `OPERATIONAL`
- `UNDERMAINTENANCE`
- `DEGRADEDPERFORMANCE`
- `PARTIALOUTAGE`
- `MAJOROUTAGE`

### Status insiden yang mungkin:

- `INVESTIGATING`
- `IDENTIFIED`
- `MONITORING`
- `RESOLVED`

### Status pemeliharaan yang mungkin:

- `NOTSTARTEDYET`
- `INPROGRESS`
- `COMPLETED`

## Verifikasi Payload Webhook

**Sangat disarankan untuk memvalidasi payload webhook di endpoint webhook Anda.**

Kami menandatangani payload webhook dengan sebuah secret dan menyertakan tanda tangannya sebagai header bernama `x-instatus-webhook-signature`. Tanda tangan ini memungkinkan Anda memverifikasi bahwa webhook memang berasal dari Instatus.

### Langkah Memverifikasi Webhook

1. Simpan **Webhook Secret** yang Anda buat saat berlangganan webhook (Anda bisa menemukannya saat berlangganan ke sebuah halaman lewat webhook, dan bisa menyesuaikannya di sana juga).

![Webhook Secret](https://instatus.com/help/notification/webhook-subscribe-example.png)

2. Buat endpoint baru di server Anda yang akan menerima webhook.

3. Bandingkan tanda tangan itu dengan tanda tangan yang dihasilkan server Anda untuk memvalidasinya.

4. Jika tanda tangannya cocok, proses webhook-nya.

#### Contoh Kode

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

### Mengapa Verifikasi Itu Penting

- **Memastikan Keaslian**: Menjamin bahwa webhook berasal dari platform kami.
- **Mencegah Perubahan**: Mendeteksi perubahan pada payload.
- **Meningkatkan Keamanan**: Melindungi dari serangan replay dan akses tidak sah.
