Uptimeify Docs
Incident managementAlert sources

Prometheus Alertmanager

Send Prometheus Alertmanager notifications to Uptimeify Incident Management via a webhook receiver, mapped from commonLabels and the first alert.

Uptimeify's Alertmanager preset maps Alertmanager's webhook_config notification payload directly: the summary/alertname, severity label, status, and instance are pre-mapped.

1. Create the alert source in Uptimeify

Go to Incident Management → Alert Sources → New, pick the Prometheus Alertmanager preset, name it, and create it. On the success screen, copy the ingest URL (https://<your-domain>/api/im/ingest/<token>). It is shown once and never displayed again in cleartext. If you lose it, rotate the token from the source's Settings tab.

2. Add a webhook receiver in Alertmanager

Add a receiver to your alertmanager.yml pointing at the ingest URL:

receivers:
  - name: uptimeify
    webhook_configs:
      - url: "https://<your-domain>/api/im/ingest/<token>"
        send_resolved: true

send_resolved: true is required. Without it, Alertmanager never calls the webhook when an alert resolves, so incidents in Uptimeify would stay open forever even after the underlying problem clears.

3. Route alerts to the receiver

Reference the receiver from a route in the same file (either as the default route, or a nested route matching specific labels):

route:
  receiver: uptimeify
  # ...existing routing tree, or a nested `routes:` matcher instead of the default

Reload or restart Alertmanager to pick up the config change (amtool check-config first is a good sanity check).

Default field mapping

Alertmanager groups multiple firing alerts into one notification; the preset reads the title and instance from the first alert (alerts[0]) in that group, and severity from the group-level commonLabels:

Alertmanager fieldNormalized field
alerts[0].annotations.summary (falls back to commonLabels.alertname)Title
commonLabels.severitySeverity (via the map below)
status (top-level)Status: resolved resolves the alert, anything else (typically firing) keeps it open
alerts[0].labels.instanceHost
alerts[0].fingerprintDedup key: Alertmanager's own stable per-alert identity

Severity map

This only works if your alert rules set a severity label:

Alertmanager severity labelUptimeify severity
criticalsev1
warningsev3
infosev4

Any other value, or a missing severity label, falls back to the source's configured default severity. There is no sev2 mapping for Alertmanager, since its own severity convention is typically just critical/warning/info.

Sample payload

This is the shape of payload Uptimeify's Alertmanager preset expects:

{
  "version": "4",
  "groupKey": "{}:{alertname=\"InstanceDown\"}",
  "truncatedAlerts": 0,
  "status": "firing",
  "receiver": "uptimeify-webhook",
  "groupLabels": { "alertname": "InstanceDown" },
  "commonLabels": { "alertname": "InstanceDown", "severity": "critical", "job": "node" },
  "commonAnnotations": { "summary": "Instance 10.0.0.5:9100 down" },
  "externalURL": "http://alertmanager.example.com:9093",
  "alerts": [
    {
      "status": "firing",
      "labels": { "alertname": "InstanceDown", "severity": "critical", "instance": "10.0.0.5:9100", "job": "node" },
      "annotations": { "summary": "Instance 10.0.0.5:9100 down", "description": "10.0.0.5:9100 has been down for more than 5 minutes." },
      "startsAt": "2026-07-17T12:00:00.000Z",
      "endsAt": "0001-01-01T00:00:00Z",
      "generatorURL": "http://prometheus.example.com:9090/graph?g0.expr=up%7Bjob%3D%22node%22%7D+%3D%3D+0",
      "fingerprint": "5b6e6e8f7a1c9d3e"
    }
  ]
}

You can send this exact payload against your source's mapping from the Payload Mapping tab in the dashboard to verify the setup before reloading Alertmanager with the real receiver.

On this page