Update Notification Channel
Updates a notification channel.
PATCH /api/notification-channels/:id
Config is merged with existing secrets, preserving encrypted fields that are not provided, as long as the channel keeps its type.
Changing type is different: the stored config belongs to the old channel type, so it is discarded entirely and the config is rebuilt from the config in this request. A type change therefore requires config (otherwise 400), and secrets of the old type do not carry over.
Request Body (all optional)
| Field | Type | Description |
|---|---|---|
type | string | Channel type, one of the supported types. Requires config. |
name | string | Display name, 1 to 100 characters |
config | object|string | Merged with existing secrets (same type) or replaces the config entirely (type change). JSON object or JSON string of at most 20 kB. |
delaySeconds | number | Delay before sending, integer 0 to 86400 |
conditions | object|string|null | Alert conditions, JSON object or JSON string of at most 20 kB |
allowedPackageTypes | string[]|null | Package types this channel applies to, max 50 entries |
isActive | boolean | Whether the channel is active |
delaySeconds runs on its own timer for this channel, starting from the moment this channel
would notify, independent of any other channel on the same alert. If a maintenance window starts
before that time elapses, or the incident is already resolved by then, nothing is delivered on
this channel.
priority has been removed from channel configuration. A request that still sends it is
accepted and the field is simply ignored, so existing integrations keep working unchanged.
Example (cURL)
curl -X PATCH "$BASE_URL/api/notification-channels/1" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Email Channel",
"isActive": true
}'Common errors
400 Bad Requestwithdata.codeinvalidRequestBodywhen anemailorsmschannel carries a recipient the delivery path could never accept. Checked fortype: emailinconfig.toandconfig.email, and fortype: smsinconfig.to,config.phoneNumbersandconfig.phoneNumber; a comma-separated string and an array are both read as a list and every entry is checked, and the message names the first offending value. An email recipient needs exactly one@with something on both sides and no spaces, the formName <address>is allowed; an SMS recipient must be E.164, a+, a digit 1-9, then 7 to 14 more digits, with no spaces, dashes or brackets. These are the delivery path's own rules, so a value refused here could never have received an alert. A channel with NO recipient of its own stays valid: delivery then falls back to the customer's or the organization's stored address. Onlyemailandsmsare checked; on every other type these keys mean something else.400 Bad Requestwithdata.codeinvalidRequestBodywhen a target URL inconfigis not a parseablehttp/httpsURL, or points at a private, loopback or link-local address, atlocalhost, at a reserved private-use name (.local,.internal,.home.arpa) or at a single-label host. Every top-levelconfigstring starting withhttp://orhttps://counts as a target URL; fields carrying message content (bodyTemplate,webhookBodyTemplate,headers) are exempt, a link into your own network is legitimate there. The check does not resolve DNS, so a public name that only later resolves privately is stopped at delivery time instead.400 Bad Requestwhen the body fails validation (unknowntype,nameover 100 characters,configthat is not a JSON object,allowedPackageTypesthat is not an array)400 Bad Requestwithdata.code: "configRequiredForTypeChange"whentypechanges and noconfigis sent401 Unauthorizedwhen not authenticated403 Forbiddenwhen accessing channels outside your scope404 Not foundwhen the channel does not exist
Response
Returns the updated notification channel object. See Error Codes for error responses.
Permissions
Organization admins may write channels at any level. A customer-scoped login (role readonly)
may create, update and delete channels bound to one of ITS OWN customers: that is what the
integrations page in the dashboard offers the role, and until 04.09.2026 the API refused it with
a bare 403.
Two limits remain. An ORGANIZATION-level channel, one carrying no customerId, stays
admin-only. And a channel of a customer outside the caller's scope is refused, as before. The
roles editor and responder are not writers here.