Skip to content
NebulaCtrldocs

Webhook payload

The JSON body, headers, event names and delivery rules of a webhook notification channel, payload shape version 1.

A webhook channel sends one HTTP POST per event to its URL. The body is JSON, shaped as version 1 below. The shape changes version only when a field is removed, renamed or changes meaning; a new field can appear without one, so ignore keys you do not know.

Quick reference

KeyTypeAlways present
versionnumberYes. 1.
idstringYes. The delivery id.
eventstringYes.
kindstringYes.
severitystringYes.
title, bodystringYes. body can be empty.
urlstringYes.
testbooleanYes.
createdAtstringYes.
organizationobjectYes.
project, environment, service, release, deployment, build, approval, cluster, alertobject or nullThe key is always present; the value is null when the event does not concern it.

Example

{
  "version": 1,
  "id": "6f1c2f0e-3f55-4a62-9a8e-7c8d1d0a1b2c",
  "event": "deployment.failed",
  "kind": "failure",
  "severity": "error",
  "title": "Release #7 of web failed to deploy to production",
  "body": "Blocked on readiness. Probe failed. Open the deployment to see which stage stopped, then fix and redeploy.",
  "url": "https://nebula.example.com/acme/deployments/0d9d4f58-1b1c-4f3a-8d0e-2f6b8e7a9c10",
  "test": false,
  "createdAt": "2026-03-14T14:12:41.204183Z",
  "organization": { "id": "ORGANIZATION_ID", "slug": "acme" },
  "project": { "id": "PROJECT_ID", "name": "Shop" },
  "environment": { "id": "ENVIRONMENT_ID", "name": "production", "production": true },
  "service": { "id": "SERVICE_ID", "name": "web" },
  "release": { "id": "RELEASE_ID", "number": 7 },
  "deployment": { "id": "DEPLOYMENT_ID" },
  "build": null,
  "approval": null,
  "cluster": null,
  "alert": null
}

Top-level keys

id

The delivery id, a UUID. Every retry of one delivery carries the same id, so a receiver can ignore a repeat. The same value is in the X-Nebula-Delivery header.

event

What happened. One of:

EventKindObjects set
approval.requestedapprovalproject, environment, service (if the approval names one), approval
deployment.failedfailureproject, environment, service, release, deployment
deployment.healthydeployproject, environment, service, release, deployment
build.failedfailureproject, environment, service, build
volume_backup.failedfailureproject, environment, service
cluster.disconnectedwarningcluster
cluster.agent_update_availablewarningcluster
certificate.expiringwarningproject, environment, service
alert.raisedalertproject, environment, service, alert
alert.resolvedalertproject, environment, service, alert
testdeployNone. Sent by Send test; test is true.

Which events reach a webhook follows the same rules as Slack: see See who is notified.

kind

The subscription the event belongs to: approval, failure, warning, deploy or alert. A channel receives the events whose kind it ticked under Events.

severity

info, warning, error or critical. Failures are error. A cluster losing contact, an expiring certificate and a warning-level alert are warning. A critical alert is critical. Approvals, healthy deployments, available agent updates, tests and recovered alerts are info.

title, body, url

The same text and console link a Slack message carries. url opens the event's target in the console.

createdAt

When the event was recorded, as an RFC 3339 timestamp in UTC. A retry keeps the original time.

Objects

KeyFields
organizationid, slug
projectid, name
environmentid, name, production (boolean)
serviceid, name
releaseid, number
deploymentid
buildid
approvalid
clusterid, name
alertid, rule

alert.rule names the rule that fired, for example volume_usage, and stays stable across releases.

Request

HeaderValue
Content-Typeapplication/json
User-AgentNebulaCtrl-Webhook/1
X-Nebula-EventThe event value.
X-Nebula-DeliveryThe id value.
Your headersEach header you set on the channel, with its stored value.

Delivery

  • The URL is dialled through the same address filter as Slack: a host that resolves only to private, loopback or link-local addresses is refused.
  • Any 2xx status accepts the delivery. A redirect counts as a failure and is not followed.
  • An HTTP 4xx answer other than 408 and 429 stops delivery at once. Anything else, and a timeout after 10 seconds, is retried with a wait that starts at 30 seconds and doubles to at most an hour, for up to 24 attempts.
  • The channel shows the last failure on Settings > Integrations, with the status code and the start of the response body.
  • Deliveries for one channel are not ordered. Use createdAt to order events.

On this page