# Uptime Kuma

EvoHub receives Uptime Kuma notifications through its built-in **Webhook** notification type. A monitor going down opens an EvoHub alert, and the monitor coming back up resolves it.

## Set it up

:::steps
### Create the integration
In EvoHub, go to **On-Call → Integrations → + Add Integration**, choose **Uptime Kuma**, pick an **Escalation Policy** and click **Create Integration**. Copy the **Webhook URL**.
### Add a Webhook notification
In Uptime Kuma, go to **Settings → Notifications → Setup Notification** and set **Notification Type** to **Webhook**.
### Set the URL and body
Set **Post URL** to your webhook URL and **Request Body** to **Preset - application/json**. (**Preset - multipart/form-data** works too.)
### Test it
Click **Test**. EvoHub answers with success and opens no alert; the integration's **Last Event** updates.
### Enable it on monitors
Turn the notification on for the monitors that should page, or tick **Default enabled** and **Apply on all existing monitors**.
:::

## What EvoHub reads

Uptime Kuma posts `{"heartbeat": {...}, "monitor": {...}, "msg": "..."}`:

| EvoHub alert | Taken from |
| --- | --- |
| Title | "`monitor.name` is down", for example "Checkout API is down". |
| Description | `heartbeat.msg`, the reason the check failed. |
| Severity | Always **high**. |
| Labels | `monitor_type`, `monitor_id`, `url` (the monitored URL), `hostname`. |
| Fingerprint | The monitor's ID (or, if a notification has none, its URL, hostname or name). |

## Resolve and deduplication

- A heartbeat with status **down** opens an alert; status **up** resolves the open alert for that monitor.
- **Pending** and **maintenance** heartbeats are ignored.
- Another down notification while the alert is open is recorded as **Retriggered**.
- Deduplication is per integration: two Uptime Kuma servers connected through two integrations open separate alerts even when their monitor IDs match, and each one's up notification resolves only its own alert.

## Troubleshooting

- **Test works but no alerts arrive**: the notification is not enabled on the monitor.
- **`400 INVALID_BODY`**: the request body was set to a custom template. Use one of the presets.

## Related

- [Integrations overview](https://docs-dev.evohub.io/integrations-overview.md)
- [Escalation policies](https://docs-dev.evohub.io/escalation-policies.md)
