Inbound URLs

Receive webhooks from other services as they are. Paste the URL, with no authentication header.

POST https://api.nodd.blipdrop.net/in/{integration}/{inbound_key}

Issuing a URL

In the channel details in the app, open Add integration, choose the integration, and issue it with Face ID. The URL is shown only then. If you lose it, revoke it and issue a new one. Managers, Owners, and Admins can do this.

The URL itself is a secret. A leaked URL still cannot ask for approval, because inbound URLs accept only messages without buttons.

Integrations

slackThe Incoming Webhook format. It reads text, then attachments[0].text, then attachments[0].fallback. The first line is the title and the rest is the body. Form encoded payload= also works
grafanaA Grafana webhook contact point
alertmanagerAlertmanager webhook_configs
datadogDatadog Webhooks. Recovery resolves the alert
sentrySentry Internal Integrations and alert rules. Resolving is linked too
pagerdutyPagerDuty Generic Webhooks (v3). Resolving is linked too
genericThe same format as POST /v1/messages, accepting only notice, progress, and alert. approval and choice get 422

Datadog, Sentry, and PagerDuty URLs can be issued from Nodd 1.1 or later.

Issue a generic URL in the app under Add integration > Generic webhook. Use it for services that can't set an auth header.

Examples

curl https://api.nodd.blipdrop.net/in/slack/nodd_live_i_... \
  -H "Content-Type: application/json" \
  -d '{"text":"Deploy finished\nv2.4.1 is live"}'
receivers:
  - name: nodd
    webhook_configs:
      - url: https://api.nodd.blipdrop.net/in/alertmanager/nodd_live_i_...
        send_resolved: true
curl https://api.nodd.blipdrop.net/in/generic/nodd_live_i_... \
  -H "Content-Type: application/json" \
  -d '{"kind":"alert","level":"high","title":"Disk is 5% free","alert_key":"disk.full:web-1"}'

Datadog

  1. Issue a Datadog URL in the app
  2. In Datadog, open Webhooks under Integrations and paste the URL into a new webhook
  3. Set Payload to the JSON below
  4. Add @webhook-NAME to the monitor's notification message
{"alert_id":"$ALERT_ID","scope":"$ALERT_SCOPE","title":"$EVENT_TITLE","message":"$TEXT_ONLY_MSG","transition":"$ALERT_TRANSITION","priority":"$ALERT_PRIORITY","url":"$LINK"}

A recovery (Recovered) resolves the same alert. $ALERT_ID and $ALERT_SCOPE together link firing and recovery.

Sentry

  1. Issue a Sentry URL in the app
  2. In Sentry, open Developer Settings under Settings and create an Internal Integration
  3. Paste the URL into Webhook URL and turn on Issue under Webhooks
  4. To send from alert rules too, turn on Alert Rule Action and pick the integration as a rule action

A created Issue notifies, and resolved resolves it. Metric alerts notify on critical, use normal for warning, and resolve on resolved. Other events get 202 and do not notify.

PagerDuty

  1. Issue a PagerDuty URL in the app
  2. In PagerDuty, open Generic Webhooks (v3) under Integrations and paste the URL into a new webhook
  3. Select incident.triggered and incident.resolved as events

incident.resolved resolves the same alert. If you also select incident.reopened, reopened incidents notify too. Other events, such as acknowledgements, are accepted without a notification.

How Datadog, Sentry, and PagerDuty are converted

KindAll become alert
TitleDatadog title, the Sentry Issue title, or the PagerDuty incident title, cut at 120 characters
BodyDatadog message, Sentry culprit, or the PagerDuty service name, cut at 1,000 characters
LevelDatadog: Warn, Re-Warn, and P3 to P5 give normal, anything else high. Sentry: fatal and error give high, debug gives low, anything else normal. PagerDuty: urgency: low gives normal, anything else high
LinksThe source URL, if it is https
alert_key, dedupe_keyBuilt from each service's ID, so firing and recovery get the same value

n8n, Zapier, and other automation tools

If you do not need a response, post to a generic URL from an HTTP step. If you do, call POST /v1/messages with a send key and poll GET /v1/messages/{id} for the result. See the API.

How Grafana and Alertmanager are converted

KindFiring alerts become alert. status: resolved resolves the same alert
TitleThe alertname label, then the summary annotation
BodyThe description annotation, then summary
Levelseverity of critical, page, high, or error gives high. info, low, or none gives low. Anything else gives normal
FieldsLabels other than alertname and severity, up to 6
Linkshttps values of generatorURL, dashboardURL, and panelURL, up to 2
alert_key, dedupe_keyfingerprint, or a value derived from the labels. Firing and recovery get the same value

Limits