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.
Integrations
slack | The 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 |
|---|---|
grafana | A Grafana webhook contact point |
alertmanager | Alertmanager webhook_configs |
datadog | Datadog Webhooks. Recovery resolves the alert |
sentry | Sentry Internal Integrations and alert rules. Resolving is linked too |
pagerduty | PagerDuty Generic Webhooks (v3). Resolving is linked too |
generic | The 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
- Issue a Datadog URL in the app
- In Datadog, open Webhooks under Integrations and paste the URL into a new webhook
- Set Payload to the JSON below
- Add
@webhook-NAMEto 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
- Issue a Sentry URL in the app
- In Sentry, open Developer Settings under Settings and create an Internal Integration
- Paste the URL into Webhook URL and turn on Issue under Webhooks
- 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
- Issue a PagerDuty URL in the app
- In PagerDuty, open Generic Webhooks (v3) under Integrations and paste the URL into a new webhook
- Select
incident.triggeredandincident.resolvedas 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
| Kind | All become alert |
|---|---|
| Title | Datadog title, the Sentry Issue title, or the PagerDuty incident title, cut at 120 characters |
| Body | Datadog message, Sentry culprit, or the PagerDuty service name, cut at 1,000 characters |
| Level | Datadog: 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 |
| Links | The source URL, if it is https |
alert_key, dedupe_key | Built 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
| Kind | Firing alerts become alert. status: resolved resolves the same alert |
|---|---|
| Title | The alertname label, then the summary annotation |
| Body | The description annotation, then summary |
| Level | severity of critical, page, high, or error gives high. info, low, or none gives low. Anything else gives normal |
| Fields | Labels other than alertname and severity, up to 6 |
| Links | https values of generatorURL, dashboardURL, and panelURL, up to 2 |
alert_key, dedupe_key | fingerprint, or a value derived from the labels. Firing and recovery get the same value |
Limits
- Payloads can be up to 256 KB
- One request delivers up to 20 firing alerts. Beyond that, it delivers 19 plus one summary with the remaining count
- One request resolves up to 100 alerts
- Rate limits match the send API. It answers
202on acceptance