
Research
NPM targeted by malware campaign mimicking familiar library names
Socket uncovered npm malware campaign mimicking popular Node.js libraries and packages from other ecosystems; packages steal data and execute remote code.
@novu/node
Advanced tools
Explore the docs ยป
Report Bug
ยท
Request Feature
ยท
Join Our Discord
ยท
Roadmap
ยท
X
ยท
Notifications Directory.
Read our blog
Building a notification system is hard, at first it seems like just sending an email but in reality, it's just the beginning. In today's world users expect multi-channel communication experience over email, sms, push, chat, and more... An ever-growing list of providers is popping up each day, and notifications are spread around the code. Novu's goal is to simplify notifications and provide developers the tools to create meaningful communication between the system and its users.
npm install @novu/node
yarn add @novu/node
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.trigger('workflowIdentifier', {
to: {
subscriberId: '<USER_IDENTIFIER>',
email: 'test@email.com',
firstName: 'John',
lastName: 'Doe',
},
payload: {
organization: {
logo: 'https://evilcorp.com/logo.png',
},
},
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>', {
backendUrl: '<SELF_HOST_API_URL>',
});
Novu provides a single API to manage providers across multiple channels with a simple-to-use interface.
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const page = 0;
const limit = 20;
await novu.subscribers.list(page, limit);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.subscribers.identify('subscriberId', {
firstName: 'Pawan',
lastName: 'Jain',
email: 'pawan.jain@domain.com',
phone: '+1234567890',
avatar:
'https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x',
locale: 'en-US',
data: {
isDeveloper: true,
customKey: 'customValue',
},
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.subscribers.identify([
{
subscriberId: "1",
firstName: "Pawan",
lastName: "Jain",
email: "pawan.jain@domain.com",
phone: "+1234567890",
avatar: "https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x",
locale: "en-US",
data: {
isDeveloper : true,
customKey: "customValue"
};
},
{
subscriberId: "2",
firstName: "John",
lastName: "Doe",
email: "john.doe@domain.com",
phone: "+1234567891",
avatar: "https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x",
locale: "en-UK",
data: {
isDeveloper : false,
customKey1: "customValue1"
};
}
// more subscribers ...
])
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.subscribers.get('subscriberId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.subscribers.update("subscriberId",{
firstName: "Pawan",
lastName: "Jain",
email: "pawan.jain@domain.com",
phone: "+1234567890",
avatar: "https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x",
locale: "en-US",
data: {
isDeveloper : true,
customKey: "customValue",
customKey2: "customValue2"
};
})
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// update fcm token
await novu.subscribers.setCredentials('subscriberId', 'fcm', {
deviceTokens: ['token1', 'token2'],
});
// update slack webhookurl
await novu.subscribers.setCredentials('subscriberId', 'slack', {
webhookUrl: ['webhookUrl'],
});
// update slack weebhook for a subscriberId with selected integration
await novu.subscribers.setCredentials(
'subscriberId',
'slack',
{
webhookUrl: ['webhookUrl'],
},
'slack_identifier',
);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// delete fcm token
await novu.subscribers.deleteCredentials('subscriberId', 'fcm');
// delete slack webhookurl
await novu.subscribers.deleteCredentials('subscriberId', 'slack');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.subscribers.delete('subscriberId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// mark subscriber as offline
await novu.subscribers.updateOnlineStatus('subscriberId', false);
This method returns subscriber preference for all workflows with inactive channels by default. To get subscriber preference for all workflows without inactive (means only active) channels, pass false
as second argument.
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// return subscriber preference for all workflows without inactive channels
await novu.subscribers.getPreference('subscriberId', {
includeInactiveChannels: false,
});
// return subscriber preference for all workflows with inactive channels
await novu.subscribers.getPreference('subscriberId', {
includeInactiveChannels: true,
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.subscribers.getGlobalPreference('subscriberId');
import { Novu, PreferenceLevelEnum } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// Get global level preference
await novu.subscribers.getPreferenceByLevel(
'subscriberId',
PreferenceLevelEnum.GLOBAL,
);
// Get template level preference
await novu.subscribers.getPreferenceByLevel(
'subscriberId',
PreferenceLevelEnum.TEMPLATE,
);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// enable in-app channel
await novu.subscribers.updatePreference('subscriberId', 'workflowId', {
channel: {
type: 'in_app',
enabled: true,
},
});
// disable email channel
await novu.subscribers.updatePreference('subscriberId', 'workflowId', {
channel: {
type: 'email',
enabled: false,
},
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// enable in-app channel and disable email channel
await novu.subscribers.updateGlobalPreference('subscriberId', {
enabled: true,
preferences: [
{
type: 'in_app',
enabled: true,
},
{
type: 'email',
enabled: false,
},
],
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const params = {
page: 0,
limit: 20,
// copy this value from in-app editor
feedIdentifier: "feedId",
seen: true,
read: false,
payload: {
"customkey": "customValue"
};
}
await novu.subscribers.getNotificationsFeed("subscriberId", params);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// get seen count
await novu.subscribers.getUnseenCount('subscriberId', true);
// get unseen count
await novu.subscribers.getUnseenCount('subscriberId', false);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// mark unseen
await novu.subscribers.markMessageAs('subscriberId', 'messageId', {
seen: false,
});
// mark seen and unread
await novu.subscribers.markMessageAs('subscriberId', 'messageId', {
seen: true,
read: false,
});
import { Novu, MarkMessagesAsEnum } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// mark all messages as seen
await novu.subscribers.markAllMessagesAs(
'subscriberId',
MarkMessageAsEnum.SEEN,
'feedId',
);
// mark all messages as read
await novu.subscribers.markAllMessagesAs(
'subscriberId',
MarkMessageAsEnum.READ,
'feedId',
);
import { Novu, ButtonTypeEnum, MessageActionStatusEnum } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// mark a message's primary action button as pending
await novu.subscribers.markMessageActionSeen(
'subscriberId',
'messageId',
ButtonTypeEnum.PRIMARY,
{
status: MessageActionStatusEnum.PENDING,
},
);
// mark a message's secondary action button as done
await novu.subscribers.markMessageActionSeen(
'subscriberId',
'messageId',
ButtonTypeEnum.SECONDARY,
{
status: MessageActionStatusEnum.DONE,
},
);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// trigger to existing subscribers
await novu.events.trigger("workflowIdentifier", {
to: "subscriberId",
payload: {
customKey: "customValue",
customKey1: {
nestedkey1: "nestedValue1"
}
},
overrides: {
email: {
from: "support@novu.co",
// customData will work only for sendgrid
customData: {
"customKey": "customValue"
},
headers: {
'X-Novu-Custom-Header': 'Novu-Custom-Header-Value',
},
}
},
// actorId is subscriberId of actor
actor: "actorId",
tenant: "tenantIdentifier"
});
// create new subscriber inline with trigger
await novu.events.trigger("workflowIdentifier", {
to: {
subscriberId: "1",
firstName: "Pawan",
lastName: "Jain",
email: "pawan.jain@domain.com",
phone: "+1234567890",
avatar: "https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x",
locale: "en-US",
data: {
isDeveloper : true,
customKey: "customValue"
};
},
payload: {},
overrides:{} ,
actor: "actorId",
tenant: "tenantIdentifier"
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.events.trigger("workflowIdentifier", {
to: [ "subscriberId1" , "subscriberId2" ],
payload: {},
overrides:{} ,
actor: "actorId",
tenant: "tenantIdentifier"
});
// create new subscribers inline with trigger
await novu.events.trigger("workflowIdentifier", {
to: [
{
subscriberId: "1",
firstName: "Pawan",
lastName: "Jain",
email: "pawan.jain@domain.com",
phone: "+1234567890",
avatar: "https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x",
locale: "en-US",
data: {
isDeveloper : true,
customKey: "customValue"
};
},
{
subscriberId: "2",
firstName: "John",
lastName: "Doe",
email: "john.doe@domain.com",
phone: "+1234567891",
avatar: "https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x",
locale: "en-UK",
data: {
isDeveloper : false,
customKey1: "customValue1"
};
}
],
payload: {},
overrides:{} ,
actor: "actorId",
tenant: "tenantIdentifier"
});
import { Novu, TriggerRecipientsTypeEnum } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.events.trigger('workflowIdentifier', {
to: {
type: TriggerRecipientsTypeEnum.TOPIC,
topicKey: TopicKey,
},
});
There is a limit of 100 items in the array of bulkTrigger.
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.events.bulkTrigger([
{
name: 'workflowIdentifier_1',
to: 'subscriberId_1',
payload: {
customKey: 'customValue',
customKey1: {
nestedkey1: 'nestedValue1',
},
},
overrides: {
email: {
from: 'support@novu.co',
},
},
// actorId is subscriberId of actor
actor: 'actorId',
tenant: 'tenantIdentifier',
},
{
name: 'workflowIdentifier_2',
to: 'subscriberId_2',
payload: {
customKey: 'customValue',
customKey1: {
nestedkey1: 'nestedValue1',
},
},
overrides: {
email: {
from: 'support@novu.co',
},
},
// actorId is subscriberId of actor
actor: 'actorId',
tenant: 'tenantIdentifier',
},
]);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.events.broadcast('workflowIdentifier', {
payload: {
customKey: 'customValue',
customKey1: {
nestedkey1: 'nestedValue1',
},
},
overrides: {
email: {
from: 'support@novu.co',
},
},
tenant: 'tenantIdentifier',
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.events.cancel('transactionId');
import { Novu, ChannelTypeEnum } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const params = {
page: 0, // optional
limit: 20, // optional
subscriberId: 'subscriberId', //optional
channel: ChannelTypeEnum.EMAIL, //optional
transactionIds: ['txnId1', 'txnId2'], //optional
};
await novu.messages.list(params);
messageId
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.messages.deleteById('messageId');
transactionId
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.messages.deleteByTransactionId('transactionId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const payload = {
content: "<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>",
description: "Organization's first layout",
name: "First Layout",
identifier: "firstlayout",
variables: [
{
type: "String",
name: "body",
required: true,
defValue: ""
}
]
isDefault: "false"
}
await novu.layouts.create(payload);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const payloadToUpdate = {
content: "<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>",
description: "Organization's first layout",
name: "First Layout",
identifier: "firstlayout",
variables: [
{
type: "String",
name: "body",
required: true,
defValue: ""
}
]
isDefault: false
}
await novu.layouts.update("layoutId", payloadToUpdate);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.layouts.setDefault('layoutId');
layoutId
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.layouts.get('layoutId');
layoutId
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.layouts.delete('layoutId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const params = {
page: 0, // optional
pageSize: 20, // optional
sortBy: '_id',
orderBy: -1, //optional
};
await novu.layouts.list(params);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// create a new notification group
await novu.notificationGroups.create('Product Updates');
// update an existing notification group
await novu.notificationGroups.update('notificationGroupId', {
name: 'Changelog Updates',
});
// list all notification groups
await novu.notificationGroups.get();
// get one existing notification group
await novu.notificationGroups.getOne('notificationGroupId');
// delete an existing notification group
await novu.notificationGroups.delete('notificationGroupId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const payloadToCreate = {
key: 'first-topic',
name: 'First Topic',
};
// create new topic
await novu.topics.create(payloadToCreate);
// add subscribers
await novu.topics.addSubscribers('topicKey', {
subscribers: ['subscriberId1', 'subscriberId2'],
});
// check if subscriber is present in topic
await novu.topics.checkSubscriber('topicKey', 'subscriberId');
// remove subscribers from topic
await novu.topics.removeSubscribers('topicKey', {
subscribers: ['subscriberId1', 'subscriberId2'],
});
const topicsListParams = {
page: 0, //optional
pageSize: 20,
key: 'topicKey',
};
// list all topics
await novu.topics.list(topicsListParams);
// get a topic
await novu.topics.get('topicKey');
// delete a topic
await novu.topics.delete('topicKey');
// get a topic
await novu.topics.rename('topicKey', 'New Topic Name');
import { Novu, ChannelTypeEnum, ProvidersIdEnum } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const updatePayload = {
name: "SendGrid",
identifier: "sendgrid-identifier",
credentials: {
apiKey: "SUPER_SECRET_API_KEY",
from: "sales@novu.co",
senderName: "Novu Sales Team"
// ... other credentials as per provider
},
active: true,
check: false
}
const createPayload: {
...updatePayload,
channel: ChannelTypeEnum.EMAIL,
}
// create a new integration
await novu.integrations.create(ProvidersIdEnum.SendGrid, createPayload)
// update integration
await novu.integrations.update("integrationId", updatePayload)
// get all integrations
await novu.integrations.getAll()
// get only active integrations
await novu.integrations.getActive()
// get webhook provider status
await novu.integrations.getWebhookProviderStatus(ProvidersIdEnum.SendGrid)
// delete existing integration
await novu.integrations.delete("integrationId")
// get novu in-app status
await novu.integrations.getInAppStatus()
// set an integration as primary
await novu.integrations.setIntegrationAsPrimary("integrationId")
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// create new in-app feed
await novu.feeds.create('Product Updates');
/**
* get all in-app feeds
* feeds methods returns only feed information
* use subscriber.notificationsFeed() for in-app messages
*/
await novu.feeds.get();
// delete a feed
await novu.feeds.delete('feedId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const changesParams = {
page: 1, //optional
limit: 20, // optional
promoted: false, // required
};
// get all changes
await novu.changes.get(changesParams);
// get changes count
await novu.changes.getCount();
// apply only one change
await novu.changes.applyOne('changeId');
// apply many changes
await novu.changes.applyMany(['changeId1', 'changeId2']);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// get current environment
await novu.environments.getCurrent();
// create new environment
await novu.environments.create({
name: 'Stagging',
parentId: 'parentEnvironmentId',
});
// get all environmemts
await novu.environments.getAll();
// update one environment
await novu.environments.updateOne('environmentId', {
name: 'Stagging', // optional
parentId: 'parentEnvironmentId', // optional
identifier: 'environmentIdentifier', // optional
});
// get api keys of environment
await novu.environments.getApiKeys();
// regenrate api keys
await novu.environments.regenerateApiKeys();
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// create new tenat
await novu.tenants.create('tenantIdentifier', {
name: 'First Tenant',
// optional
data: {
country: 'US',
tokens: ['token1', 'token2'],
isDeveloperTenant: true,
numberOfMembers: 2,
isSales: undefined,
},
});
// update existing tenant
await novu.tenants.update('tenantIdentifier', {
identifier: 'tenantIdentifier1',
name: 'Second Tenant',
// optional
data: {
country: 'India',
tokens: ['token1', 'token2'],
isDeveloperTenant: true,
numberOfMembers: 2,
isSales: undefined,
},
});
// list all tenants
await novu.tenants.list({
page: 0, // optional
limit: 20, // optional
});
// delete a tenant
await novu.tenants.delete('tenantIdentifier');
// get one tenant
await novu.tenants.get('tenantIdentifier');
import {
Novu,
TemplateVariableTypeEnum,
FilterPartTypeEnum,
StepTypeEnum,
} from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// List all workflow groups
const { data: workflowGroupsData } = await novu.notificationGroups.get();
// Create a new workflow
await novu.notificationTemplates.create({
name: 'Onboarding Workflow',
// taking first workflow group id
notificationGroupId: workflowGroupsData.data[0]._id,
steps: [
// Adding one chat step
{
active: true,
shouldStopOnFail: false,
// UUID is optional.
uuid: '78ab8c72-46de-49e4-8464-257085960f9e',
name: 'Chat',
filters: [
{
value: 'AND',
children: [
{
field: '{{chatContent}}',
value: 'flag',
operator: 'NOT_IN',
// 'payload'
on: FilterPartTypeEnum.PAYLOAD,
},
],
},
],
template: {
// 'chat'
type: StepTypeEnum.CHAT,
active: true,
subject: '',
variables: [
{
name: 'chatContent',
// 'String'
type: TemplateVariableTypeEnum.STRING,
required: true,
},
],
content: '{{chatContent}}',
contentType: 'editor',
},
},
],
description: 'Onboarding workflow to trigger after user sign up',
active: true,
draft: false,
critical: false,
});
import {
Novu,
TemplateVariableTypeEnum,
FilterPartTypeEnum,
StepTypeEnum,
} from '@novu/node';
// update a workflow
await novu.notificationTemplates.update('workflowId', {
name: 'Send daily digest email update',
description: 'This workflow will send daily digest email to user at 9:00 AM',
/**
* all other fields from create workflow payload
*/
});
// get one workflow
await novu.notificationTemplates.getOne('workflowId');
// delete one workflow
await novu.notificationTemplates.delete('workflowId');
// update status of one workflow
await novu.notificationTemplates.updateStatus('workflowId', false);
// list all workflows
await novu.notificationTemplates.getAll({
page: 0, // optional
limit: 20, // optional
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.list();
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.create({ name: 'New Organization' });
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.rename({ name: 'Renamed Organization' });
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.getCurrent();
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.removeMember('memberId');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.updateMemberRole('memberId', {
role: 'admin';
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.getMembers();
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.organizations.updateBranding({
logo: 'https://s3.us-east-1.amazonaws.com/bucket/image.jpeg',
color: '#000000',
fontFamily: 'Lato',
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
// Validate the mx record setup for the inbound parse functionality
await novu.inboundParse.getMxStatus();
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
const executionDetailsParams = {
subscriberId: 'subscriberId_123',
notificationId: 'notificationid_abcd',
};
// get execution details
await novu.executionDetails.get(executionDetailsParams);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.create({
workflowId: 'workflow_id_123',
tenantId: 'tenant_id_abc',
active: false,
preferenceSettings: {
email: false,
sms: false,
in_app: false,
chat: true,
push: false,
},
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.list(3, 10);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.getOneById('overrideId_123');
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.getOneByTenantIdandWorkflowId(
'workflowId_123',
'tenantId_123',
);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.updateOneByTenantIdandWorkflowId(
'workflowId_123',
'tenantId_123',
{
active: false,
},
);
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.updateOneById('OVERRIDE_ID', {
active: false,
});
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_SECRET_KEY>');
await novu.workflowOverrides.delete('overrideId_123');
FAQs
Notification Management Framework
The npm package @novu/node receives a total of 21,056 weekly downloads. As such, @novu/node popularity was classified as popular.
We found that @novu/node demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.ย It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Socket uncovered npm malware campaign mimicking popular Node.js libraries and packages from other ecosystems; packages steal data and execute remote code.
Research
Socket's research uncovers three dangerous Go modules that contain obfuscated disk-wiping malware, threatening complete data loss.
Research
Socket uncovers malicious packages on PyPI using Gmail's SMTP protocol for command and control (C2) to exfiltrate data and execute commands.