Skip to content

`POST /v1/orgs/{org}/notification-channels`.

POST
/v1/orgs/{org}/notification-channels
curl --request POST \
--url https://api.updawg.net/v1/orgs/example/notification-channels \
--header 'Content-Type: application/json' \
--data '{ "config": { "additionalProperty": { "additionalProperty": {} } }, "kind": "example", "name": "example" }'
org
required
string

Organization slug.

Media typeapplication/json
object
config
required

The kind’s own fields: webhook_url for Slack and Teams; to (a list of addresses) for email; topic_url and optionally token for ntfy; routing_key for PagerDuty; url for a webhook. ⚠️ Never returned.

object
key
additional properties
One of:
string
kind
required

slack, teams, email, ntfy, pagerduty or webhook.

string
name
required

How rules and people pick it. Unique in the organization.

string
Examplegenerated
{
"config": {
"additionalProperty": {
"additionalProperty": {}
}
},
"kind": "example",
"name": "example"
}

Saved, encrypted. The configuration is not in this response or any other; a webhook’s signing_secret is, and only here.

Media typeapplication/json

A channel just saved, and — for a webhook whose configuration was just set — the secret its requests are signed with. ⚠️ Shown once: it is stored encrypted with the rest of the configuration and never returned again. Replace the configuration to get a new one.

object
created_at
required
string format: date-time
display
required

Enough to tell channels apart — hooks.slack.com …WXYZ — and never enough to use one.

string
id
required

nch_….

string
kind
required
string
name
required
string
updated_at
required
string format: date-time
signing_secret

whsec_…. See the webhook signing scheme in the API docs.

string | null
Examplegenerated
{
"created_at": "2026-04-15T12:00:00Z",
"display": "example",
"id": "example",
"kind": "example",
"name": "example",
"updated_at": "2026-04-15T12:00:00Z",
"signing_secret": "example"
}

No name, an unknown kind, a configuration that kind does not accept, or a webhook secret (Updawg makes it).

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

No session.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

Not permitted for this role. Or the plan does not include this kind of channel (Slack, Teams, ntfy and PagerDuty are Team; webhooks Business): plan-required.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

No such organization, or not yours — one answer for both.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

A channel with that name exists.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

Over the organization’s request limit. Retry-After says when to try again; RateLimit-Limit is the burst.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

This deployment cannot encrypt channel credentials.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}