Retrieve a channel endpoint
Retrieve a specific channel endpoint by its unique identifier.
package main
import(
"context"
"github.com/novuhq/novu-go/v3"
"log"
"github.com/novuhq/novu-go/v3/models/components"
)
func main() {
ctx := context.Background()
s := v3.New(
v3.WithSecurity("YOUR_SECRET_KEY_HERE"),
)
res, err := s.ChannelEndpoints.Retrieve(ctx, "<value>", 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.retrieve("<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.RetrieveAsync(identifier: "<value>");
// handle responsedeclare(strict_types=1);
require 'vendor/autoload.php';
use novu;
$sdk = novu\Novu::builder()
->setSecurity(
'YOUR_SECRET_KEY_HERE'
)
->build();
$response = $sdk->channelEndpoints->retrieve(
identifier: '<value>'
);
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.retrieve(identifier="<value>")
# Handle response
print(res)curl --request GET \
--url https://api.novu.co/v1/channel-endpoints/{identifier} \
--header 'Authorization: <api-key>'const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
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.get("https://api.novu.co/v1/channel-endpoints/{identifier}")
.header("Authorization", "<api-key>")
.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::Get.new(url)
request["Authorization"] = '<api-key>'
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."tool_webhook responses
For type: "tool_webhook", the response includes the wire shape { url, headers?, method? }. Internally, those fields are stored encrypted on the linked ChannelConnection.auth; the read path decrypts and re-hydrates them.
Mask sensitive header values in your UI. The Novu dashboard shows only the last four characters of encrypted fields.
See the Tool Webhook setup guide for how endpoint headers merge with integration defaults at delivery time.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
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"
"log"
"github.com/novuhq/novu-go/v3/models/components"
)
func main() {
ctx := context.Background()
s := v3.New(
v3.WithSecurity("YOUR_SECRET_KEY_HERE"),
)
res, err := s.ChannelEndpoints.Retrieve(ctx, "<value>", 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.retrieve("<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.RetrieveAsync(identifier: "<value>");
// handle responsedeclare(strict_types=1);
require 'vendor/autoload.php';
use novu;
$sdk = novu\Novu::builder()
->setSecurity(
'YOUR_SECRET_KEY_HERE'
)
->build();
$response = $sdk->channelEndpoints->retrieve(
identifier: '<value>'
);
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.retrieve(identifier="<value>")
# Handle response
print(res)curl --request GET \
--url https://api.novu.co/v1/channel-endpoints/{identifier} \
--header 'Authorization: <api-key>'const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
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.get("https://api.novu.co/v1/channel-endpoints/{identifier}")
.header("Authorization", "<api-key>")
.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::Get.new(url)
request["Authorization"] = '<api-key>'
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."