List all channel endpoints
List all channel endpoints for a resource based on query filters.
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.List(ctx, operations.ChannelEndpointsControllerListChannelEndpointsRequest{
Limit: v3.Pointer[float64](10.0),
SubscriberID: v3.Pointer("subscriber-123"),
ContextKeys: []string{
"tenant:org-123",
"region:us-east-1",
},
ProviderID: components.ProvidersIDEnumSlack.ToPointer(),
IntegrationIdentifier: v3.Pointer("slack-prod"),
ConnectionIdentifier: v3.Pointer("slack-connection-abc123"),
})
if err != nil {
log.Fatal(err)
}
if res.ListChannelEndpointsResponseDto != nil {
// handle response
}
}import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: "YOUR_SECRET_KEY_HERE",
});
async function run() {
const result = await novu.channelEndpoints.list({
limit: 10,
subscriberId: "subscriber-123",
contextKeys: [
"tenant:org-123",
"region:us-east-1",
],
providerId: "slack",
integrationIdentifier: "slack-prod",
connectionIdentifier: "slack-connection-abc123",
});
console.log(result);
}
run();using Novu;
using Novu.Models.Components;
using Novu.Models.Requests;
using System.Collections.Generic;
var sdk = new NovuSDK(secretKey: "YOUR_SECRET_KEY_HERE");
ChannelEndpointsControllerListChannelEndpointsRequest req = new ChannelEndpointsControllerListChannelEndpointsRequest() {
Limit = 10D,
SubscriberId = "subscriber-123",
ContextKeys = new List<string>() {
"tenant:org-123",
"region:us-east-1",
},
ProviderId = ProvidersIdEnum.Slack,
IntegrationIdentifier = "slack-prod",
ConnectionIdentifier = "slack-connection-abc123",
};
var res = await sdk.ChannelEndpoints.ListAsync(req);
// handle responsedeclare(strict_types=1);
require 'vendor/autoload.php';
use novu;
use novu\Models\Components;
use novu\Models\Operations;
$sdk = novu\Novu::builder()
->setSecurity(
'YOUR_SECRET_KEY_HERE'
)
->build();
$request = new Operations\ChannelEndpointsControllerListChannelEndpointsRequest(
limit: 10,
subscriberId: 'subscriber-123',
contextKeys: [
'tenant:org-123',
'region:us-east-1',
],
providerId: Components\ProvidersIdEnum::Slack,
integrationIdentifier: 'slack-prod',
connectionIdentifier: 'slack-connection-abc123',
);
$response = $sdk->channelEndpoints->list(
request: $request
);
if ($response->listChannelEndpointsResponseDto !== 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.list(request={
"limit": 10,
"subscriber_id": "subscriber-123",
"context_keys": [
"tenant:org-123",
"region:us-east-1",
],
"provider_id": novu_py.ProvidersIDEnum.SLACK,
"integration_identifier": "slack-prod",
"connection_identifier": "slack-connection-abc123",
})
# Handle response
print(res)curl --request GET \
--url https://api.novu.co/v1/channel-endpoints \
--header 'Authorization: <api-key>'const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
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.get("https://api.novu.co/v1/channel-endpoints")
.header("Authorization", "<api-key>")
.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::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"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>"
}
],
"next": "<string>",
"previous": "<string>",
"totalCount": 123,
"totalCountCapped": true
}{
"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."subscriberId, integrationIdentifier, channel, providerId, and other query parameters supported by the API.
List tool_webhook endpoints
Fetch every Tool Webhook destination registered for a subscriber on a dynamic integration:
curl -L 'https://api.novu.co/v1/channel-endpoints?subscriberId=user-123&integrationIdentifier=tool-webhook' \
-H 'Authorization: ApiKey <NOVU_SECRET_KEY>'
type: "tool_webhook" includes the decrypted wire shape { url, headers?, method? }. A subscriber may have multiple rows for the same integration — one per registered destination URL.
See the Tool Webhook setup guide for creating and managing dynamic endpoints.Authorizations
API key authentication. Allowed headers-- "Authorization: ApiKey <novu_secret_key>".
Headers
A header for idempotency purposes
Query Parameters
Cursor for pagination indicating the starting point after which to fetch results.
Cursor for pagination indicating the ending point before which to fetch results.
Limit the number of items to return (max 100)
x <= 100Direction of sorting
ASC, DESC Field to order by
Include cursor item in response
The subscriber ID to filter results by
Filter by exact context keys, order insensitive (format: "type:id")
Channel type to filter results.
in_app, email, sms, chat, push, tool Filter by provider identifier (e.g., sendgrid, twilio, slack, etc.). Provider ID of the job
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 Integration identifier to filter results.
Connection identifier to filter results.
Response
OK
List of returned Channel Endpoints
Show child attributes
Show child attributes
The cursor for the next page of results, or null if there are no more pages.
The cursor for the previous page of results, or null if this is the first page.
The total count of items (up to 50,000)
Whether there are more than 50,000 results available
Was this page helpful?
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.List(ctx, operations.ChannelEndpointsControllerListChannelEndpointsRequest{
Limit: v3.Pointer[float64](10.0),
SubscriberID: v3.Pointer("subscriber-123"),
ContextKeys: []string{
"tenant:org-123",
"region:us-east-1",
},
ProviderID: components.ProvidersIDEnumSlack.ToPointer(),
IntegrationIdentifier: v3.Pointer("slack-prod"),
ConnectionIdentifier: v3.Pointer("slack-connection-abc123"),
})
if err != nil {
log.Fatal(err)
}
if res.ListChannelEndpointsResponseDto != nil {
// handle response
}
}import { Novu } from "@novu/api";
const novu = new Novu({
secretKey: "YOUR_SECRET_KEY_HERE",
});
async function run() {
const result = await novu.channelEndpoints.list({
limit: 10,
subscriberId: "subscriber-123",
contextKeys: [
"tenant:org-123",
"region:us-east-1",
],
providerId: "slack",
integrationIdentifier: "slack-prod",
connectionIdentifier: "slack-connection-abc123",
});
console.log(result);
}
run();using Novu;
using Novu.Models.Components;
using Novu.Models.Requests;
using System.Collections.Generic;
var sdk = new NovuSDK(secretKey: "YOUR_SECRET_KEY_HERE");
ChannelEndpointsControllerListChannelEndpointsRequest req = new ChannelEndpointsControllerListChannelEndpointsRequest() {
Limit = 10D,
SubscriberId = "subscriber-123",
ContextKeys = new List<string>() {
"tenant:org-123",
"region:us-east-1",
},
ProviderId = ProvidersIdEnum.Slack,
IntegrationIdentifier = "slack-prod",
ConnectionIdentifier = "slack-connection-abc123",
};
var res = await sdk.ChannelEndpoints.ListAsync(req);
// handle responsedeclare(strict_types=1);
require 'vendor/autoload.php';
use novu;
use novu\Models\Components;
use novu\Models\Operations;
$sdk = novu\Novu::builder()
->setSecurity(
'YOUR_SECRET_KEY_HERE'
)
->build();
$request = new Operations\ChannelEndpointsControllerListChannelEndpointsRequest(
limit: 10,
subscriberId: 'subscriber-123',
contextKeys: [
'tenant:org-123',
'region:us-east-1',
],
providerId: Components\ProvidersIdEnum::Slack,
integrationIdentifier: 'slack-prod',
connectionIdentifier: 'slack-connection-abc123',
);
$response = $sdk->channelEndpoints->list(
request: $request
);
if ($response->listChannelEndpointsResponseDto !== 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.list(request={
"limit": 10,
"subscriber_id": "subscriber-123",
"context_keys": [
"tenant:org-123",
"region:us-east-1",
],
"provider_id": novu_py.ProvidersIDEnum.SLACK,
"integration_identifier": "slack-prod",
"connection_identifier": "slack-connection-abc123",
})
# Handle response
print(res)curl --request GET \
--url https://api.novu.co/v1/channel-endpoints \
--header 'Authorization: <api-key>'const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
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.get("https://api.novu.co/v1/channel-endpoints")
.header("Authorization", "<api-key>")
.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::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"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>"
}
],
"next": "<string>",
"previous": "<string>",
"totalCount": 123,
"totalCountCapped": true
}{
"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."