Webhook

The webhook alert channel sends a structured JSON payload to any URL that you choose. This lets you forward alerts to your own services, automation tools, or custom integrations.

How it works

  • Simple Observability sends an HTTP POST request to your URL whenever an alert fires.
  • The request body is a JSON object with the alert type, status, description, timestamp, and a link to the dashboard.
  • Your endpoint must return a 2xx status code. If it does not, Simple Observability logs an error.

Payload format

Each request has the same top-level fields:

FieldTypeDescription
event_typestringThe alert category: RULE_ALERT, SYSTEM_ALERT, JOB_ALERT, ENDPOINT_ALERT, or TEST.
titlestringA short summary of the alert.
statusstringThe event status (for example, FIRING or RESOLVED).
severitystring | nullThe severity level, when applicable. null for rule and job alerts.
descriptionstringA human-readable explanation of the alert.
timestampstringThe time of the event, in ISO 8601 format. Omitted for test messages.
urlstring | nullA link to the relevant page in the dashboard. null for system and test alerts.
dataobjectType-specific details about the alert.

The data object changes with the event_type. The sections below show every field for each type.

Rule alerts

Sent when an alert rule fires or resolves. The top-level status is FIRING or RESOLVED, and severity is null.

data fieldTypeDescription
data.rule.idstringThe UUID of the rule.
data.rule.namestringThe name of the rule.
data.rule.descriptionstringThe description of the rule.
data.rule.thresholdnumber | nullThe configured threshold value.
data.evaluation_window.startstring | nullThe start of the evaluation window, in ISO 8601 format.
data.evaluation_window.endstring | nullThe end of the evaluation window, in ISO 8601 format.
data.trigger_valuesarrayThe values that triggered the alert. Omitted when the list is empty.
data.trigger_values[].tagsobjectThe metric tags for this value (for example, {"host": "server-01"}).
data.trigger_values[].valuestringThe metric value, formatted to four decimal places.
{
  "event_type": "RULE_ALERT",
  "title": "[FIRING] High CPU Usage",
  "status": "FIRING",
  "severity": null,
  "description": "CPU usage above 90% for 5 minutes",
  "timestamp": "2026-08-10T12:00:00+00:00",
  "url": "https://app.simpleobservability.com/alerts/abc-123",
  "data": {
    "rule": {
      "id": "abc-123",
      "name": "High CPU Usage",
      "description": "CPU usage above 90% for 5 minutes",
      "threshold": 90
    },
    "evaluation_window": {
      "start": "2026-08-10T11:55:00+00:00",
      "end": "2026-08-10T12:00:00+00:00"
    },
    "trigger_values": [
      {"tags": {"host": "server-01"}, "value": "95.3000"}
    ]
  }
}

System alerts

Sent when a server goes down or comes back online. The top-level status is SERVER_DOWN or SERVER_UP, and url is null.

data fieldTypeDescription
data.server.idstringThe UUID of the server.
data.server.namestringThe name of the server.
data.event_typestringSERVER_DOWN or SERVER_UP.

The severity field at the top level is one of CRITICAL, ERROR, WARNING, INFO, or SUCCESS.

{
  "event_type": "SYSTEM_ALERT",
  "title": "[SERVER_DOWN] prod-web-01",
  "status": "SERVER_DOWN",
  "severity": "CRITICAL",
  "description": "Server 'prod-web-01' may be down. No heartbeat received in the last 5 minutes.",
  "timestamp": "2026-08-10T12:05:00+00:00",
  "url": null,
  "data": {
    "server": {
      "id": "def-456",
      "name": "prod-web-01"
    },
    "event_type": "SERVER_DOWN"
  }
}

Job alerts

Sent when a job fails, is missed, times out, or succeeds. The top-level status is FAIL, MISSED, TIMEOUT, or SUCCESS, and severity is null.

