---
title: "Register a signed webhook for watch notifications"
method: POST
path: "/api/v1/notification-channel/webhook"
---

# Register a signed webhook for watch notifications

`POST /api/v1/notification-channel/webhook`

## Request

- Base URL: `https://offnadir-delta.com`
- URL: `https://offnadir-delta.com/api/v1/notification-channel/webhook`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Free. Registers an https URL as your notification channel (it replaces a connected Slack, Discord or webhook channel — one per account). Every delivery is a JSON POST signed with HMAC-SHA256: the header `X-Delta-Signature: t=<unix seconds>,v1=<hex>` carries HMAC-SHA256(signing_secret, "<t>.<raw body>"), `X-Delta-Delivery-Id` is unique per POST, and `X-Delta-Event` is `watch.notification` (or `test` for the confirmation sent by POST /api/v1/notification-channel/test, whose body is `{"type": "test", "message", "settings_url", "sent_at"}`). Verify the signature over the raw body and reject an old `t` to stop replays of a captured request. The body is `{"type": "watch.notification", "replay": false, "watch": {...}, "event": {...} | null, "changes": [{"id", "kind", "created_at", "line", "label", "from", "to", "locked", "opens_on", ...}]}` — values the plan withholds are null with `locked: true`, as in the app. The URL must be https on port 443 and resolve to a public address; redirects are not followed. The signing secret is returned ONLY in this response; register again to get a new one. Deliveries run with the hourly watch notifications; a 404 or 410 stops the channel, and other failures are retried each hour until 24 in a row stop it. Which watches deliver here is `notify_chat` on each watch.

## Request body

- object
  - `url` string, required: The https URL to POST notifications to (port 443, public host).

## Response `200`

The registered channel and its signing secret (shown once).

- object
  - `channel` object
  - `signing_secret` string

## Other responses

- `400`: Error response with a stable machine-readable code.
- `401`: Error response with a stable machine-readable code.
- `403`: Error response with a stable machine-readable code.
- `429`: Error response with a stable machine-readable code.

---

[API](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api.md) · [All operations](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api/llms.txt) · [OpenAPI document](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api/revisions/5cf3f2bed5a2?raw)
