Update a channel endpoint
Update an existing channel endpoint by its unique identifier.
package main
import(
"context"
"github.com/novuhq/novu-go/v3"
"github.com/novuhq/novu-go/v3/models/components"
"log"
)
func main() {
ctx := context.Background()
s := v3.New(
v3.WithSecurity("YOUR_SECRET_KEY_HERE"),
)
res, err := s.ChannelEndpoints.Update(ctx, "<value>", components.UpdateChannelEndpointRequestDto{
Endpoint: components.CreateUpdateChannelEndpointRequestDtoEndpointSlackUserEndpointDto(
components.SlackUserEndpointDto{
UserID: "U123456789",
},
),
}, nil)
if err != nil {
log.Fatal(err)
}
if res.GetChannelEndpointResponseDto != nil {
switch res.GetChannelEndpointResponseDto.Endpoint.Type {
case components.EndpointTypeSlackChannelEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.SlackChannelEndpointDto is populated
case components.EndpointTypeSlackUserEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.SlackUserEndpointDto is populated
case components.EndpointTypeWebhookEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.WebhookEndpointDto is populated
case components.EndpointTypePhoneEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.PhoneEndpointDto is populated
case components.EndpointTypeMsTeamsChannelEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.MsTeamsChannelEndpointDto is populated
case components.EndpointTypeMsTeamsUserEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.MsTeamsUserEndpointDto is populated
case components.EndpointTypeTelegramChatEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.TelegramChatEndpointDto is populated
case components.EndpointTypeWebexRoomEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.WebexRoomEndpointDto is populated
case components.EndpointTypeWebexPersonEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.WebexPersonEndpointDto is populated
case components.EndpointTypeLineUserEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.LineUserEndpointDto is populated
case components.EndpointTypePagerDutyServiceEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.PagerDutyServiceEndpointDto is populated
case components.EndpointTypeOpsgenieIntegrationEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.OpsgenieIntegrationEndpointDto is populated
case components.EndpointTypeGrafanaOnCallIntegrationEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.GrafanaOnCallIntegrationEndpointDto is populated
case components.EndpointTypeToolWebhookEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.ToolWebhookEndpointDto is populated
}
}
}import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: "YOUR_SECRET_KEY_HERE",
});
async function run() {
const result = await novu.channelEndpoints.update({
endpoint: {
userId: "U123456789",
},
}, "<value>");
console.log(result);
}
run();using Novu;
using Novu.Models.Components;
var sdk = new NovuSDK(secretKey: "YOUR_SECRET_KEY_HERE");
var res = await sdk.ChannelEndpoints.UpdateAsync(
identifier: "<value>",
updateChannelEndpointRequestDto: new UpdateChannelEndpointRequestDto() {
Endpoint = UpdateChannelEndpointRequestDtoEndpoint.CreateSlackUserEndpointDto(
new SlackUserEndpointDto() {
UserId = "U123456789",
}
),
}
);
// handle responsedeclare(strict_types=1);
require 'vendor/autoload.php';
use novu;
use novu\Models\Components;
$sdk = novu\Novu::builder()
->setSecurity(
'YOUR_SECRET_KEY_HERE'
)
->build();
$updateChannelEndpointRequestDto = new Components\UpdateChannelEndpointRequestDto(
endpoint: new Components\SlackUserEndpointDto(
userId: 'U123456789',
),
);
$response = $sdk->channelEndpoints->update(
identifier: '<value>',
updateChannelEndpointRequestDto: $updateChannelEndpointRequestDto
);
if ($response->getChannelEndpointResponseDto !== null) {
// handle response
}from novu_py import Novu
with Novu(
secret_key="YOUR_SECRET_KEY_HERE",
) as novu:
res = novu.channel_endpoints.update(identifier="<value>", update_channel_endpoint_request_dto={
"endpoint": {
"user_id": "U123456789",
},
})
# Handle response
print(res)curl --request PATCH \
--url https://api.novu.co/v1/channel-endpoints/{identifier} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"endpoint": {
"channelId": "C123456789"
}
}
'const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({endpoint: {channelId: 'C123456789'}})
};
fetch('https://api.novu.co/v1/channel-endpoints/{identifier}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));HttpResponse<String> response = Unirest.patch("https://api.novu.co/v1/channel-endpoints/{identifier}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novu.co/v1/channel-endpoints/{identifier}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n }\n}"
response = http.request(request)
puts response.read_body{
"identifier": "<string>",
"channel": "in_app",
"providerId": "slack",
"integrationIdentifier": "slack-prod",
"connectionIdentifier": "slack-connection-abc123",
"subscriberId": "subscriber-123",
"contextKeys": [
"tenant:org-123",
"region:us-east-1"
],
"type": "slack_channel",
"endpoint": {
"channelId": "C123456789"
},
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"errors": {
"fieldName1": {
"messages": [
"Field is required",
"Must be a valid email address"
],
"value": "invalidEmail"
},
"fieldName2": {
"messages": [
"Must be at least 18 years old"
],
"value": 17
},
"fieldName3": {
"messages": [
"Must be a boolean value"
],
"value": true
},
"fieldName4": {
"messages": [
"Must be a valid object"
],
"value": {
"key": "value"
}
},
"fieldName5": {
"messages": [
"Field is missing"
],
"value": null
},
"fieldName6": {
"messages": [
"Undefined value"
]
}
},
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}"API rate limit exceeded"{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}"Please wait some time, then try again."endpoint (and optional top-level fields such as context where supported).
tool_webhook variant
Rotate a subscriber’s callback URL, headers, or HTTP method without recreating the endpoint:
curl -L -X PATCH 'https://api.novu.co/v1/channel-endpoints/<ENDPOINT_IDENTIFIER>' \
-H 'Content-Type: application/json' \
-H 'Authorization: ApiKey <NOVU_SECRET_KEY>' \
-d '{
"endpoint": {
"url": "https://customer.example.com/hooks/novu-v2",
"headers": { "Authorization": "Bearer rotated-token" },
"method": "POST"
}
}'
| Field | Type | Description |
|---|---|---|
endpoint.url | string | New destination URL (http: or https:). Re-encrypted on the linked connection. |
endpoint.headers | Record<string, string> | Optional. Replaces the stored header map for this endpoint. |
endpoint.method | "POST" | "PUT" | "PATCH" | Optional. New HTTP method override for this endpoint. |
url, headers, and method) from the linked channel connection.Authorizations
API key authentication. Allowed headers-- "Authorization: ApiKey <novu_secret_key>".
Headers
A header for idempotency purposes
Path Parameters
The unique identifier of the channel endpoint
Body
Updated endpoint data. The structure must match the existing channel endpoint type.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
Show child attributes
Show child attributes
Response
OK
The unique identifier of the channel endpoint.
The channel type (email, sms, push, chat, etc.).
in_app, email, sms, chat, push, tool The provider identifier (e.g., sendgrid, twilio, slack, etc.).
anypost, emailjs, mailgun, mailjet, mandrill, nodemailer, postmark, sendgrid, sendinblue, ses, netcore, infobip-email, resend, plunk, mailersend, mailtrap, clickatell, outlook365, novu-email, sparkpost, email-webhook, braze, novu-email-agent, nexmo, plivo, sms77, sms-central, sns, telnyx, twilio, gupshup, firetext, infobip-sms, burst-sms, bulk-sms, isend-sms, forty-six-elks, kannel, maqsam, termii, africas-talking, novu-sms, sendchamp, generic-sms, clicksend, bandwidth, messagebird, simpletexting, azure-sms, ring-central, brevo-sms, eazy-sms, mobishastra, afro-message, unifonic, smsmode, imedia, sinch, isendpro-sms, cm-telecom, ruach-sms, fcm, apns, expo, one-signal, pushpad, push-webhook, pusher-beams, appio, novu, slack, discord, msteams, webex-messaging, mattermost, ryver, zulip, grafana-on-call, getstream, rocket-chat, whatsapp-business, line, chat-webhook, novu-slack, telegram, sendblue, novu-web-chat, anthropic, novu-anthropic, anthropic-aws, pagerduty, opsgenie, grafana, tool-webhook "slack"
The identifier of the integration to use for this channel endpoint.
"slack-prod"
The identifier of the channel connection used for this endpoint.
"slack-connection-abc123"
The subscriber ID to which the channel endpoint is linked
"subscriber-123"
The context of the channel connection
["tenant:org-123", "region:us-east-1"]
Type of channel endpoint
slack_channel, slack_user, webhook, phone, ms_teams_channel, ms_teams_user, telegram_chat, webex_room, webex_person, line_user, pagerduty_service, opsgenie_integration, grafana_oncall_integration, tool_webhook "slack_channel"
Endpoint data specific to the channel type
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
- Option 11
- Option 12
- Option 13
- Option 14
Show child attributes
Show child attributes
The timestamp indicating when the channel endpoint was created, in ISO 8601 format.
The timestamp indicating when the channel endpoint was last updated, in ISO 8601 format.
Was this page helpful?
package main
import(
"context"
"github.com/novuhq/novu-go/v3"
"github.com/novuhq/novu-go/v3/models/components"
"log"
)
func main() {
ctx := context.Background()
s := v3.New(
v3.WithSecurity("YOUR_SECRET_KEY_HERE"),
)
res, err := s.ChannelEndpoints.Update(ctx, "<value>", components.UpdateChannelEndpointRequestDto{
Endpoint: components.CreateUpdateChannelEndpointRequestDtoEndpointSlackUserEndpointDto(
components.SlackUserEndpointDto{
UserID: "U123456789",
},
),
}, nil)
if err != nil {
log.Fatal(err)
}
if res.GetChannelEndpointResponseDto != nil {
switch res.GetChannelEndpointResponseDto.Endpoint.Type {
case components.EndpointTypeSlackChannelEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.SlackChannelEndpointDto is populated
case components.EndpointTypeSlackUserEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.SlackUserEndpointDto is populated
case components.EndpointTypeWebhookEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.WebhookEndpointDto is populated
case components.EndpointTypePhoneEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.PhoneEndpointDto is populated
case components.EndpointTypeMsTeamsChannelEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.MsTeamsChannelEndpointDto is populated
case components.EndpointTypeMsTeamsUserEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.MsTeamsUserEndpointDto is populated
case components.EndpointTypeTelegramChatEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.TelegramChatEndpointDto is populated
case components.EndpointTypeWebexRoomEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.WebexRoomEndpointDto is populated
case components.EndpointTypeWebexPersonEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.WebexPersonEndpointDto is populated
case components.EndpointTypeLineUserEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.LineUserEndpointDto is populated
case components.EndpointTypePagerDutyServiceEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.PagerDutyServiceEndpointDto is populated
case components.EndpointTypeOpsgenieIntegrationEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.OpsgenieIntegrationEndpointDto is populated
case components.EndpointTypeGrafanaOnCallIntegrationEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.GrafanaOnCallIntegrationEndpointDto is populated
case components.EndpointTypeToolWebhookEndpointDto:
// res.GetChannelEndpointResponseDto.Endpoint.ToolWebhookEndpointDto is populated
}
}
}import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: "YOUR_SECRET_KEY_HERE",
});
async function run() {
const result = await novu.channelEndpoints.update({
endpoint: {
userId: "U123456789",
},
}, "<value>");
console.log(result);
}
run();using Novu;
using Novu.Models.Components;
var sdk = new NovuSDK(secretKey: "YOUR_SECRET_KEY_HERE");
var res = await sdk.ChannelEndpoints.UpdateAsync(
identifier: "<value>",
updateChannelEndpointRequestDto: new UpdateChannelEndpointRequestDto() {
Endpoint = UpdateChannelEndpointRequestDtoEndpoint.CreateSlackUserEndpointDto(
new SlackUserEndpointDto() {
UserId = "U123456789",
}
),
}
);
// handle responsedeclare(strict_types=1);
require 'vendor/autoload.php';
use novu;
use novu\Models\Components;
$sdk = novu\Novu::builder()
->setSecurity(
'YOUR_SECRET_KEY_HERE'
)
->build();
$updateChannelEndpointRequestDto = new Components\UpdateChannelEndpointRequestDto(
endpoint: new Components\SlackUserEndpointDto(
userId: 'U123456789',
),
);
$response = $sdk->channelEndpoints->update(
identifier: '<value>',
updateChannelEndpointRequestDto: $updateChannelEndpointRequestDto
);
if ($response->getChannelEndpointResponseDto !== null) {
// handle response
}from novu_py import Novu
with Novu(
secret_key="YOUR_SECRET_KEY_HERE",
) as novu:
res = novu.channel_endpoints.update(identifier="<value>", update_channel_endpoint_request_dto={
"endpoint": {
"user_id": "U123456789",
},
})
# Handle response
print(res)curl --request PATCH \
--url https://api.novu.co/v1/channel-endpoints/{identifier} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"endpoint": {
"channelId": "C123456789"
}
}
'const options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({endpoint: {channelId: 'C123456789'}})
};
fetch('https://api.novu.co/v1/channel-endpoints/{identifier}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));HttpResponse<String> response = Unirest.patch("https://api.novu.co/v1/channel-endpoints/{identifier}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novu.co/v1/channel-endpoints/{identifier}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n }\n}"
response = http.request(request)
puts response.read_body{
"identifier": "<string>",
"channel": "in_app",
"providerId": "slack",
"integrationIdentifier": "slack-prod",
"connectionIdentifier": "slack-connection-abc123",
"subscriberId": "subscriber-123",
"contextKeys": [
"tenant:org-123",
"region:us-east-1"
],
"type": "slack_channel",
"endpoint": {
"channelId": "C123456789"
},
"createdAt": "<string>",
"updatedAt": "<string>"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"errors": {
"fieldName1": {
"messages": [
"Field is required",
"Must be a valid email address"
],
"value": "invalidEmail"
},
"fieldName2": {
"messages": [
"Must be at least 18 years old"
],
"value": 17
},
"fieldName3": {
"messages": [
"Must be a boolean value"
],
"value": true
},
"fieldName4": {
"messages": [
"Must be a valid object"
],
"value": {
"key": "value"
}
},
"fieldName5": {
"messages": [
"Field is missing"
],
"value": null
},
"fieldName6": {
"messages": [
"Undefined value"
]
}
},
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}"API rate limit exceeded"{
"statusCode": 404,
"timestamp": "2024-12-12T13:00:00Z",
"path": "/api/v1/resource",
"message": "xx xx xx ",
"ctx": {
"workflowId": "some_wf_id",
"stepId": "some_wf_id"
},
"errorId": "abc123"
}"Please wait some time, then try again."