data fieldTypeDescription
data.job.idstringThe UUID of the job.
data.job.namestringThe name of the job.
data.job.serverstringThe name of the server that runs the job.
data.job.schedulestringThe cron schedule of the job.
data.job.timezonestringThe timezone of the schedule.
data.job.last_pingstringThe time of the last ping, in ISO 8601 format. Omitted when no ping exists.
data.job.next_expected_runstringThe time of the next expected run, in ISO 8601 format. Omitted when not set.
data.event_typestringSUCCESS, FAIL, MISSED, or TIMEOUT.
data.executionobjectDetails about the last execution. Omitted when no execution exists.
data.execution.statusstringThe status of the execution (for example, Failed or Success).
data.execution.startstringThe start time, in ISO 8601 format. Omitted when not set.
data.execution.endstringThe end time, in ISO 8601 format. Omitted when not set.
data.execution.durationstringThe duration as a human-readable string (for example, 3m 42s). Omitted when not set.
{
  "event_type": "JOB_ALERT",
  "title": "[FAIL] nightly-backup",
  "status": "FAIL",
  "severity": null,
  "description": "Job 'nightly-backup' has failed.",
  "timestamp": "2026-08-10T02:15:00+00:00",
  "url": "https://app.simpleobservability.com/jobs/ghi-789",
  "data": {
    "job": {
      "id": "ghi-789",
      "name": "nightly-backup",
      "server": "prod-db-01",
      "schedule": "0 2 * * *",
      "timezone": "UTC",
      "last_ping": "2026-08-10T02:00:00+00:00",
      "next_expected_run": "2026-08-11T02:00:00+00:00"
    },
    "event_type": "FAIL",
    "execution": {
      "status": "Failed",
      "start": "2026-08-10T02:00:00+00:00",
      "end": "2026-08-10T02:15:00+00:00",
      "duration": "15m 0s"
    }
  }
}

Endpoint alerts

Sent when an endpoint goes down or recovers. The top-level url links to the endpoint page in the dashboard.

data fieldTypeDescription
data.endpoint.idstringThe UUID of the endpoint.
data.endpoint.namestringThe name of the endpoint.
data.endpoint.urlstringThe URL that the endpoint monitors.
data.endpoint.methodstringThe HTTP method used for the check (for example, GET or POST).
data.endpoint.last_statusstring | numberThe last HTTP status code received.
data.event_typestringENDPOINT_DOWN or ENDPOINT_UP.

The severity field at the top level is one of ERROR, WARNING, SUCCESS, or INFO.

{
  "event_type": "ENDPOINT_ALERT",
  "title": "[ENDPOINT_DOWN] billing-api",
  "status": "ENDPOINT_DOWN",
  "severity": "ERROR",
  "description": "Endpoint 'billing-api' is currently unreachable.",
  "timestamp": "2026-08-10T08:00:00+00:00",
  "url": "https://app.simpleobservability.com/endpoints/jkl-012",
  "data": {
    "endpoint": {
      "id": "jkl-012",
      "name": "billing-api",
      "url": "https://api.example.com/health",
      "method": "GET",
      "last_status": 503
    },
    "event_type": "ENDPOINT_DOWN"
  }
}

Test messages

When you click the Test button, the payload has only three top-level fields. The data object is empty.

{
  "event_type": "TEST",
  "title": "Test Message",
  "description": "This is a test webhook message from Simple Observability.",
  "data": {}
}

Integration walkthrough

Connecting the webhook

  1. In your Simple Observability account, open the Channels page.
  2. In the top right corner, click the Add Channel button.
  3. From the list of channel types, select Webhook.
  4. Enter the URL of the endpoint that will receive the alerts.
  5. Save the channel.

Sending a test alert

To make sure that the connection works, click the Test button after you create the channel.

A test payload is sent to your URL. The event_type field is set to TEST.

How to uninstall

To remove the webhook channel, delete it from the Channels page in your Simple Observability account. This stops all requests to your endpoint immediately.