Create a channel endpoint
Create a new channel endpoint for a resource.
import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: "YOUR_SECRET_KEY_HERE",
});
async function run() {
const result = await novu.channelEndpoints.create({
subscriberId: "subscriber-123",
integrationIdentifier: "slack-prod",
type: "slack_channel",
endpoint: {
channelId: "C123456789",
},
});
console.log(result);
}
run();using Novu;
using Novu.Models.Components;
using Novu.Models.Requests;
var sdk = new NovuSDK(secretKey: "YOUR_SECRET_KEY_HERE");
var res = await sdk.ChannelEndpoints.CreateAsync(requestBody: ChannelEndpointsControllerCreateChannelEndpointRequestBody.CreateSlackChannel(
new CreateSlackChannelEndpointDto() {
SubscriberId = "subscriber-123",
IntegrationIdentifier = "slack-prod",
Type = CreateSlackChannelEndpointDtoType.SlackChannel,
Endpoint = new SlackChannelEndpointDto() {
ChannelId = "C123456789",
},
}
));
// 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();
$response = $sdk->channelEndpoints->create(
requestBody: new Components\CreateSlackChannelEndpointDto(
subscriberId: 'subscriber-123',
integrationIdentifier: 'slack-prod',
type: Components\CreateSlackChannelEndpointDtoType::SlackChannel,
endpoint: new Components\SlackChannelEndpointDto(
channelId: 'C123456789',
),
)
);
if ($response->getChannelEndpointResponseDto !== null) {
// handle response
}import novu_py
from novu_py import Novu
with Novu(
secret_key="YOUR_SECRET_KEY_HERE",
) as novu:
res = novu.channel_endpoints.create(request_body={
"subscriber_id": "subscriber-123",
"integration_identifier": "slack-prod",
"type": novu_py.CreateSlackChannelEndpointDtoType.SLACK_CHANNEL,
"endpoint": {
"channel_id": "C123456789",
},
})
# Handle response
print(res)package main
import(
"context"
"github.com/novuhq/novu-go/v3"
"github.com/novuhq/novu-go/v3/models/components"
"github.com/novuhq/novu-go/v3/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := v3.New(
v3.WithSecurity("YOUR_SECRET_KEY_HERE"),
)
res, err := s.ChannelEndpoints.Create(ctx, operations.CreateChannelEndpointsControllerCreateChannelEndpointRequestBodySlackChannel(
components.CreateSlackChannelEndpointDto{
SubscriberID: "subscriber-123",
IntegrationIdentifier: "slack-prod",
Type: components.CreateSlackChannelEndpointDtoTypeSlackChannel,
Endpoint: components.SlackChannelEndpointDto{
ChannelID: "C123456789",
},
},
), 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
}
}
}curl --request POST \
--url https://api.novu.co/v1/channel-endpoints \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"subscriberId": "subscriber-123",
"integrationIdentifier": "slack-prod",
"type": "slack_channel",
"endpoint": {
"channelId": "C123456789"
},
"identifier": "slack-channel-user123-abc4",
"context": {},
"connectionIdentifier": "slack-connection-abc123"
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subscriberId: 'subscriber-123',
integrationIdentifier: 'slack-prod',
type: 'slack_channel',
endpoint: {channelId: 'C123456789'},
identifier: 'slack-channel-user123-abc4',
context: {},
connectionIdentifier: 'slack-connection-abc123'
})
};
fetch('https://api.novu.co/v1/channel-endpoints', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));HttpResponse<String> response = Unirest.post("https://api.novu.co/v1/channel-endpoints")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"subscriberId\": \"subscriber-123\",\n \"integrationIdentifier\": \"slack-prod\",\n \"type\": \"slack_channel\",\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n },\n \"identifier\": \"slack-channel-user123-abc4\",\n \"context\": {},\n \"connectionIdentifier\": \"slack-connection-abc123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novu.co/v1/channel-endpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subscriberId\": \"subscriber-123\",\n \"integrationIdentifier\": \"slack-prod\",\n \"type\": \"slack_channel\",\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n },\n \"identifier\": \"slack-channel-user123-abc4\",\n \"context\": {},\n \"connectionIdentifier\": \"slack-connection-abc123\"\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."Authorizations
API key authentication. Allowed headers-- "Authorization: ApiKey <novu_secret_key>".
Headers
A header for idempotency purposes
Body
Channel endpoint creation request. The structure varies based on the type field.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
The subscriber ID to which the channel endpoint is linked
"subscriber-123"
The identifier of the integration to use for this channel endpoint.
"slack-prod"
Type of channel endpoint
slack_channel "slack_channel"
Slack channel endpoint data
Show child attributes
Show child attributes
The unique identifier for the channel endpoint. If not provided, one will be generated automatically.
"slack-channel-user123-abc4"
Show child attributes
Show child attributes
The identifier of the channel connection to use for this channel endpoint.
"slack-connection-abc123"
Response
Created
The unique identifier of the channel endpoint.
The channel type (email, sms, push, chat, etc.).
in_app, email, sms, chat, push The provider identifier (e.g., sendgrid, twilio, slack, etc.).
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, fcm, apns, expo, one-signal, pushpad, push-webhook, pusher-beams, appio, novu, slack, discord, msteams, mattermost, ryver, zulip, grafana-on-call, getstream, rocket-chat, whatsapp-business, chat-webhook, novu-slack, telegram, anthropic, novu-anthropic, anthropic-aws "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 "slack_channel"
Endpoint data specific to the channel type
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
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?
import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: "YOUR_SECRET_KEY_HERE",
});
async function run() {
const result = await novu.channelEndpoints.create({
subscriberId: "subscriber-123",
integrationIdentifier: "slack-prod",
type: "slack_channel",
endpoint: {
channelId: "C123456789",
},
});
console.log(result);
}
run();using Novu;
using Novu.Models.Components;
using Novu.Models.Requests;
var sdk = new NovuSDK(secretKey: "YOUR_SECRET_KEY_HERE");
var res = await sdk.ChannelEndpoints.CreateAsync(requestBody: ChannelEndpointsControllerCreateChannelEndpointRequestBody.CreateSlackChannel(
new CreateSlackChannelEndpointDto() {
SubscriberId = "subscriber-123",
IntegrationIdentifier = "slack-prod",
Type = CreateSlackChannelEndpointDtoType.SlackChannel,
Endpoint = new SlackChannelEndpointDto() {
ChannelId = "C123456789",
},
}
));
// 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();
$response = $sdk->channelEndpoints->create(
requestBody: new Components\CreateSlackChannelEndpointDto(
subscriberId: 'subscriber-123',
integrationIdentifier: 'slack-prod',
type: Components\CreateSlackChannelEndpointDtoType::SlackChannel,
endpoint: new Components\SlackChannelEndpointDto(
channelId: 'C123456789',
),
)
);
if ($response->getChannelEndpointResponseDto !== null) {
// handle response
}import novu_py
from novu_py import Novu
with Novu(
secret_key="YOUR_SECRET_KEY_HERE",
) as novu:
res = novu.channel_endpoints.create(request_body={
"subscriber_id": "subscriber-123",
"integration_identifier": "slack-prod",
"type": novu_py.CreateSlackChannelEndpointDtoType.SLACK_CHANNEL,
"endpoint": {
"channel_id": "C123456789",
},
})
# Handle response
print(res)package main
import(
"context"
"github.com/novuhq/novu-go/v3"
"github.com/novuhq/novu-go/v3/models/components"
"github.com/novuhq/novu-go/v3/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := v3.New(
v3.WithSecurity("YOUR_SECRET_KEY_HERE"),
)
res, err := s.ChannelEndpoints.Create(ctx, operations.CreateChannelEndpointsControllerCreateChannelEndpointRequestBodySlackChannel(
components.CreateSlackChannelEndpointDto{
SubscriberID: "subscriber-123",
IntegrationIdentifier: "slack-prod",
Type: components.CreateSlackChannelEndpointDtoTypeSlackChannel,
Endpoint: components.SlackChannelEndpointDto{
ChannelID: "C123456789",
},
},
), 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
}
}
}curl --request POST \
--url https://api.novu.co/v1/channel-endpoints \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"subscriberId": "subscriber-123",
"integrationIdentifier": "slack-prod",
"type": "slack_channel",
"endpoint": {
"channelId": "C123456789"
},
"identifier": "slack-channel-user123-abc4",
"context": {},
"connectionIdentifier": "slack-connection-abc123"
}
'const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
subscriberId: 'subscriber-123',
integrationIdentifier: 'slack-prod',
type: 'slack_channel',
endpoint: {channelId: 'C123456789'},
identifier: 'slack-channel-user123-abc4',
context: {},
connectionIdentifier: 'slack-connection-abc123'
})
};
fetch('https://api.novu.co/v1/channel-endpoints', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));HttpResponse<String> response = Unirest.post("https://api.novu.co/v1/channel-endpoints")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"subscriberId\": \"subscriber-123\",\n \"integrationIdentifier\": \"slack-prod\",\n \"type\": \"slack_channel\",\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n },\n \"identifier\": \"slack-channel-user123-abc4\",\n \"context\": {},\n \"connectionIdentifier\": \"slack-connection-abc123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.novu.co/v1/channel-endpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"subscriberId\": \"subscriber-123\",\n \"integrationIdentifier\": \"slack-prod\",\n \"type\": \"slack_channel\",\n \"endpoint\": {\n \"channelId\": \"C123456789\"\n },\n \"identifier\": \"slack-channel-user123-abc4\",\n \"context\": {},\n \"connectionIdentifier\": \"slack-connection-abc123\"\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."