{"owner":"novuhq","repo":"novu","hasSkills":true,"totalSkillsCount":11,"totalTokensCount":14366,"categories":["plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":["enterprise/packages/shared-services/README.md","packages/application-generic/README.md","packages/cli-next/README.MD","packages/cli/README.MD","packages/nest/README.md","packages/node/README.md","packages/notification-center-angular/README.md","packages/notification-center-angular/projects/notification-center-angular/README.md","packages/providers/README.md","packages/sdk/README.md","packages/stateless/README.md"],"skills":{"enterprise/packages/shared-services/README.md":"# Shared services\n\nGeneric service used inside of Novu's different services - can not be depended on application-generic.\n","packages/application-generic/README.md":"# Application generic\n\nGeneric backend code used inside of Novu's different services\n\n","packages/cli-next/README.MD":"<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","packages/cli/README.MD":"<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","packages/nest/README.md":"# NestJS Module Wrapper\n\nA NestJS module wrapper for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\nInitializing module with templates and providers:\n```javascript\n    import { NovuModule } from \"@novu/nest\";\n\n    @Module({\n      imports: [\n        NovuModule.forRoot({\n          providers: [\n            new SendgridEmailProvider({\n              apiKey: process.env.SENDGRID_API_KEY,\n              from: 'sender@mail.com',\n            }),\n          ],\n          templates: [\n            {\n              id: 'password-reset',\n              messages: [\n                {\n                  subject: 'Your password reset request',\n                  channel: ChannelTypeEnum.EMAIL,\n                  template: `\n                          Hi {{firstName}}!\n\n                          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n                          `,\n                },\n              ],\n            },\n          ],\n        }),\n      ],\n    })\n```\n\nUsing novu's singleton service in other services and modules:\n\n```javascript\nimport { Injectable, Inject } from '@nestjs/common';\nimport { NovuService } from '@novu/nest';\n\n@Injectable()\nexport class UserService {\n  constructor(private readonly novu: NovuService) {}\n\n  async triggerEvent() {\n    await this.novu.trigger('password-reset', {\n      $email: 'receiver@mail.com',\n      $user_id: 'id'\n    });\n  }\n}\n```\n","packages/node/README.md":"<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n<h1 align=\"center\">The open-source notification infrastructure for developers</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API.\n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://github.com/orgs/novuhq/projects/10\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n    ·\n    <a href=\"https://notifications.directory\">Notifications Directory</a>.\n    <a href=\"https://novu.co/blog\">Read our blog</a>\n  </p>\n\n## ⭐️ Why\n\nBuilding 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notifications over multiple channels\n- 🚀 Equipped with a templating engine for advanced layouts and designs\n- 🛡 Built-in protection for missing variables\n- 📦 Easy to set up and integrate\n- 🛡 Written in TypeScript with predictable static types.\n- 👨‍💻 Community driven\n\n## 📦 Install\n\n```bash\nnpm install @novu/node\n```\n\n```bash\nyarn add @novu/node\n```\n\n## 🔨 Usage\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME_FROM_ADMIN_PANEL>', {\n  to: {\n    subscriberId: '<USER_IDENTIFIER>',\n    email: 'test@email.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    organization: {\n      logo: 'https://evilcorp.com/logo.png',\n    },\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=node-sdk-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n\n## SDK Methods\n\n- [Subscribers](#subscribers)\n- [Events](#events)\n- [Workflows](#workflows)\n- [Notification Groups](#notification-groups)\n- [Topics](#topics)\n- [Feeds](#feeds)\n- [Tenants](#tenants)\n- [Messages](#messages)\n- [Changes](#changes)\n- [Environments](#environments)\n- [Layouts](#layouts)\n- [Integrations](#integrations)\n- [Organizations](#organizations)\n- [Inbound Parse](#inbound-parse)\n- [Execution Details](#execution-details)\n- [Workflow Overrides](#workflow-overrides)\n\n### Subscribers\n\n- #### List all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst page = 0;\nconst limit = 20;\n\nawait novu.subscribers.list(page, limit);\n```\n\n- #### Identify (create) a new subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify('subscriberId', {\n  firstName: 'Pawan',\n  lastName: 'Jain',\n  email: 'pawan.jain@domain.com',\n  phone: '+1234567890',\n  avatar:\n    'https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x',\n  locale: 'en-US',\n  data: {\n    isDeveloper: true,\n    customKey: 'customValue',\n  },\n});\n```\n\n- #### Bulk create subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify([\n  {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  {\n    subscriberId: \"2\",\n    firstName: \"John\",\n    lastName: \"Doe\",\n    email: \"john.doe@domain.com\",\n    phone: \"+1234567891\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-UK\",\n    data: {\n      isDeveloper : false,\n      customKey1: \"customValue1\"\n    };\n  }\n  // more subscribers ...\n])\n```\n\n- #### Get a single subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.get('subscriberId');\n```\n\n- #### Update a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.update(\"subscriberId\",{\n  firstName: \"Pawan\",\n  lastName: \"Jain\",\n  email: \"pawan.jain@domain.com\",\n  phone: \"+1234567890\",\n  avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n  locale: \"en-US\",\n  data: {\n    isDeveloper : true,\n    customKey: \"customValue\",\n    customKey2: \"customValue2\"\n  };\n})\n```\n\n- #### Update provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// update fcm token\nawait novu.subscribers.setCredentials('subscriberId', 'fcm', {\n  deviceTokens: ['token1', 'token2'],\n});\n\n// update slack webhookurl\nawait novu.subscribers.setCredentials('subscriberId', 'slack', {\n  webhookUrl: ['webhookUrl'],\n});\n\n// update slack weebhook for a subscriberId with selected integration\nawait novu.subscribers.setCredentials(\n  'subscriberId',\n  'slack',\n  {\n    webhookUrl: ['webhookUrl'],\n  },\n  'slack_identifier'\n);\n```\n\n- #### Delete provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// delete fcm token\nawait novu.subscribers.deleteCredentials('subscriberId', 'fcm');\n\n// delete slack webhookurl\nawait novu.subscribers.deleteCredentials('subscriberId', 'slack');\n```\n\n- #### Delete a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.delete('subscriberId');\n```\n\n- #### Update online status\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark subscriber as offline\nawait novu.subscribers.updateOnlineStatus('subscriberId', false);\n```\n\n- #### Get subscriber preference for all workflows\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getPreference('subscriberId');\n```\n\n- #### Get subscriber global preference\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getGlobalPreference('subscriberId');\n```\n\n- #### Get subscriber preference by level\n\n```ts\nimport { Novu, PreferenceLevelEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n// Get global level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.GLOBAL\n);\n\n// Get template level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.TEMPLATE\n);\n```\n\n- #### Update subscriber preference for a workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'in_app',\n    enabled: true,\n  },\n});\n\n// disable email channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'email',\n    enabled: false,\n  },\n});\n```\n\n- #### Update subscriber preference globally\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel and disable email channel\nawait novu.subscribers.updateGlobalPreference('subscriberId', {\n  enabled: true,\n  preferences: [\n    {\n      type: 'in_app',\n      enabled: true,\n    },\n    {\n      type: 'email',\n      enabled: false,\n    },\n  ],\n});\n```\n\n- #### Get in-app messages (notifications) feed for a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0,\n  limit: 20,\n  // copy this value from in-app editor\n  feedIdentifier: \"feedId\",\n  seen: true,\n  read: false,\n  payload: {\n    \"customkey\": \"customValue\"\n  };\n}\n\nawait novu.subscribers.getNotificationsFeed(\"subscriberId\", params);\n```\n\n- #### Get seen/unseen in-app messages (notifications) count\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get seen count\nawait novu.subscribers.getUnseenCount('subscriberId', true);\n\n// get unseen count\nawait novu.subscribers.getUnseenCount('subscriberId', false);\n```\n\n- #### Mark an in-app message (notification) as seen/unseen/read/unread\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark unseen\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: false,\n});\n\n// mark seen and unread\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: true,\n  read: false,\n});\n```\n\n- #### Mark all in-app messages (notifications) as seen/unseen/read/unread\n\n```ts\nimport { Novu, MarkMessagesAsEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark all messages as seen\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.SEEN,\n  'feedId'\n);\n\n// mark all messages as read\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.READ,\n  'feedId'\n);\n```\n\n- #### Mark in-app message (notification) action as seen\n\n```ts\nimport { Novu, ButtonTypeEnum, MessageActionStatusEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark a message's primary action button as pending\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.PRIMARY,\n  {\n    status: MessageActionStatusEnum.PENDING,\n  }\n);\n\n// mark a message's secondary action button as done\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.SECONDARY,\n  {\n    status: MessageActionStatusEnum.DONE,\n  }\n);\n```\n\n### Events\n\n- #### Trigger workflow to one subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// trigger to existing subscribers\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: \"subscriberId\",\n  payload: {\n    customKey: \"customValue\",\n    customKey1: {\n      nestedkey1: \"nestedValue1\"\n    }\n  },\n  overrides: {\n    email: {\n      from: \"support@novu.co\",\n      // customData will work only for sendgrid\n      customData: {\n        \"customKey\": \"customValue\"\n      },\n      headers: {\n        'X-Novu-Custom-Header': 'Novu-Custom-Header-Value',\n      },\n    }\n  },\n  // actorId is subscriberId of actor\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n// create new subscriber inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger workflow to multiple subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [ \"subscriberId1\" , \"subscriberId2\" ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n\n// create new subscribers inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [\n    {\n      subscriberId: \"1\",\n      firstName: \"Pawan\",\n      lastName: \"Jain\",\n      email: \"pawan.jain@domain.com\",\n      phone: \"+1234567890\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-US\",\n      data: {\n        isDeveloper : true,\n        customKey: \"customValue\"\n      };\n    },\n    {\n      subscriberId: \"2\",\n      firstName: \"John\",\n      lastName: \"Doe\",\n      email: \"john.doe@domain.com\",\n      phone: \"+1234567891\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-UK\",\n      data: {\n        isDeveloper : false,\n        customKey1: \"customValue1\"\n      };\n    }\n  ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger to a topic\n\n```ts\nimport { Novu, TriggerRecipientsTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger('workflowIdentifier', {\n  to: {\n    type: TriggerRecipientsTypeEnum.TOPIC,\n    topicKey: TopicKey,\n  },\n});\n```\n\n- #### Bulk trigger multiple workflows to multiple subscribers\n\nThere is a limit of 100 items in the array of bulkTrigger.\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.bulkTrigger([\n  {\n    name: 'workflowIdentifier_1',\n    to: 'subscriberId_1',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n  {\n    name: 'workflowIdentifier_2',\n    to: 'subscriberId_2',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n]);\n```\n\n- #### Broadcast to all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.broadcast('workflowIdentifier', {\n  payload: {\n    customKey: 'customValue',\n    customKey1: {\n      nestedkey1: 'nestedValue1',\n    },\n  },\n  overrides: {\n    email: {\n      from: 'support@novu.co',\n    },\n  },\n  tenant: 'tenantIdentifier',\n});\n```\n\n- #### Cancel the triggered workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.cancel('transactionId');\n```\n\n### Messages\n\n- #### List all messages\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  limit: 20, // optional\n  subscriberId: 'subscriberId', //optional\n  channel: ChannelTypeEnum.EMAIL, //optional\n  transactionIds: ['txnId1', 'txnId2'], //optional\n};\n\nawait novu.messages.list(params);\n```\n\n- #### Delete a message by `messageId`\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.messages.deleteById('messageId');\n```\n\n### Layouts\n\n- #### Create a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payload = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: \"false\"\n}\nawait novu.layouts.create(payload);\n```\n\n- #### Update a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToUpdate = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: false\n}\nawait novu.layouts.update(\"layoutId\", payloadToUpdate);\n```\n\n- #### Set a layout as the default layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.setDefault('layoutId');\n```\n\n- #### Get a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.get('layoutId');\n```\n\n- #### Delete a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.delete('layoutId');\n```\n\n- #### List all layouts\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  pageSize: 20, // optional\n  sortBy: '_id',\n  orderBy: -1, //optional\n};\n\nawait novu.layouts.list(params);\n```\n\n### Notification Groups\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create a new notification group\nawait novu.notificationGroups.create('Product Updates');\n\n// update an existing notification group\nawait novu.notificationGroups.update('notificationGroupId', {\n  name: 'Changelog Updates',\n});\n\n// list all notification groups\nawait novu.notificationGroups.get();\n\n// get one existing notification group\nawait novu.notificationGroups.getOne('notificationGroupId');\n\n// delete an existing notification group\nawait novu.notificationGroups.delete('notificationGroupId');\n```\n\n### Topics\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToCreate = {\n  key: 'first-topic',\n  name: 'First Topic',\n};\n\n// create new topic\nawait novu.topics.create(payloadToCreate);\n\n// add subscribers\nawait novu.topics.addSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\n// check if subscriber is present in topic\nawait novu.topics.checkSubscriber('topicKey', 'subscriberId');\n\n// remove subscribers from topic\nawait novu.topics.removeSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\nconst topicsListParams = {\n  page: 0, //optional\n  pageSize: 20,\n  key: 'topicKey',\n};\n\n// list all topics\nawait novu.topics.list(topicsListParams);\n\n// get a topic\nawait novu.topics.get('topicKey');\n\n// delete a topic\nawait novu.topics.delete('topicKey');\n\n// get a topic\nawait novu.topics.rename('topicKey', 'New Topic Name');\n```\n\n### Integrations\n\n```ts\nimport { Novu, ChannelTypeEnum, ProvidersIdEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst updatePayload = {\n  name: \"SendGrid\",\n  identifier: \"sendgrid-identifier\",\n  credentials: {\n    apiKey: \"SUPER_SECRET_API_KEY\",\n    from: \"sales@novu.co\",\n    senderName: \"Novu Sales Team\"\n    // ... other credentials as per provider\n  },\n  active: true,\n  check: false\n}\n\nconst createPayload: {\n  ...updatePayload,\n  channel: ChannelTypeEnum.EMAIL,\n}\n\n// create a new integration\nawait novu.integrations.create(ProvidersIdEnum.SendGrid, createPayload)\n\n// update integration\nawait novu.integrations.update(\"integrationId\", updatePayload)\n\n// get all integrations\nawait novu.integrations.getAll()\n\n// get only active integrations\nawait novu.integrations.getActive()\n\n// get webhook provider status\nawait novu.integrations.getWebhookProviderStatus(ProvidersIdEnum.SendGrid)\n\n// delete existing integration\nawait novu.integrations.delete(\"integrationId\")\n\n// get novu in-app status\nawait novu.integrations.getInAppStatus()\n\n// set an integration as primary\nawait novu.integrations.setIntegrationAsPrimary(\"integrationId\")\n```\n\n### Feeds\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new in-app feed\nawait novu.feeds.create('Product Updates');\n\n/**\n * get all in-app feeds\n * feeds methods returns only feed information\n * use subscriber.notificationsFeed() for in-app messages\n */\nawait novu.feeds.get();\n\n// delete a feed\nawait novu.feeds.delete('feedId');\n```\n\n### Changes\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst changesParams = {\n  page: 1, //optional\n  limit: 20, // optional\n  promoted: false, // required\n};\n\n// get all changes\nawait novu.changes.get(changesParams);\n\n// get changes count\nawait novu.changes.getCount();\n\n// apply only one change\nawait novu.changes.applyOne('changeId');\n\n// apply many changes\nawait novu.changes.applyMany(['changeId1', 'changeId2']);\n```\n\n### Environments\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get current environment\nawait novu.environments.getCurrent();\n\n// create new environment\nawait novu.environments.create({\n  name: 'Stagging',\n  parentId: 'parentEnvironmentId',\n});\n\n// get all environmemts\nawait novu.environments.getAll();\n\n// update one environment\nawait novu.environments.updateOne('environmentId', {\n  name: 'Stagging', // optional\n  parentId: 'parentEnvironmentId', // optional\n  identifier: 'environmentIdentifier', // optional\n});\n\n// get api keys of environment\nawait novu.environments.getApiKeys();\n\n// regenrate api keys\nawait novu.environments.regenerateApiKeys();\n```\n\n### Tenants\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new tenat\nawait novu.tenants.create('tenantIdentifier', {\n  name: 'First Tenant',\n  // optional\n  data: {\n    country: 'US',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// update existing tenant\nawait novu.tenants.update('tenantIdentifier', {\n  identifier: 'tenantIdentifier1',\n  name: 'Second Tenant',\n  // optional\n  data: {\n    country: 'India',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// list all tenants\nawait novu.tenants.list({\n  page: 0, // optional\n  limit: 20, // optional\n});\n\n// delete a tenant\nawait novu.tenants.delete('tenantIdentifier');\n\n// get one tenant\nawait novu.tenants.get('tenantIdentifier');\n```\n\n### Workflows\n\n- #### Create a new workflow\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// List all workflow groups\nconst { data: workflowGroupsData } = await novu.notificationGroups.get();\n\n// Create a new workflow\nawait novu.notificationTemplates.create({\n  name: 'Onboarding Workflow',\n  // taking first workflow group id\n  notificationGroupId: workflowGroupsData.data[0]._id,\n  steps: [\n    // Adding one chat step\n    {\n      active: true,\n      shouldStopOnFail: false,\n      // UUID is optional.\n      uuid: '78ab8c72-46de-49e4-8464-257085960f9e',\n      name: 'Chat',\n      filters: [\n        {\n          value: 'AND',\n          children: [\n            {\n              field: '{{chatContent}}',\n              value: 'flag',\n              operator: 'NOT_IN',\n              // 'payload'\n              on: FilterPartTypeEnum.PAYLOAD,\n            },\n          ],\n        },\n      ],\n      template: {\n        // 'chat'\n        type: StepTypeEnum.CHAT,\n        active: true,\n        subject: '',\n        variables: [\n          {\n            name: 'chatContent',\n            // 'String'\n            type: TemplateVariableTypeEnum.STRING,\n            required: true,\n          },\n        ],\n        content: '{{chatContent}}',\n        contentType: 'editor',\n      },\n    },\n  ],\n  description: 'Onboarding workflow to trigger after user sign up',\n  active: true,\n  draft: false,\n  critical: false,\n});\n```\n\n- #### Other Methods\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\n// update a workflow\n\nawait novu.notificationTemplates.update('workflowId', {\n  name: 'Send daily digest email update',\n  description: 'This workflow will send daily digest email to user at 9:00 AM',\n  /**\n   * all other fields from create workflow payload\n   */\n});\n\n// get one workflow\nawait novu.notificationTemplates.getOne('workflowId');\n\n// delete one workflow\nawait novu.notificationTemplates.delete('workflowId');\n\n// update status of one workflow\nawait novu.notificationTemplates.updateStatus('workflowId', false);\n\n// list all workflows\nawait novu.notificationTemplates.getAll({\n  page: 0, // optional\n  limit: 20, // optional\n});\n```\n\n### Organizations\n\n- #### List all organizations\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.list();\n```\n\n- #### Create new organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.create({ name: 'New Organization' });\n```\n\n- #### Rename organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.rename({ name: 'Renamed Organization' });\n```\n\n- #### Get current organization details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getCurrent();\n```\n\n- #### Remove member from organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.removeMember('memberId');\n```\n\n- #### Update organization member role\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateMemberRole('memberId', {\n  role: 'admin';\n});\n```\n\n- #### Get all members of organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getMembers();\n```\n\n- #### Update organization branding details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateBranding({\n  logo: 'https://s3.us-east-1.amazonaws.com/bucket/image.jpeg',\n  color: '#000000',\n  fontFamily: 'Lato',\n});\n```\n\n### Inbound Parse\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// Validate the mx record setup for the inbound parse functionality\nawait novu.inboundParse.getMxStatus();\n```\n\n### Execution Details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst executionDetailsParams = {\n  subscriberId: 'subscriberId_123',\n  notificationId: 'notificationid_abcd',\n};\n\n// get execution details\nawait novu.executionDetails.get(executionDetailsParams);\n```\n\n### Workflow Overrides\n\n- #### Create new workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.create({\n  workflowId: 'workflow_id_123',\n  tenantId: 'tenant_id_abc',\n  active: false,\n  preferenceSettings: {\n    email: false,\n    sms: false,\n    in_app: false,\n    chat: true,\n    push: false,\n  },\n});\n```\n\n- #### List all workflow overrides\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.list(3, 10);\n```\n\n- #### Get workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneById('overrideId_123');\n```\n\n- #### Get workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123'\n);\n```\n\n- #### Update workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123',\n  {\n    active: false,\n  }\n);\n```\n\n- #### Update workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneById('OVERRIDE_ID', {\n  active: false,\n});\n```\n\n- #### Delete workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.delete('overrideId_123');\n```\n","packages/notification-center-angular/README.md":"# NotificationCenterAngular\n\nThis is the Angular workspace root project for Novu Angular libraries and components. The libraries are located under `/projects/*`.\nNew libraries should also be added under `/projects/*` by using the `ng generate library <my-lib-name>` command.\n\n## Publishing\nTo publish the `@novu/notification-center-angular` package, simply run `npm run publish:npm`. The following steps will be executed:\n\n1. Build package into the `/dist/notification-center-angular` directory\n2. Publish the `/dist/notification-center-angular` to NPM under @novu/notification-center-angular`\n\n> ⚠️ Ensure that the `/projects/notification-center-angular/package.json` has the correct `@novu/*` version values before publishing\n\n## Build\n\nRun `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.\n\n## Running unit tests\n\nRun `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).\n\n## Running end-to-end tests\n\nRun `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.\n\n## Further help\n\nTo get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.\n","packages/notification-center-angular/projects/notification-center-angular/README.md":"<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n# @novu/notification-center-angular\n\n[![Version](https://img.shields.io/npm/v/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n[![Downloads](https://img.shields.io/npm/dm/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n\nThis library contains a wrapper for the Novu Notification Center web component, allowing you to quickly integrate product notifications into your Angular application.\n\n## 📖 Client Installation\n\nFor our client installation guide, visit our [Angular Client docs](https://docs.novu.co/notification-center/client/angular?utm_campaign=github-notificationcenter-angular-readme).\n\n## 🏃‍♂️ Quickstart\n\nFor a quickstart, visit our [Angular Quickstart docs](https://docs.novu.co/quickstarts/angular).\n\n## 💻 Need Help?\n\nWe are more than happy to help you. If you are getting any errors or facing problems while working on this project, join our [Discord server](https://discord.novu.co) and ask for help. We are open to discussing anything related to the project.\n","packages/providers/README.md":"# Novu Apns Provider\n\nA Apns push provider library for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\n```javascript\nimport { APNSPushProvider } from '@novu/apns';\n\nconst provider = new APNSPushProvider({\n    key: \"path/to/APNsAuthKey_XXXXXXXXXX.p8\",\n    keyId: \"key-id\",\n    teamId: \"developer-team-id\"\n});\n```\n","packages/sdk/README.md":"# Quickstart\n\n```typescript\nconst client = new Echo();\nclient.workflow('comment-on-post', { type: 'object', properties: { post: { type: 'string' } } }, async ({ step }) => {\n  const userResponse = step.custom(\n    'fetch-user',\n    { type: 'object', properties: { name: { type: 'string' } } },\n    async () => ({ email: 'joe@bloggs.com' })\n  );\n\n  step.email('send-email', async (payload) => {\n    return {\n      subject: 'You received a post',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n\n  step.email('send-follow-up', async (payload) => {\n    return {\n      subject: 'You received a follow-up',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n});\n\n// Get the workflows\nconst workflows = client.getRegisteredWorkflows();\n\n// Invoke a step\nconst result = client.invokeStep('comment-on-post', 'fetch-user', { post: 'Hello' }).then(console.log);\n```\n","packages/stateless/README.md":"## 📦 Install\n\n```bash\nnpm install @novu/stateless\n```\n\n```bash\nyarn add @novu/stateless\n```\n\n## 🔨 Usage\n\n```ts\nimport { NovuStateless, ChannelTypeEnum } from '@novu/stateless';\nimport { SendgridEmailProvider } from '@novu/sendgrid';\n\nconst novu = new NovuStateless();\n\nawait novu.registerProvider(\n  new SendgridEmailProvider({\n    apiKey: process.env.SENDGRID_API_KEY,\n    from: 'sender@mail.com',\n  })\n);\n\nconst passwordResetTemplate = await novu.registerTemplate({\n  id: 'password-reset',\n  messages: [\n    {\n      subject: 'Your password reset request',\n      channel: ChannelTypeEnum.EMAIL,\n      template: `\n          Hi {{firstName}}!\n          \n          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n          \n          {{#if organization}}\n            <img src=\"{{organization.logo}}\" />\n          {{/if}}\n      `,\n    },\n  ],\n});\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME>', {\n  $user_id: '<USER IDENTIFIER>',\n  $email: 'test@email.com',\n  firstName: 'John',\n  lastName: 'Doe',\n  organization: {\n    logo: 'https://evilcorp.com/logo.png',\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_source=github-stateless-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n"},"files":{"enterprise/packages/shared-services/README.md":"# Shared services\n\nGeneric service used inside of Novu's different services - can not be depended on application-generic.\n","packages/application-generic/README.md":"# Application generic\n\nGeneric backend code used inside of Novu's different services\n\n","packages/cli-next/README.MD":"<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","packages/cli/README.MD":"<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","packages/nest/README.md":"# NestJS Module Wrapper\n\nA NestJS module wrapper for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\nInitializing module with templates and providers:\n```javascript\n    import { NovuModule } from \"@novu/nest\";\n\n    @Module({\n      imports: [\n        NovuModule.forRoot({\n          providers: [\n            new SendgridEmailProvider({\n              apiKey: process.env.SENDGRID_API_KEY,\n              from: 'sender@mail.com',\n            }),\n          ],\n          templates: [\n            {\n              id: 'password-reset',\n              messages: [\n                {\n                  subject: 'Your password reset request',\n                  channel: ChannelTypeEnum.EMAIL,\n                  template: `\n                          Hi {{firstName}}!\n\n                          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n                          `,\n                },\n              ],\n            },\n          ],\n        }),\n      ],\n    })\n```\n\nUsing novu's singleton service in other services and modules:\n\n```javascript\nimport { Injectable, Inject } from '@nestjs/common';\nimport { NovuService } from '@novu/nest';\n\n@Injectable()\nexport class UserService {\n  constructor(private readonly novu: NovuService) {}\n\n  async triggerEvent() {\n    await this.novu.trigger('password-reset', {\n      $email: 'receiver@mail.com',\n      $user_id: 'id'\n    });\n  }\n}\n```\n","packages/node/README.md":"<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n<h1 align=\"center\">The open-source notification infrastructure for developers</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API.\n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://github.com/orgs/novuhq/projects/10\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n    ·\n    <a href=\"https://notifications.directory\">Notifications Directory</a>.\n    <a href=\"https://novu.co/blog\">Read our blog</a>\n  </p>\n\n## ⭐️ Why\n\nBuilding 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notifications over multiple channels\n- 🚀 Equipped with a templating engine for advanced layouts and designs\n- 🛡 Built-in protection for missing variables\n- 📦 Easy to set up and integrate\n- 🛡 Written in TypeScript with predictable static types.\n- 👨‍💻 Community driven\n\n## 📦 Install\n\n```bash\nnpm install @novu/node\n```\n\n```bash\nyarn add @novu/node\n```\n\n## 🔨 Usage\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME_FROM_ADMIN_PANEL>', {\n  to: {\n    subscriberId: '<USER_IDENTIFIER>',\n    email: 'test@email.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    organization: {\n      logo: 'https://evilcorp.com/logo.png',\n    },\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=node-sdk-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n\n## SDK Methods\n\n- [Subscribers](#subscribers)\n- [Events](#events)\n- [Workflows](#workflows)\n- [Notification Groups](#notification-groups)\n- [Topics](#topics)\n- [Feeds](#feeds)\n- [Tenants](#tenants)\n- [Messages](#messages)\n- [Changes](#changes)\n- [Environments](#environments)\n- [Layouts](#layouts)\n- [Integrations](#integrations)\n- [Organizations](#organizations)\n- [Inbound Parse](#inbound-parse)\n- [Execution Details](#execution-details)\n- [Workflow Overrides](#workflow-overrides)\n\n### Subscribers\n\n- #### List all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst page = 0;\nconst limit = 20;\n\nawait novu.subscribers.list(page, limit);\n```\n\n- #### Identify (create) a new subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify('subscriberId', {\n  firstName: 'Pawan',\n  lastName: 'Jain',\n  email: 'pawan.jain@domain.com',\n  phone: '+1234567890',\n  avatar:\n    'https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x',\n  locale: 'en-US',\n  data: {\n    isDeveloper: true,\n    customKey: 'customValue',\n  },\n});\n```\n\n- #### Bulk create subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify([\n  {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  {\n    subscriberId: \"2\",\n    firstName: \"John\",\n    lastName: \"Doe\",\n    email: \"john.doe@domain.com\",\n    phone: \"+1234567891\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-UK\",\n    data: {\n      isDeveloper : false,\n      customKey1: \"customValue1\"\n    };\n  }\n  // more subscribers ...\n])\n```\n\n- #### Get a single subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.get('subscriberId');\n```\n\n- #### Update a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.update(\"subscriberId\",{\n  firstName: \"Pawan\",\n  lastName: \"Jain\",\n  email: \"pawan.jain@domain.com\",\n  phone: \"+1234567890\",\n  avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n  locale: \"en-US\",\n  data: {\n    isDeveloper : true,\n    customKey: \"customValue\",\n    customKey2: \"customValue2\"\n  };\n})\n```\n\n- #### Update provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// update fcm token\nawait novu.subscribers.setCredentials('subscriberId', 'fcm', {\n  deviceTokens: ['token1', 'token2'],\n});\n\n// update slack webhookurl\nawait novu.subscribers.setCredentials('subscriberId', 'slack', {\n  webhookUrl: ['webhookUrl'],\n});\n\n// update slack weebhook for a subscriberId with selected integration\nawait novu.subscribers.setCredentials(\n  'subscriberId',\n  'slack',\n  {\n    webhookUrl: ['webhookUrl'],\n  },\n  'slack_identifier'\n);\n```\n\n- #### Delete provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// delete fcm token\nawait novu.subscribers.deleteCredentials('subscriberId', 'fcm');\n\n// delete slack webhookurl\nawait novu.subscribers.deleteCredentials('subscriberId', 'slack');\n```\n\n- #### Delete a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.delete('subscriberId');\n```\n\n- #### Update online status\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark subscriber as offline\nawait novu.subscribers.updateOnlineStatus('subscriberId', false);\n```\n\n- #### Get subscriber preference for all workflows\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getPreference('subscriberId');\n```\n\n- #### Get subscriber global preference\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getGlobalPreference('subscriberId');\n```\n\n- #### Get subscriber preference by level\n\n```ts\nimport { Novu, PreferenceLevelEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n// Get global level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.GLOBAL\n);\n\n// Get template level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.TEMPLATE\n);\n```\n\n- #### Update subscriber preference for a workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'in_app',\n    enabled: true,\n  },\n});\n\n// disable email channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'email',\n    enabled: false,\n  },\n});\n```\n\n- #### Update subscriber preference globally\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel and disable email channel\nawait novu.subscribers.updateGlobalPreference('subscriberId', {\n  enabled: true,\n  preferences: [\n    {\n      type: 'in_app',\n      enabled: true,\n    },\n    {\n      type: 'email',\n      enabled: false,\n    },\n  ],\n});\n```\n\n- #### Get in-app messages (notifications) feed for a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0,\n  limit: 20,\n  // copy this value from in-app editor\n  feedIdentifier: \"feedId\",\n  seen: true,\n  read: false,\n  payload: {\n    \"customkey\": \"customValue\"\n  };\n}\n\nawait novu.subscribers.getNotificationsFeed(\"subscriberId\", params);\n```\n\n- #### Get seen/unseen in-app messages (notifications) count\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get seen count\nawait novu.subscribers.getUnseenCount('subscriberId', true);\n\n// get unseen count\nawait novu.subscribers.getUnseenCount('subscriberId', false);\n```\n\n- #### Mark an in-app message (notification) as seen/unseen/read/unread\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark unseen\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: false,\n});\n\n// mark seen and unread\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: true,\n  read: false,\n});\n```\n\n- #### Mark all in-app messages (notifications) as seen/unseen/read/unread\n\n```ts\nimport { Novu, MarkMessagesAsEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark all messages as seen\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.SEEN,\n  'feedId'\n);\n\n// mark all messages as read\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.READ,\n  'feedId'\n);\n```\n\n- #### Mark in-app message (notification) action as seen\n\n```ts\nimport { Novu, ButtonTypeEnum, MessageActionStatusEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark a message's primary action button as pending\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.PRIMARY,\n  {\n    status: MessageActionStatusEnum.PENDING,\n  }\n);\n\n// mark a message's secondary action button as done\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.SECONDARY,\n  {\n    status: MessageActionStatusEnum.DONE,\n  }\n);\n```\n\n### Events\n\n- #### Trigger workflow to one subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// trigger to existing subscribers\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: \"subscriberId\",\n  payload: {\n    customKey: \"customValue\",\n    customKey1: {\n      nestedkey1: \"nestedValue1\"\n    }\n  },\n  overrides: {\n    email: {\n      from: \"support@novu.co\",\n      // customData will work only for sendgrid\n      customData: {\n        \"customKey\": \"customValue\"\n      },\n      headers: {\n        'X-Novu-Custom-Header': 'Novu-Custom-Header-Value',\n      },\n    }\n  },\n  // actorId is subscriberId of actor\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n// create new subscriber inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger workflow to multiple subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [ \"subscriberId1\" , \"subscriberId2\" ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n\n// create new subscribers inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [\n    {\n      subscriberId: \"1\",\n      firstName: \"Pawan\",\n      lastName: \"Jain\",\n      email: \"pawan.jain@domain.com\",\n      phone: \"+1234567890\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-US\",\n      data: {\n        isDeveloper : true,\n        customKey: \"customValue\"\n      };\n    },\n    {\n      subscriberId: \"2\",\n      firstName: \"John\",\n      lastName: \"Doe\",\n      email: \"john.doe@domain.com\",\n      phone: \"+1234567891\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-UK\",\n      data: {\n        isDeveloper : false,\n        customKey1: \"customValue1\"\n      };\n    }\n  ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger to a topic\n\n```ts\nimport { Novu, TriggerRecipientsTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger('workflowIdentifier', {\n  to: {\n    type: TriggerRecipientsTypeEnum.TOPIC,\n    topicKey: TopicKey,\n  },\n});\n```\n\n- #### Bulk trigger multiple workflows to multiple subscribers\n\nThere is a limit of 100 items in the array of bulkTrigger.\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.bulkTrigger([\n  {\n    name: 'workflowIdentifier_1',\n    to: 'subscriberId_1',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n  {\n    name: 'workflowIdentifier_2',\n    to: 'subscriberId_2',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n]);\n```\n\n- #### Broadcast to all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.broadcast('workflowIdentifier', {\n  payload: {\n    customKey: 'customValue',\n    customKey1: {\n      nestedkey1: 'nestedValue1',\n    },\n  },\n  overrides: {\n    email: {\n      from: 'support@novu.co',\n    },\n  },\n  tenant: 'tenantIdentifier',\n});\n```\n\n- #### Cancel the triggered workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.cancel('transactionId');\n```\n\n### Messages\n\n- #### List all messages\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  limit: 20, // optional\n  subscriberId: 'subscriberId', //optional\n  channel: ChannelTypeEnum.EMAIL, //optional\n  transactionIds: ['txnId1', 'txnId2'], //optional\n};\n\nawait novu.messages.list(params);\n```\n\n- #### Delete a message by `messageId`\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.messages.deleteById('messageId');\n```\n\n### Layouts\n\n- #### Create a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payload = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: \"false\"\n}\nawait novu.layouts.create(payload);\n```\n\n- #### Update a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToUpdate = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: false\n}\nawait novu.layouts.update(\"layoutId\", payloadToUpdate);\n```\n\n- #### Set a layout as the default layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.setDefault('layoutId');\n```\n\n- #### Get a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.get('layoutId');\n```\n\n- #### Delete a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.delete('layoutId');\n```\n\n- #### List all layouts\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  pageSize: 20, // optional\n  sortBy: '_id',\n  orderBy: -1, //optional\n};\n\nawait novu.layouts.list(params);\n```\n\n### Notification Groups\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create a new notification group\nawait novu.notificationGroups.create('Product Updates');\n\n// update an existing notification group\nawait novu.notificationGroups.update('notificationGroupId', {\n  name: 'Changelog Updates',\n});\n\n// list all notification groups\nawait novu.notificationGroups.get();\n\n// get one existing notification group\nawait novu.notificationGroups.getOne('notificationGroupId');\n\n// delete an existing notification group\nawait novu.notificationGroups.delete('notificationGroupId');\n```\n\n### Topics\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToCreate = {\n  key: 'first-topic',\n  name: 'First Topic',\n};\n\n// create new topic\nawait novu.topics.create(payloadToCreate);\n\n// add subscribers\nawait novu.topics.addSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\n// check if subscriber is present in topic\nawait novu.topics.checkSubscriber('topicKey', 'subscriberId');\n\n// remove subscribers from topic\nawait novu.topics.removeSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\nconst topicsListParams = {\n  page: 0, //optional\n  pageSize: 20,\n  key: 'topicKey',\n};\n\n// list all topics\nawait novu.topics.list(topicsListParams);\n\n// get a topic\nawait novu.topics.get('topicKey');\n\n// delete a topic\nawait novu.topics.delete('topicKey');\n\n// get a topic\nawait novu.topics.rename('topicKey', 'New Topic Name');\n```\n\n### Integrations\n\n```ts\nimport { Novu, ChannelTypeEnum, ProvidersIdEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst updatePayload = {\n  name: \"SendGrid\",\n  identifier: \"sendgrid-identifier\",\n  credentials: {\n    apiKey: \"SUPER_SECRET_API_KEY\",\n    from: \"sales@novu.co\",\n    senderName: \"Novu Sales Team\"\n    // ... other credentials as per provider\n  },\n  active: true,\n  check: false\n}\n\nconst createPayload: {\n  ...updatePayload,\n  channel: ChannelTypeEnum.EMAIL,\n}\n\n// create a new integration\nawait novu.integrations.create(ProvidersIdEnum.SendGrid, createPayload)\n\n// update integration\nawait novu.integrations.update(\"integrationId\", updatePayload)\n\n// get all integrations\nawait novu.integrations.getAll()\n\n// get only active integrations\nawait novu.integrations.getActive()\n\n// get webhook provider status\nawait novu.integrations.getWebhookProviderStatus(ProvidersIdEnum.SendGrid)\n\n// delete existing integration\nawait novu.integrations.delete(\"integrationId\")\n\n// get novu in-app status\nawait novu.integrations.getInAppStatus()\n\n// set an integration as primary\nawait novu.integrations.setIntegrationAsPrimary(\"integrationId\")\n```\n\n### Feeds\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new in-app feed\nawait novu.feeds.create('Product Updates');\n\n/**\n * get all in-app feeds\n * feeds methods returns only feed information\n * use subscriber.notificationsFeed() for in-app messages\n */\nawait novu.feeds.get();\n\n// delete a feed\nawait novu.feeds.delete('feedId');\n```\n\n### Changes\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst changesParams = {\n  page: 1, //optional\n  limit: 20, // optional\n  promoted: false, // required\n};\n\n// get all changes\nawait novu.changes.get(changesParams);\n\n// get changes count\nawait novu.changes.getCount();\n\n// apply only one change\nawait novu.changes.applyOne('changeId');\n\n// apply many changes\nawait novu.changes.applyMany(['changeId1', 'changeId2']);\n```\n\n### Environments\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get current environment\nawait novu.environments.getCurrent();\n\n// create new environment\nawait novu.environments.create({\n  name: 'Stagging',\n  parentId: 'parentEnvironmentId',\n});\n\n// get all environmemts\nawait novu.environments.getAll();\n\n// update one environment\nawait novu.environments.updateOne('environmentId', {\n  name: 'Stagging', // optional\n  parentId: 'parentEnvironmentId', // optional\n  identifier: 'environmentIdentifier', // optional\n});\n\n// get api keys of environment\nawait novu.environments.getApiKeys();\n\n// regenrate api keys\nawait novu.environments.regenerateApiKeys();\n```\n\n### Tenants\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new tenat\nawait novu.tenants.create('tenantIdentifier', {\n  name: 'First Tenant',\n  // optional\n  data: {\n    country: 'US',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// update existing tenant\nawait novu.tenants.update('tenantIdentifier', {\n  identifier: 'tenantIdentifier1',\n  name: 'Second Tenant',\n  // optional\n  data: {\n    country: 'India',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// list all tenants\nawait novu.tenants.list({\n  page: 0, // optional\n  limit: 20, // optional\n});\n\n// delete a tenant\nawait novu.tenants.delete('tenantIdentifier');\n\n// get one tenant\nawait novu.tenants.get('tenantIdentifier');\n```\n\n### Workflows\n\n- #### Create a new workflow\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// List all workflow groups\nconst { data: workflowGroupsData } = await novu.notificationGroups.get();\n\n// Create a new workflow\nawait novu.notificationTemplates.create({\n  name: 'Onboarding Workflow',\n  // taking first workflow group id\n  notificationGroupId: workflowGroupsData.data[0]._id,\n  steps: [\n    // Adding one chat step\n    {\n      active: true,\n      shouldStopOnFail: false,\n      // UUID is optional.\n      uuid: '78ab8c72-46de-49e4-8464-257085960f9e',\n      name: 'Chat',\n      filters: [\n        {\n          value: 'AND',\n          children: [\n            {\n              field: '{{chatContent}}',\n              value: 'flag',\n              operator: 'NOT_IN',\n              // 'payload'\n              on: FilterPartTypeEnum.PAYLOAD,\n            },\n          ],\n        },\n      ],\n      template: {\n        // 'chat'\n        type: StepTypeEnum.CHAT,\n        active: true,\n        subject: '',\n        variables: [\n          {\n            name: 'chatContent',\n            // 'String'\n            type: TemplateVariableTypeEnum.STRING,\n            required: true,\n          },\n        ],\n        content: '{{chatContent}}',\n        contentType: 'editor',\n      },\n    },\n  ],\n  description: 'Onboarding workflow to trigger after user sign up',\n  active: true,\n  draft: false,\n  critical: false,\n});\n```\n\n- #### Other Methods\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\n// update a workflow\n\nawait novu.notificationTemplates.update('workflowId', {\n  name: 'Send daily digest email update',\n  description: 'This workflow will send daily digest email to user at 9:00 AM',\n  /**\n   * all other fields from create workflow payload\n   */\n});\n\n// get one workflow\nawait novu.notificationTemplates.getOne('workflowId');\n\n// delete one workflow\nawait novu.notificationTemplates.delete('workflowId');\n\n// update status of one workflow\nawait novu.notificationTemplates.updateStatus('workflowId', false);\n\n// list all workflows\nawait novu.notificationTemplates.getAll({\n  page: 0, // optional\n  limit: 20, // optional\n});\n```\n\n### Organizations\n\n- #### List all organizations\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.list();\n```\n\n- #### Create new organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.create({ name: 'New Organization' });\n```\n\n- #### Rename organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.rename({ name: 'Renamed Organization' });\n```\n\n- #### Get current organization details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getCurrent();\n```\n\n- #### Remove member from organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.removeMember('memberId');\n```\n\n- #### Update organization member role\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateMemberRole('memberId', {\n  role: 'admin';\n});\n```\n\n- #### Get all members of organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getMembers();\n```\n\n- #### Update organization branding details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateBranding({\n  logo: 'https://s3.us-east-1.amazonaws.com/bucket/image.jpeg',\n  color: '#000000',\n  fontFamily: 'Lato',\n});\n```\n\n### Inbound Parse\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// Validate the mx record setup for the inbound parse functionality\nawait novu.inboundParse.getMxStatus();\n```\n\n### Execution Details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst executionDetailsParams = {\n  subscriberId: 'subscriberId_123',\n  notificationId: 'notificationid_abcd',\n};\n\n// get execution details\nawait novu.executionDetails.get(executionDetailsParams);\n```\n\n### Workflow Overrides\n\n- #### Create new workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.create({\n  workflowId: 'workflow_id_123',\n  tenantId: 'tenant_id_abc',\n  active: false,\n  preferenceSettings: {\n    email: false,\n    sms: false,\n    in_app: false,\n    chat: true,\n    push: false,\n  },\n});\n```\n\n- #### List all workflow overrides\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.list(3, 10);\n```\n\n- #### Get workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneById('overrideId_123');\n```\n\n- #### Get workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123'\n);\n```\n\n- #### Update workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123',\n  {\n    active: false,\n  }\n);\n```\n\n- #### Update workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneById('OVERRIDE_ID', {\n  active: false,\n});\n```\n\n- #### Delete workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.delete('overrideId_123');\n```\n","packages/notification-center-angular/README.md":"# NotificationCenterAngular\n\nThis is the Angular workspace root project for Novu Angular libraries and components. The libraries are located under `/projects/*`.\nNew libraries should also be added under `/projects/*` by using the `ng generate library <my-lib-name>` command.\n\n## Publishing\nTo publish the `@novu/notification-center-angular` package, simply run `npm run publish:npm`. The following steps will be executed:\n\n1. Build package into the `/dist/notification-center-angular` directory\n2. Publish the `/dist/notification-center-angular` to NPM under @novu/notification-center-angular`\n\n> ⚠️ Ensure that the `/projects/notification-center-angular/package.json` has the correct `@novu/*` version values before publishing\n\n## Build\n\nRun `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.\n\n## Running unit tests\n\nRun `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).\n\n## Running end-to-end tests\n\nRun `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.\n\n## Further help\n\nTo get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.\n","packages/notification-center-angular/projects/notification-center-angular/README.md":"<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n# @novu/notification-center-angular\n\n[![Version](https://img.shields.io/npm/v/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n[![Downloads](https://img.shields.io/npm/dm/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n\nThis library contains a wrapper for the Novu Notification Center web component, allowing you to quickly integrate product notifications into your Angular application.\n\n## 📖 Client Installation\n\nFor our client installation guide, visit our [Angular Client docs](https://docs.novu.co/notification-center/client/angular?utm_campaign=github-notificationcenter-angular-readme).\n\n## 🏃‍♂️ Quickstart\n\nFor a quickstart, visit our [Angular Quickstart docs](https://docs.novu.co/quickstarts/angular).\n\n## 💻 Need Help?\n\nWe are more than happy to help you. If you are getting any errors or facing problems while working on this project, join our [Discord server](https://discord.novu.co) and ask for help. We are open to discussing anything related to the project.\n","packages/providers/README.md":"# Novu Apns Provider\n\nA Apns push provider library for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\n```javascript\nimport { APNSPushProvider } from '@novu/apns';\n\nconst provider = new APNSPushProvider({\n    key: \"path/to/APNsAuthKey_XXXXXXXXXX.p8\",\n    keyId: \"key-id\",\n    teamId: \"developer-team-id\"\n});\n```\n","packages/sdk/README.md":"# Quickstart\n\n```typescript\nconst client = new Echo();\nclient.workflow('comment-on-post', { type: 'object', properties: { post: { type: 'string' } } }, async ({ step }) => {\n  const userResponse = step.custom(\n    'fetch-user',\n    { type: 'object', properties: { name: { type: 'string' } } },\n    async () => ({ email: 'joe@bloggs.com' })\n  );\n\n  step.email('send-email', async (payload) => {\n    return {\n      subject: 'You received a post',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n\n  step.email('send-follow-up', async (payload) => {\n    return {\n      subject: 'You received a follow-up',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n});\n\n// Get the workflows\nconst workflows = client.getRegisteredWorkflows();\n\n// Invoke a step\nconst result = client.invokeStep('comment-on-post', 'fetch-user', { post: 'Hello' }).then(console.log);\n```\n","packages/stateless/README.md":"## 📦 Install\n\n```bash\nnpm install @novu/stateless\n```\n\n```bash\nyarn add @novu/stateless\n```\n\n## 🔨 Usage\n\n```ts\nimport { NovuStateless, ChannelTypeEnum } from '@novu/stateless';\nimport { SendgridEmailProvider } from '@novu/sendgrid';\n\nconst novu = new NovuStateless();\n\nawait novu.registerProvider(\n  new SendgridEmailProvider({\n    apiKey: process.env.SENDGRID_API_KEY,\n    from: 'sender@mail.com',\n  })\n);\n\nconst passwordResetTemplate = await novu.registerTemplate({\n  id: 'password-reset',\n  messages: [\n    {\n      subject: 'Your password reset request',\n      channel: ChannelTypeEnum.EMAIL,\n      template: `\n          Hi {{firstName}}!\n          \n          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n          \n          {{#if organization}}\n            <img src=\"{{organization.logo}}\" />\n          {{/if}}\n      `,\n    },\n  ],\n});\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME>', {\n  $user_id: '<USER IDENTIFIER>',\n  $email: 'test@email.com',\n  firstName: 'John',\n  lastName: 'Doe',\n  organization: {\n    logo: 'https://evilcorp.com/logo.png',\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_source=github-stateless-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n"},"items":[{"name":"README.md","path":"enterprise/packages/shared-services/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/enterprise/packages/shared-services/README.md","title":"shared-services Documentation","category":"plugin-manifest","format":"markdown","content":"# Shared services\n\nGeneric service used inside of Novu's different services - can not be depended on application-generic.\n","isInternal":false,"tokens":23,"sizeBytes":122},{"name":"README.md","path":"packages/application-generic/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/application-generic/README.md","title":"application-generic Documentation","category":"plugin-manifest","format":"markdown","content":"# Application generic\n\nGeneric backend code used inside of Novu's different services\n\n","isInternal":false,"tokens":16,"sizeBytes":86},{"name":"README.MD","path":"packages/cli-next/README.MD","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/cli-next/README.MD","title":"cli-next Documentation","category":"plugin-manifest","format":"markdown","content":"<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","isInternal":false,"tokens":1758,"sizeBytes":5957},{"name":"README.MD","path":"packages/cli/README.MD","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/cli/README.MD","title":"cli Documentation","category":"plugin-manifest","format":"markdown","content":"<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","isInternal":false,"tokens":1774,"sizeBytes":6017},{"name":"README.md","path":"packages/nest/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/nest/README.md","title":"nest Documentation","category":"plugin-manifest","format":"markdown","content":"# NestJS Module Wrapper\n\nA NestJS module wrapper for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\nInitializing module with templates and providers:\n```javascript\n    import { NovuModule } from \"@novu/nest\";\n\n    @Module({\n      imports: [\n        NovuModule.forRoot({\n          providers: [\n            new SendgridEmailProvider({\n              apiKey: process.env.SENDGRID_API_KEY,\n              from: 'sender@mail.com',\n            }),\n          ],\n          templates: [\n            {\n              id: 'password-reset',\n              messages: [\n                {\n                  subject: 'Your password reset request',\n                  channel: ChannelTypeEnum.EMAIL,\n                  template: `\n                          Hi {{firstName}}!\n\n                          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n                          `,\n                },\n              ],\n            },\n          ],\n        }),\n      ],\n    })\n```\n\nUsing novu's singleton service in other services and modules:\n\n```javascript\nimport { Injectable, Inject } from '@nestjs/common';\nimport { NovuService } from '@novu/nest';\n\n@Injectable()\nexport class UserService {\n  constructor(private readonly novu: NovuService) {}\n\n  async triggerEvent() {\n    await this.novu.trigger('password-reset', {\n      $email: 'receiver@mail.com',\n      $user_id: 'id'\n    });\n  }\n}\n```\n","isInternal":false,"tokens":284,"sizeBytes":1392},{"name":"README.md","path":"packages/node/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/node/README.md","title":"node Documentation","category":"plugin-manifest","format":"markdown","content":"<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n<h1 align=\"center\">The open-source notification infrastructure for developers</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API.\n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://github.com/orgs/novuhq/projects/10\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n    ·\n    <a href=\"https://notifications.directory\">Notifications Directory</a>.\n    <a href=\"https://novu.co/blog\">Read our blog</a>\n  </p>\n\n## ⭐️ Why\n\nBuilding 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notifications over multiple channels\n- 🚀 Equipped with a templating engine for advanced layouts and designs\n- 🛡 Built-in protection for missing variables\n- 📦 Easy to set up and integrate\n- 🛡 Written in TypeScript with predictable static types.\n- 👨‍💻 Community driven\n\n## 📦 Install\n\n```bash\nnpm install @novu/node\n```\n\n```bash\nyarn add @novu/node\n```\n\n## 🔨 Usage\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME_FROM_ADMIN_PANEL>', {\n  to: {\n    subscriberId: '<USER_IDENTIFIER>',\n    email: 'test@email.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    organization: {\n      logo: 'https://evilcorp.com/logo.png',\n    },\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=node-sdk-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n\n## SDK Methods\n\n- [Subscribers](#subscribers)\n- [Events](#events)\n- [Workflows](#workflows)\n- [Notification Groups](#notification-groups)\n- [Topics](#topics)\n- [Feeds](#feeds)\n- [Tenants](#tenants)\n- [Messages](#messages)\n- [Changes](#changes)\n- [Environments](#environments)\n- [Layouts](#layouts)\n- [Integrations](#integrations)\n- [Organizations](#organizations)\n- [Inbound Parse](#inbound-parse)\n- [Execution Details](#execution-details)\n- [Workflow Overrides](#workflow-overrides)\n\n### Subscribers\n\n- #### List all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst page = 0;\nconst limit = 20;\n\nawait novu.subscribers.list(page, limit);\n```\n\n- #### Identify (create) a new subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify('subscriberId', {\n  firstName: 'Pawan',\n  lastName: 'Jain',\n  email: 'pawan.jain@domain.com',\n  phone: '+1234567890',\n  avatar:\n    'https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x',\n  locale: 'en-US',\n  data: {\n    isDeveloper: true,\n    customKey: 'customValue',\n  },\n});\n```\n\n- #### Bulk create subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify([\n  {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  {\n    subscriberId: \"2\",\n    firstName: \"John\",\n    lastName: \"Doe\",\n    email: \"john.doe@domain.com\",\n    phone: \"+1234567891\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-UK\",\n    data: {\n      isDeveloper : false,\n      customKey1: \"customValue1\"\n    };\n  }\n  // more subscribers ...\n])\n```\n\n- #### Get a single subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.get('subscriberId');\n```\n\n- #### Update a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.update(\"subscriberId\",{\n  firstName: \"Pawan\",\n  lastName: \"Jain\",\n  email: \"pawan.jain@domain.com\",\n  phone: \"+1234567890\",\n  avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n  locale: \"en-US\",\n  data: {\n    isDeveloper : true,\n    customKey: \"customValue\",\n    customKey2: \"customValue2\"\n  };\n})\n```\n\n- #### Update provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// update fcm token\nawait novu.subscribers.setCredentials('subscriberId', 'fcm', {\n  deviceTokens: ['token1', 'token2'],\n});\n\n// update slack webhookurl\nawait novu.subscribers.setCredentials('subscriberId', 'slack', {\n  webhookUrl: ['webhookUrl'],\n});\n\n// update slack weebhook for a subscriberId with selected integration\nawait novu.subscribers.setCredentials(\n  'subscriberId',\n  'slack',\n  {\n    webhookUrl: ['webhookUrl'],\n  },\n  'slack_identifier'\n);\n```\n\n- #### Delete provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// delete fcm token\nawait novu.subscribers.deleteCredentials('subscriberId', 'fcm');\n\n// delete slack webhookurl\nawait novu.subscribers.deleteCredentials('subscriberId', 'slack');\n```\n\n- #### Delete a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.delete('subscriberId');\n```\n\n- #### Update online status\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark subscriber as offline\nawait novu.subscribers.updateOnlineStatus('subscriberId', false);\n```\n\n- #### Get subscriber preference for all workflows\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getPreference('subscriberId');\n```\n\n- #### Get subscriber global preference\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getGlobalPreference('subscriberId');\n```\n\n- #### Get subscriber preference by level\n\n```ts\nimport { Novu, PreferenceLevelEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n// Get global level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.GLOBAL\n);\n\n// Get template level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.TEMPLATE\n);\n```\n\n- #### Update subscriber preference for a workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'in_app',\n    enabled: true,\n  },\n});\n\n// disable email channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'email',\n    enabled: false,\n  },\n});\n```\n\n- #### Update subscriber preference globally\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel and disable email channel\nawait novu.subscribers.updateGlobalPreference('subscriberId', {\n  enabled: true,\n  preferences: [\n    {\n      type: 'in_app',\n      enabled: true,\n    },\n    {\n      type: 'email',\n      enabled: false,\n    },\n  ],\n});\n```\n\n- #### Get in-app messages (notifications) feed for a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0,\n  limit: 20,\n  // copy this value from in-app editor\n  feedIdentifier: \"feedId\",\n  seen: true,\n  read: false,\n  payload: {\n    \"customkey\": \"customValue\"\n  };\n}\n\nawait novu.subscribers.getNotificationsFeed(\"subscriberId\", params);\n```\n\n- #### Get seen/unseen in-app messages (notifications) count\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get seen count\nawait novu.subscribers.getUnseenCount('subscriberId', true);\n\n// get unseen count\nawait novu.subscribers.getUnseenCount('subscriberId', false);\n```\n\n- #### Mark an in-app message (notification) as seen/unseen/read/unread\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark unseen\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: false,\n});\n\n// mark seen and unread\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: true,\n  read: false,\n});\n```\n\n- #### Mark all in-app messages (notifications) as seen/unseen/read/unread\n\n```ts\nimport { Novu, MarkMessagesAsEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark all messages as seen\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.SEEN,\n  'feedId'\n);\n\n// mark all messages as read\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.READ,\n  'feedId'\n);\n```\n\n- #### Mark in-app message (notification) action as seen\n\n```ts\nimport { Novu, ButtonTypeEnum, MessageActionStatusEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark a message's primary action button as pending\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.PRIMARY,\n  {\n    status: MessageActionStatusEnum.PENDING,\n  }\n);\n\n// mark a message's secondary action button as done\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.SECONDARY,\n  {\n    status: MessageActionStatusEnum.DONE,\n  }\n);\n```\n\n### Events\n\n- #### Trigger workflow to one subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// trigger to existing subscribers\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: \"subscriberId\",\n  payload: {\n    customKey: \"customValue\",\n    customKey1: {\n      nestedkey1: \"nestedValue1\"\n    }\n  },\n  overrides: {\n    email: {\n      from: \"support@novu.co\",\n      // customData will work only for sendgrid\n      customData: {\n        \"customKey\": \"customValue\"\n      },\n      headers: {\n        'X-Novu-Custom-Header': 'Novu-Custom-Header-Value',\n      },\n    }\n  },\n  // actorId is subscriberId of actor\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n// create new subscriber inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger workflow to multiple subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [ \"subscriberId1\" , \"subscriberId2\" ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n\n// create new subscribers inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [\n    {\n      subscriberId: \"1\",\n      firstName: \"Pawan\",\n      lastName: \"Jain\",\n      email: \"pawan.jain@domain.com\",\n      phone: \"+1234567890\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-US\",\n      data: {\n        isDeveloper : true,\n        customKey: \"customValue\"\n      };\n    },\n    {\n      subscriberId: \"2\",\n      firstName: \"John\",\n      lastName: \"Doe\",\n      email: \"john.doe@domain.com\",\n      phone: \"+1234567891\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-UK\",\n      data: {\n        isDeveloper : false,\n        customKey1: \"customValue1\"\n      };\n    }\n  ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger to a topic\n\n```ts\nimport { Novu, TriggerRecipientsTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger('workflowIdentifier', {\n  to: {\n    type: TriggerRecipientsTypeEnum.TOPIC,\n    topicKey: TopicKey,\n  },\n});\n```\n\n- #### Bulk trigger multiple workflows to multiple subscribers\n\nThere is a limit of 100 items in the array of bulkTrigger.\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.bulkTrigger([\n  {\n    name: 'workflowIdentifier_1',\n    to: 'subscriberId_1',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n  {\n    name: 'workflowIdentifier_2',\n    to: 'subscriberId_2',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n]);\n```\n\n- #### Broadcast to all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.broadcast('workflowIdentifier', {\n  payload: {\n    customKey: 'customValue',\n    customKey1: {\n      nestedkey1: 'nestedValue1',\n    },\n  },\n  overrides: {\n    email: {\n      from: 'support@novu.co',\n    },\n  },\n  tenant: 'tenantIdentifier',\n});\n```\n\n- #### Cancel the triggered workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.cancel('transactionId');\n```\n\n### Messages\n\n- #### List all messages\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  limit: 20, // optional\n  subscriberId: 'subscriberId', //optional\n  channel: ChannelTypeEnum.EMAIL, //optional\n  transactionIds: ['txnId1', 'txnId2'], //optional\n};\n\nawait novu.messages.list(params);\n```\n\n- #### Delete a message by `messageId`\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.messages.deleteById('messageId');\n```\n\n### Layouts\n\n- #### Create a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payload = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: \"false\"\n}\nawait novu.layouts.create(payload);\n```\n\n- #### Update a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToUpdate = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: false\n}\nawait novu.layouts.update(\"layoutId\", payloadToUpdate);\n```\n\n- #### Set a layout as the default layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.setDefault('layoutId');\n```\n\n- #### Get a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.get('layoutId');\n```\n\n- #### Delete a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.delete('layoutId');\n```\n\n- #### List all layouts\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  pageSize: 20, // optional\n  sortBy: '_id',\n  orderBy: -1, //optional\n};\n\nawait novu.layouts.list(params);\n```\n\n### Notification Groups\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create a new notification group\nawait novu.notificationGroups.create('Product Updates');\n\n// update an existing notification group\nawait novu.notificationGroups.update('notificationGroupId', {\n  name: 'Changelog Updates',\n});\n\n// list all notification groups\nawait novu.notificationGroups.get();\n\n// get one existing notification group\nawait novu.notificationGroups.getOne('notificationGroupId');\n\n// delete an existing notification group\nawait novu.notificationGroups.delete('notificationGroupId');\n```\n\n### Topics\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToCreate = {\n  key: 'first-topic',\n  name: 'First Topic',\n};\n\n// create new topic\nawait novu.topics.create(payloadToCreate);\n\n// add subscribers\nawait novu.topics.addSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\n// check if subscriber is present in topic\nawait novu.topics.checkSubscriber('topicKey', 'subscriberId');\n\n// remove subscribers from topic\nawait novu.topics.removeSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\nconst topicsListParams = {\n  page: 0, //optional\n  pageSize: 20,\n  key: 'topicKey',\n};\n\n// list all topics\nawait novu.topics.list(topicsListParams);\n\n// get a topic\nawait novu.topics.get('topicKey');\n\n// delete a topic\nawait novu.topics.delete('topicKey');\n\n// get a topic\nawait novu.topics.rename('topicKey', 'New Topic Name');\n```\n\n### Integrations\n\n```ts\nimport { Novu, ChannelTypeEnum, ProvidersIdEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst updatePayload = {\n  name: \"SendGrid\",\n  identifier: \"sendgrid-identifier\",\n  credentials: {\n    apiKey: \"SUPER_SECRET_API_KEY\",\n    from: \"sales@novu.co\",\n    senderName: \"Novu Sales Team\"\n    // ... other credentials as per provider\n  },\n  active: true,\n  check: false\n}\n\nconst createPayload: {\n  ...updatePayload,\n  channel: ChannelTypeEnum.EMAIL,\n}\n\n// create a new integration\nawait novu.integrations.create(ProvidersIdEnum.SendGrid, createPayload)\n\n// update integration\nawait novu.integrations.update(\"integrationId\", updatePayload)\n\n// get all integrations\nawait novu.integrations.getAll()\n\n// get only active integrations\nawait novu.integrations.getActive()\n\n// get webhook provider status\nawait novu.integrations.getWebhookProviderStatus(ProvidersIdEnum.SendGrid)\n\n// delete existing integration\nawait novu.integrations.delete(\"integrationId\")\n\n// get novu in-app status\nawait novu.integrations.getInAppStatus()\n\n// set an integration as primary\nawait novu.integrations.setIntegrationAsPrimary(\"integrationId\")\n```\n\n### Feeds\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new in-app feed\nawait novu.feeds.create('Product Updates');\n\n/**\n * get all in-app feeds\n * feeds methods returns only feed information\n * use subscriber.notificationsFeed() for in-app messages\n */\nawait novu.feeds.get();\n\n// delete a feed\nawait novu.feeds.delete('feedId');\n```\n\n### Changes\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst changesParams = {\n  page: 1, //optional\n  limit: 20, // optional\n  promoted: false, // required\n};\n\n// get all changes\nawait novu.changes.get(changesParams);\n\n// get changes count\nawait novu.changes.getCount();\n\n// apply only one change\nawait novu.changes.applyOne('changeId');\n\n// apply many changes\nawait novu.changes.applyMany(['changeId1', 'changeId2']);\n```\n\n### Environments\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get current environment\nawait novu.environments.getCurrent();\n\n// create new environment\nawait novu.environments.create({\n  name: 'Stagging',\n  parentId: 'parentEnvironmentId',\n});\n\n// get all environmemts\nawait novu.environments.getAll();\n\n// update one environment\nawait novu.environments.updateOne('environmentId', {\n  name: 'Stagging', // optional\n  parentId: 'parentEnvironmentId', // optional\n  identifier: 'environmentIdentifier', // optional\n});\n\n// get api keys of environment\nawait novu.environments.getApiKeys();\n\n// regenrate api keys\nawait novu.environments.regenerateApiKeys();\n```\n\n### Tenants\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new tenat\nawait novu.tenants.create('tenantIdentifier', {\n  name: 'First Tenant',\n  // optional\n  data: {\n    country: 'US',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// update existing tenant\nawait novu.tenants.update('tenantIdentifier', {\n  identifier: 'tenantIdentifier1',\n  name: 'Second Tenant',\n  // optional\n  data: {\n    country: 'India',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// list all tenants\nawait novu.tenants.list({\n  page: 0, // optional\n  limit: 20, // optional\n});\n\n// delete a tenant\nawait novu.tenants.delete('tenantIdentifier');\n\n// get one tenant\nawait novu.tenants.get('tenantIdentifier');\n```\n\n### Workflows\n\n- #### Create a new workflow\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// List all workflow groups\nconst { data: workflowGroupsData } = await novu.notificationGroups.get();\n\n// Create a new workflow\nawait novu.notificationTemplates.create({\n  name: 'Onboarding Workflow',\n  // taking first workflow group id\n  notificationGroupId: workflowGroupsData.data[0]._id,\n  steps: [\n    // Adding one chat step\n    {\n      active: true,\n      shouldStopOnFail: false,\n      // UUID is optional.\n      uuid: '78ab8c72-46de-49e4-8464-257085960f9e',\n      name: 'Chat',\n      filters: [\n        {\n          value: 'AND',\n          children: [\n            {\n              field: '{{chatContent}}',\n              value: 'flag',\n              operator: 'NOT_IN',\n              // 'payload'\n              on: FilterPartTypeEnum.PAYLOAD,\n            },\n          ],\n        },\n      ],\n      template: {\n        // 'chat'\n        type: StepTypeEnum.CHAT,\n        active: true,\n        subject: '',\n        variables: [\n          {\n            name: 'chatContent',\n            // 'String'\n            type: TemplateVariableTypeEnum.STRING,\n            required: true,\n          },\n        ],\n        content: '{{chatContent}}',\n        contentType: 'editor',\n      },\n    },\n  ],\n  description: 'Onboarding workflow to trigger after user sign up',\n  active: true,\n  draft: false,\n  critical: false,\n});\n```\n\n- #### Other Methods\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\n// update a workflow\n\nawait novu.notificationTemplates.update('workflowId', {\n  name: 'Send daily digest email update',\n  description: 'This workflow will send daily digest email to user at 9:00 AM',\n  /**\n   * all other fields from create workflow payload\n   */\n});\n\n// get one workflow\nawait novu.notificationTemplates.getOne('workflowId');\n\n// delete one workflow\nawait novu.notificationTemplates.delete('workflowId');\n\n// update status of one workflow\nawait novu.notificationTemplates.updateStatus('workflowId', false);\n\n// list all workflows\nawait novu.notificationTemplates.getAll({\n  page: 0, // optional\n  limit: 20, // optional\n});\n```\n\n### Organizations\n\n- #### List all organizations\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.list();\n```\n\n- #### Create new organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.create({ name: 'New Organization' });\n```\n\n- #### Rename organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.rename({ name: 'Renamed Organization' });\n```\n\n- #### Get current organization details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getCurrent();\n```\n\n- #### Remove member from organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.removeMember('memberId');\n```\n\n- #### Update organization member role\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateMemberRole('memberId', {\n  role: 'admin';\n});\n```\n\n- #### Get all members of organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getMembers();\n```\n\n- #### Update organization branding details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateBranding({\n  logo: 'https://s3.us-east-1.amazonaws.com/bucket/image.jpeg',\n  color: '#000000',\n  fontFamily: 'Lato',\n});\n```\n\n### Inbound Parse\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// Validate the mx record setup for the inbound parse functionality\nawait novu.inboundParse.getMxStatus();\n```\n\n### Execution Details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst executionDetailsParams = {\n  subscriberId: 'subscriberId_123',\n  notificationId: 'notificationid_abcd',\n};\n\n// get execution details\nawait novu.executionDetails.get(executionDetailsParams);\n```\n\n### Workflow Overrides\n\n- #### Create new workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.create({\n  workflowId: 'workflow_id_123',\n  tenantId: 'tenant_id_abc',\n  active: false,\n  preferenceSettings: {\n    email: false,\n    sms: false,\n    in_app: false,\n    chat: true,\n    push: false,\n  },\n});\n```\n\n- #### List all workflow overrides\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.list(3, 10);\n```\n\n- #### Get workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneById('overrideId_123');\n```\n\n- #### Get workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123'\n);\n```\n\n- #### Update workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123',\n  {\n    active: false,\n  }\n);\n```\n\n- #### Update workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneById('OVERRIDE_ID', {\n  active: false,\n});\n```\n\n- #### Delete workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.delete('overrideId_123');\n```\n","isInternal":false,"tokens":8480,"sizeBytes":30551},{"name":"README.md","path":"packages/notification-center-angular/projects/notification-center-angular/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/notification-center-angular/projects/notification-center-angular/README.md","title":"notification-center-angular Documentation","category":"plugin-manifest","format":"markdown","content":"<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n# @novu/notification-center-angular\n\n[![Version](https://img.shields.io/npm/v/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n[![Downloads](https://img.shields.io/npm/dm/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n\nThis library contains a wrapper for the Novu Notification Center web component, allowing you to quickly integrate product notifications into your Angular application.\n\n## 📖 Client Installation\n\nFor our client installation guide, visit our [Angular Client docs](https://docs.novu.co/notification-center/client/angular?utm_campaign=github-notificationcenter-angular-readme).\n\n## 🏃‍♂️ Quickstart\n\nFor a quickstart, visit our [Angular Quickstart docs](https://docs.novu.co/quickstarts/angular).\n\n## 💻 Need Help?\n\nWe are more than happy to help you. If you are getting any errors or facing problems while working on this project, join our [Discord server](https://discord.novu.co) and ask for help. We are open to discussing anything related to the project.\n","isInternal":false,"tokens":390,"sizeBytes":1508},{"name":"README.md","path":"packages/notification-center-angular/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/notification-center-angular/README.md","title":"notification-center-angular Documentation","category":"plugin-manifest","format":"markdown","content":"# NotificationCenterAngular\n\nThis is the Angular workspace root project for Novu Angular libraries and components. The libraries are located under `/projects/*`.\nNew libraries should also be added under `/projects/*` by using the `ng generate library <my-lib-name>` command.\n\n## Publishing\nTo publish the `@novu/notification-center-angular` package, simply run `npm run publish:npm`. The following steps will be executed:\n\n1. Build package into the `/dist/notification-center-angular` directory\n2. Publish the `/dist/notification-center-angular` to NPM under @novu/notification-center-angular`\n\n> ⚠️ Ensure that the `/projects/notification-center-angular/package.json` has the correct `@novu/*` version values before publishing\n\n## Build\n\nRun `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.\n\n## Running unit tests\n\nRun `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).\n\n## Running end-to-end tests\n\nRun `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.\n\n## Further help\n\nTo get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.\n","isInternal":false,"tokens":291,"sizeBytes":1321},{"name":"README.md","path":"packages/providers/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/providers/README.md","title":"providers Documentation","category":"plugin-manifest","format":"markdown","content":"# Novu Apns Provider\n\nA Apns push provider library for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\n```javascript\nimport { APNSPushProvider } from '@novu/apns';\n\nconst provider = new APNSPushProvider({\n    key: \"path/to/APNsAuthKey_XXXXXXXXXX.p8\",\n    keyId: \"key-id\",\n    teamId: \"developer-team-id\"\n});\n```\n","isInternal":false,"tokens":96,"sizeBytes":320},{"name":"README.md","path":"packages/sdk/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/sdk/README.md","title":"sdk Documentation","category":"plugin-manifest","format":"markdown","content":"# Quickstart\n\n```typescript\nconst client = new Echo();\nclient.workflow('comment-on-post', { type: 'object', properties: { post: { type: 'string' } } }, async ({ step }) => {\n  const userResponse = step.custom(\n    'fetch-user',\n    { type: 'object', properties: { name: { type: 'string' } } },\n    async () => ({ email: 'joe@bloggs.com' })\n  );\n\n  step.email('send-email', async (payload) => {\n    return {\n      subject: 'You received a post',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n\n  step.email('send-follow-up', async (payload) => {\n    return {\n      subject: 'You received a follow-up',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n});\n\n// Get the workflows\nconst workflows = client.getRegisteredWorkflows();\n\n// Invoke a step\nconst result = client.invokeStep('comment-on-post', 'fetch-user', { post: 'Hello' }).then(console.log);\n```\n","isInternal":false,"tokens":252,"sizeBytes":957},{"name":"README.md","path":"packages/stateless/README.md","rawUrl":"https://raw.githubusercontent.com/novuhq/novu/HEAD/packages/stateless/README.md","title":"stateless Documentation","category":"plugin-manifest","format":"markdown","content":"## 📦 Install\n\n```bash\nnpm install @novu/stateless\n```\n\n```bash\nyarn add @novu/stateless\n```\n\n## 🔨 Usage\n\n```ts\nimport { NovuStateless, ChannelTypeEnum } from '@novu/stateless';\nimport { SendgridEmailProvider } from '@novu/sendgrid';\n\nconst novu = new NovuStateless();\n\nawait novu.registerProvider(\n  new SendgridEmailProvider({\n    apiKey: process.env.SENDGRID_API_KEY,\n    from: 'sender@mail.com',\n  })\n);\n\nconst passwordResetTemplate = await novu.registerTemplate({\n  id: 'password-reset',\n  messages: [\n    {\n      subject: 'Your password reset request',\n      channel: ChannelTypeEnum.EMAIL,\n      template: `\n          Hi {{firstName}}!\n          \n          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n          \n          {{#if organization}}\n            <img src=\"{{organization.logo}}\" />\n          {{/if}}\n      `,\n    },\n  ],\n});\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME>', {\n  $user_id: '<USER IDENTIFIER>',\n  $email: 'test@email.com',\n  firstName: 'John',\n  lastName: 'Doe',\n  organization: {\n    logo: 'https://evilcorp.com/logo.png',\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_source=github-stateless-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n","isInternal":false,"tokens":1002,"sizeBytes":3248}],"systemPromptSnippet":"<yakaai_skills repo=\"novuhq/novu\">\n<!-- File: enterprise/packages/shared-services/README.md (Tokens: ~23 | Category: plugin-manifest) -->\n# Shared services\n\nGeneric service used inside of Novu's different services - can not be depended on application-generic.\n\n<!-- File: packages/application-generic/README.md (Tokens: ~16 | Category: plugin-manifest) -->\n# Application generic\n\nGeneric backend code used inside of Novu's different services\n\n<!-- File: packages/cli-next/README.MD (Tokens: ~1758 | Category: plugin-manifest) -->\n<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n\n<!-- File: packages/cli/README.MD (Tokens: ~1774 | Category: plugin-manifest) -->\n<div align=\"center\">\n  \n  ![Logo Dark](https://user-images.githubusercontent.com/8872447/165779319-34962ccc-3149-466c-b1da-97fd93254520.png#gh-dark-mode-only)\n\n</div>\n\n<div align=\"center\">\n  \n  ![Logo Light](https://user-images.githubusercontent.com/8872447/165779274-22a190da-3284-487e-bd1e-14983df12cbb.png#gh-light-mode-only)\n  \n</div>\n\n<h1 align=\"center\">Notification management simplified.</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API. \n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://roadmap.novu.co/\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n  </p>\n  \n## ⭐️ Why\nBuilding 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 multichannel communication experience over email, sms, push, chat and more... An ever-growing list of providers are 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notification over multiple channels\n- 🚀 Equipped with a CMS for advanced layouts and design management\n- 🛡 Built-in protection for missing variables (Coming Soon)\n- 📦 Easy to set up and integrate\n- 🛡 Debug and analyze multichannel messages in a single dashboard\n- 📦 Embeddable notification center with real-time updates\n- 👨‍💻 Community driven\n\n## 🚀 Getting Started\n\nWe are excited to launch the complete Novu API and admin panel. Want to give it a test before the official release? here is how:\n\n```\nnpx novu init\n```\n\nAfter setting up your account using the cloud or docker version you can trigger the API using the `@novu/node` package.\n\n```bash\nnpm install @novu/node\n```\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<TRIGGER_NAME>', {\n  to: {\n    subscriberId: '<UNIQUE_IDENTIFIER>',\n    email: 'john@doemail.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    name: 'Hello World',\n    organization: {\n      logo: 'https://happycorp.com/logo.png',\n    }\n  },\n});\n```\n\n## Embeddable notification center\n\nUsing the Novu API and admin panel you can easily add real-time notification center to your web-app without the hassle of building it yourself. You can use our React component or an iframe embed if you are not using React.\n\n<div align=\"center\">\n<img width=\"762\" alt=\"notification-center-912bb96e009fb3a69bafec23bcde00b0\" src=\"https://github.com/iampearceman/Design-assets/blob/main/Untitled%20design%20(8).gif?raw=true\">\n  \n  Read more about how to add a notification center to your app with the Novu API [here](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n\n</div>\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [NodeMailer](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push \n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat \n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=inapp-cli-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 💻 Need Help?\n\nWe are more than happy to help you. Don't worry if you are getting some errors or problems while working with the project. Or just want to discuss something related to the project.\n\nJust <a href=\"https://discord.novu.co\">Join Our Discord</a> server and ask for help.\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n\n<!-- File: packages/nest/README.md (Tokens: ~284 | Category: plugin-manifest) -->\n# NestJS Module Wrapper\n\nA NestJS module wrapper for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\nInitializing module with templates and providers:\n```javascript\n    import { NovuModule } from \"@novu/nest\";\n\n    @Module({\n      imports: [\n        NovuModule.forRoot({\n          providers: [\n            new SendgridEmailProvider({\n              apiKey: process.env.SENDGRID_API_KEY,\n              from: 'sender@mail.com',\n            }),\n          ],\n          templates: [\n            {\n              id: 'password-reset',\n              messages: [\n                {\n                  subject: 'Your password reset request',\n                  channel: ChannelTypeEnum.EMAIL,\n                  template: `\n                          Hi {{firstName}}!\n\n                          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n                          `,\n                },\n              ],\n            },\n          ],\n        }),\n      ],\n    })\n```\n\nUsing novu's singleton service in other services and modules:\n\n```javascript\nimport { Injectable, Inject } from '@nestjs/common';\nimport { NovuService } from '@novu/nest';\n\n@Injectable()\nexport class UserService {\n  constructor(private readonly novu: NovuService) {}\n\n  async triggerEvent() {\n    await this.novu.trigger('password-reset', {\n      $email: 'receiver@mail.com',\n      $user_id: 'id'\n    });\n  }\n}\n```\n\n<!-- File: packages/node/README.md (Tokens: ~8480 | Category: plugin-manifest) -->\n<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n<h1 align=\"center\">The open-source notification infrastructure for developers</h1>\n\n<div align=\"center\">\nThe ultimate service for managing multi-channel notifications with a single API.\n</div>\n\n  <p align=\"center\">\n    <br />\n    <a href=\"https://docs.novu.co\" rel=\"dofollow\"><strong>Explore the docs »</strong></a>\n    <br />\n\n  <br/>\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yml&title=%F0%9F%90%9B+Bug+Report%3A+\">Report Bug</a>\n    ·\n    <a href=\"https://github.com/novuhq/novu/issues/new?assignees=&labels=feature&template=feature_request.yml&title=%F0%9F%9A%80+Feature%3A+\">Request Feature</a>\n    ·\n  <a href=\"https://discord.novu.co\">Join Our Discord</a>\n    ·\n    <a href=\"https://github.com/orgs/novuhq/projects/10\">Roadmap</a>\n    ·\n    <a href=\"https://twitter.com/novuhq\">X</a>\n    ·\n    <a href=\"https://notifications.directory\">Notifications Directory</a>.\n    <a href=\"https://novu.co/blog\">Read our blog</a>\n  </p>\n\n## ⭐️ Why\n\nBuilding 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.\n\n## ✨ Features\n\n- 🌈 Single API for all messaging providers (Email, SMS, Push, Chat)\n- 💅 Easily manage notifications over multiple channels\n- 🚀 Equipped with a templating engine for advanced layouts and designs\n- 🛡 Built-in protection for missing variables\n- 📦 Easy to set up and integrate\n- 🛡 Written in TypeScript with predictable static types.\n- 👨‍💻 Community driven\n\n## 📦 Install\n\n```bash\nnpm install @novu/node\n```\n\n```bash\nyarn add @novu/node\n```\n\n## 🔨 Usage\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu(process.env.NOVU_API_KEY);\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME_FROM_ADMIN_PANEL>', {\n  to: {\n    subscriberId: '<USER_IDENTIFIER>',\n    email: 'test@email.com',\n    firstName: 'John',\n    lastName: 'Doe',\n  },\n  payload: {\n    organization: {\n      logo: 'https://evilcorp.com/logo.png',\n    },\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [x] [EmailJS](https://github.com/novuhq/novu/tree/main/providers/emailjs)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_campaign=node-sdk-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n\n## SDK Methods\n\n- [Subscribers](#subscribers)\n- [Events](#events)\n- [Workflows](#workflows)\n- [Notification Groups](#notification-groups)\n- [Topics](#topics)\n- [Feeds](#feeds)\n- [Tenants](#tenants)\n- [Messages](#messages)\n- [Changes](#changes)\n- [Environments](#environments)\n- [Layouts](#layouts)\n- [Integrations](#integrations)\n- [Organizations](#organizations)\n- [Inbound Parse](#inbound-parse)\n- [Execution Details](#execution-details)\n- [Workflow Overrides](#workflow-overrides)\n\n### Subscribers\n\n- #### List all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst page = 0;\nconst limit = 20;\n\nawait novu.subscribers.list(page, limit);\n```\n\n- #### Identify (create) a new subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify('subscriberId', {\n  firstName: 'Pawan',\n  lastName: 'Jain',\n  email: 'pawan.jain@domain.com',\n  phone: '+1234567890',\n  avatar:\n    'https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x',\n  locale: 'en-US',\n  data: {\n    isDeveloper: true,\n    customKey: 'customValue',\n  },\n});\n```\n\n- #### Bulk create subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.identify([\n  {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  {\n    subscriberId: \"2\",\n    firstName: \"John\",\n    lastName: \"Doe\",\n    email: \"john.doe@domain.com\",\n    phone: \"+1234567891\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-UK\",\n    data: {\n      isDeveloper : false,\n      customKey1: \"customValue1\"\n    };\n  }\n  // more subscribers ...\n])\n```\n\n- #### Get a single subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.get('subscriberId');\n```\n\n- #### Update a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.update(\"subscriberId\",{\n  firstName: \"Pawan\",\n  lastName: \"Jain\",\n  email: \"pawan.jain@domain.com\",\n  phone: \"+1234567890\",\n  avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n  locale: \"en-US\",\n  data: {\n    isDeveloper : true,\n    customKey: \"customValue\",\n    customKey2: \"customValue2\"\n  };\n})\n```\n\n- #### Update provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// update fcm token\nawait novu.subscribers.setCredentials('subscriberId', 'fcm', {\n  deviceTokens: ['token1', 'token2'],\n});\n\n// update slack webhookurl\nawait novu.subscribers.setCredentials('subscriberId', 'slack', {\n  webhookUrl: ['webhookUrl'],\n});\n\n// update slack weebhook for a subscriberId with selected integration\nawait novu.subscribers.setCredentials(\n  'subscriberId',\n  'slack',\n  {\n    webhookUrl: ['webhookUrl'],\n  },\n  'slack_identifier'\n);\n```\n\n- #### Delete provider credentials\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// delete fcm token\nawait novu.subscribers.deleteCredentials('subscriberId', 'fcm');\n\n// delete slack webhookurl\nawait novu.subscribers.deleteCredentials('subscriberId', 'slack');\n```\n\n- #### Delete a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.delete('subscriberId');\n```\n\n- #### Update online status\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark subscriber as offline\nawait novu.subscribers.updateOnlineStatus('subscriberId', false);\n```\n\n- #### Get subscriber preference for all workflows\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getPreference('subscriberId');\n```\n\n- #### Get subscriber global preference\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.subscribers.getGlobalPreference('subscriberId');\n```\n\n- #### Get subscriber preference by level\n\n```ts\nimport { Novu, PreferenceLevelEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n// Get global level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.GLOBAL\n);\n\n// Get template level preference\nawait novu.subscribers.getPreferenceByLevel(\n  'subscriberId',\n  PreferenceLevelEnum.TEMPLATE\n);\n```\n\n- #### Update subscriber preference for a workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'in_app',\n    enabled: true,\n  },\n});\n\n// disable email channel\nawait novu.subscribers.updatePreference('subscriberId', 'workflowId', {\n  channel: {\n    type: 'email',\n    enabled: false,\n  },\n});\n```\n\n- #### Update subscriber preference globally\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// enable in-app channel and disable email channel\nawait novu.subscribers.updateGlobalPreference('subscriberId', {\n  enabled: true,\n  preferences: [\n    {\n      type: 'in_app',\n      enabled: true,\n    },\n    {\n      type: 'email',\n      enabled: false,\n    },\n  ],\n});\n```\n\n- #### Get in-app messages (notifications) feed for a subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0,\n  limit: 20,\n  // copy this value from in-app editor\n  feedIdentifier: \"feedId\",\n  seen: true,\n  read: false,\n  payload: {\n    \"customkey\": \"customValue\"\n  };\n}\n\nawait novu.subscribers.getNotificationsFeed(\"subscriberId\", params);\n```\n\n- #### Get seen/unseen in-app messages (notifications) count\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get seen count\nawait novu.subscribers.getUnseenCount('subscriberId', true);\n\n// get unseen count\nawait novu.subscribers.getUnseenCount('subscriberId', false);\n```\n\n- #### Mark an in-app message (notification) as seen/unseen/read/unread\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark unseen\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: false,\n});\n\n// mark seen and unread\nawait novu.subscribers.markMessageAs('subscriberId', 'messageId', {\n  seen: true,\n  read: false,\n});\n```\n\n- #### Mark all in-app messages (notifications) as seen/unseen/read/unread\n\n```ts\nimport { Novu, MarkMessagesAsEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark all messages as seen\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.SEEN,\n  'feedId'\n);\n\n// mark all messages as read\nawait novu.subscribers.markAllMessagesAs(\n  'subscriberId',\n  MarkMessageAsEnum.READ,\n  'feedId'\n);\n```\n\n- #### Mark in-app message (notification) action as seen\n\n```ts\nimport { Novu, ButtonTypeEnum, MessageActionStatusEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// mark a message's primary action button as pending\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.PRIMARY,\n  {\n    status: MessageActionStatusEnum.PENDING,\n  }\n);\n\n// mark a message's secondary action button as done\nawait novu.subscribers.markMessageActionSeen(\n  'subscriberId',\n  'messageId',\n  ButtonTypeEnum.SECONDARY,\n  {\n    status: MessageActionStatusEnum.DONE,\n  }\n);\n```\n\n### Events\n\n- #### Trigger workflow to one subscriber\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// trigger to existing subscribers\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: \"subscriberId\",\n  payload: {\n    customKey: \"customValue\",\n    customKey1: {\n      nestedkey1: \"nestedValue1\"\n    }\n  },\n  overrides: {\n    email: {\n      from: \"support@novu.co\",\n      // customData will work only for sendgrid\n      customData: {\n        \"customKey\": \"customValue\"\n      },\n      headers: {\n        'X-Novu-Custom-Header': 'Novu-Custom-Header-Value',\n      },\n    }\n  },\n  // actorId is subscriberId of actor\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n// create new subscriber inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: {\n    subscriberId: \"1\",\n    firstName: \"Pawan\",\n    lastName: \"Jain\",\n    email: \"pawan.jain@domain.com\",\n    phone: \"+1234567890\",\n    avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n    locale: \"en-US\",\n    data: {\n      isDeveloper : true,\n      customKey: \"customValue\"\n    };\n  },\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger workflow to multiple subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [ \"subscriberId1\" , \"subscriberId2\" ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n\n\n// create new subscribers inline with trigger\nawait novu.events.trigger(\"workflowIdentifier\", {\n  to: [\n    {\n      subscriberId: \"1\",\n      firstName: \"Pawan\",\n      lastName: \"Jain\",\n      email: \"pawan.jain@domain.com\",\n      phone: \"+1234567890\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-US\",\n      data: {\n        isDeveloper : true,\n        customKey: \"customValue\"\n      };\n    },\n    {\n      subscriberId: \"2\",\n      firstName: \"John\",\n      lastName: \"Doe\",\n      email: \"john.doe@domain.com\",\n      phone: \"+1234567891\",\n      avatar: \"https://gravatar.com/avatar/553b157d82ac2880237566d5a644e5fe?s=400&d=robohash&r=x\",\n      locale: \"en-UK\",\n      data: {\n        isDeveloper : false,\n        customKey1: \"customValue1\"\n      };\n    }\n  ],\n  payload: {},\n  overrides:{} ,\n  actor: \"actorId\",\n  tenant: \"tenantIdentifier\"\n});\n```\n\n- #### Trigger to a topic\n\n```ts\nimport { Novu, TriggerRecipientsTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.trigger('workflowIdentifier', {\n  to: {\n    type: TriggerRecipientsTypeEnum.TOPIC,\n    topicKey: TopicKey,\n  },\n});\n```\n\n- #### Bulk trigger multiple workflows to multiple subscribers\n\nThere is a limit of 100 items in the array of bulkTrigger.\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.bulkTrigger([\n  {\n    name: 'workflowIdentifier_1',\n    to: 'subscriberId_1',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n  {\n    name: 'workflowIdentifier_2',\n    to: 'subscriberId_2',\n    payload: {\n      customKey: 'customValue',\n      customKey1: {\n        nestedkey1: 'nestedValue1',\n      },\n    },\n    overrides: {\n      email: {\n        from: 'support@novu.co',\n      },\n    },\n    // actorId is subscriberId of actor\n    actor: 'actorId',\n    tenant: 'tenantIdentifier',\n  },\n]);\n```\n\n- #### Broadcast to all subscribers\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.broadcast('workflowIdentifier', {\n  payload: {\n    customKey: 'customValue',\n    customKey1: {\n      nestedkey1: 'nestedValue1',\n    },\n  },\n  overrides: {\n    email: {\n      from: 'support@novu.co',\n    },\n  },\n  tenant: 'tenantIdentifier',\n});\n```\n\n- #### Cancel the triggered workflow\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.events.cancel('transactionId');\n```\n\n### Messages\n\n- #### List all messages\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  limit: 20, // optional\n  subscriberId: 'subscriberId', //optional\n  channel: ChannelTypeEnum.EMAIL, //optional\n  transactionIds: ['txnId1', 'txnId2'], //optional\n};\n\nawait novu.messages.list(params);\n```\n\n- #### Delete a message by `messageId`\n\n```ts\nimport { Novu, ChannelTypeEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.messages.deleteById('messageId');\n```\n\n### Layouts\n\n- #### Create a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payload = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: \"false\"\n}\nawait novu.layouts.create(payload);\n```\n\n- #### Update a layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToUpdate = {\n  content: \"<h1>Layout Start</h1>{{{body}}}<h1>Layout End</h1>\",\n  description: \"Organization's first layout\",\n  name: \"First Layout\",\n  identifier: \"firstlayout\",\n  variables: [\n    {\n      type: \"String\",\n      name: \"body\",\n      required: true,\n      defValue: \"\"\n    }\n  ]\n  isDefault: false\n}\nawait novu.layouts.update(\"layoutId\", payloadToUpdate);\n```\n\n- #### Set a layout as the default layout\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.setDefault('layoutId');\n```\n\n- #### Get a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.get('layoutId');\n```\n\n- #### Delete a layout by `layoutId`\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.layouts.delete('layoutId');\n```\n\n- #### List all layouts\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst params = {\n  page: 0, // optional\n  pageSize: 20, // optional\n  sortBy: '_id',\n  orderBy: -1, //optional\n};\n\nawait novu.layouts.list(params);\n```\n\n### Notification Groups\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create a new notification group\nawait novu.notificationGroups.create('Product Updates');\n\n// update an existing notification group\nawait novu.notificationGroups.update('notificationGroupId', {\n  name: 'Changelog Updates',\n});\n\n// list all notification groups\nawait novu.notificationGroups.get();\n\n// get one existing notification group\nawait novu.notificationGroups.getOne('notificationGroupId');\n\n// delete an existing notification group\nawait novu.notificationGroups.delete('notificationGroupId');\n```\n\n### Topics\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst payloadToCreate = {\n  key: 'first-topic',\n  name: 'First Topic',\n};\n\n// create new topic\nawait novu.topics.create(payloadToCreate);\n\n// add subscribers\nawait novu.topics.addSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\n// check if subscriber is present in topic\nawait novu.topics.checkSubscriber('topicKey', 'subscriberId');\n\n// remove subscribers from topic\nawait novu.topics.removeSubscribers('topicKey', {\n  subscribers: ['subscriberId1', 'subscriberId2'],\n});\n\nconst topicsListParams = {\n  page: 0, //optional\n  pageSize: 20,\n  key: 'topicKey',\n};\n\n// list all topics\nawait novu.topics.list(topicsListParams);\n\n// get a topic\nawait novu.topics.get('topicKey');\n\n// delete a topic\nawait novu.topics.delete('topicKey');\n\n// get a topic\nawait novu.topics.rename('topicKey', 'New Topic Name');\n```\n\n### Integrations\n\n```ts\nimport { Novu, ChannelTypeEnum, ProvidersIdEnum } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst updatePayload = {\n  name: \"SendGrid\",\n  identifier: \"sendgrid-identifier\",\n  credentials: {\n    apiKey: \"SUPER_SECRET_API_KEY\",\n    from: \"sales@novu.co\",\n    senderName: \"Novu Sales Team\"\n    // ... other credentials as per provider\n  },\n  active: true,\n  check: false\n}\n\nconst createPayload: {\n  ...updatePayload,\n  channel: ChannelTypeEnum.EMAIL,\n}\n\n// create a new integration\nawait novu.integrations.create(ProvidersIdEnum.SendGrid, createPayload)\n\n// update integration\nawait novu.integrations.update(\"integrationId\", updatePayload)\n\n// get all integrations\nawait novu.integrations.getAll()\n\n// get only active integrations\nawait novu.integrations.getActive()\n\n// get webhook provider status\nawait novu.integrations.getWebhookProviderStatus(ProvidersIdEnum.SendGrid)\n\n// delete existing integration\nawait novu.integrations.delete(\"integrationId\")\n\n// get novu in-app status\nawait novu.integrations.getInAppStatus()\n\n// set an integration as primary\nawait novu.integrations.setIntegrationAsPrimary(\"integrationId\")\n```\n\n### Feeds\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new in-app feed\nawait novu.feeds.create('Product Updates');\n\n/**\n * get all in-app feeds\n * feeds methods returns only feed information\n * use subscriber.notificationsFeed() for in-app messages\n */\nawait novu.feeds.get();\n\n// delete a feed\nawait novu.feeds.delete('feedId');\n```\n\n### Changes\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst changesParams = {\n  page: 1, //optional\n  limit: 20, // optional\n  promoted: false, // required\n};\n\n// get all changes\nawait novu.changes.get(changesParams);\n\n// get changes count\nawait novu.changes.getCount();\n\n// apply only one change\nawait novu.changes.applyOne('changeId');\n\n// apply many changes\nawait novu.changes.applyMany(['changeId1', 'changeId2']);\n```\n\n### Environments\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// get current environment\nawait novu.environments.getCurrent();\n\n// create new environment\nawait novu.environments.create({\n  name: 'Stagging',\n  parentId: 'parentEnvironmentId',\n});\n\n// get all environmemts\nawait novu.environments.getAll();\n\n// update one environment\nawait novu.environments.updateOne('environmentId', {\n  name: 'Stagging', // optional\n  parentId: 'parentEnvironmentId', // optional\n  identifier: 'environmentIdentifier', // optional\n});\n\n// get api keys of environment\nawait novu.environments.getApiKeys();\n\n// regenrate api keys\nawait novu.environments.regenerateApiKeys();\n```\n\n### Tenants\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// create new tenat\nawait novu.tenants.create('tenantIdentifier', {\n  name: 'First Tenant',\n  // optional\n  data: {\n    country: 'US',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// update existing tenant\nawait novu.tenants.update('tenantIdentifier', {\n  identifier: 'tenantIdentifier1',\n  name: 'Second Tenant',\n  // optional\n  data: {\n    country: 'India',\n    tokens: ['token1', 'token2'],\n    isDeveloperTenant: true,\n    numberOfMembers: 2,\n    isSales: undefined,\n  },\n});\n\n// list all tenants\nawait novu.tenants.list({\n  page: 0, // optional\n  limit: 20, // optional\n});\n\n// delete a tenant\nawait novu.tenants.delete('tenantIdentifier');\n\n// get one tenant\nawait novu.tenants.get('tenantIdentifier');\n```\n\n### Workflows\n\n- #### Create a new workflow\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// List all workflow groups\nconst { data: workflowGroupsData } = await novu.notificationGroups.get();\n\n// Create a new workflow\nawait novu.notificationTemplates.create({\n  name: 'Onboarding Workflow',\n  // taking first workflow group id\n  notificationGroupId: workflowGroupsData.data[0]._id,\n  steps: [\n    // Adding one chat step\n    {\n      active: true,\n      shouldStopOnFail: false,\n      // UUID is optional.\n      uuid: '78ab8c72-46de-49e4-8464-257085960f9e',\n      name: 'Chat',\n      filters: [\n        {\n          value: 'AND',\n          children: [\n            {\n              field: '{{chatContent}}',\n              value: 'flag',\n              operator: 'NOT_IN',\n              // 'payload'\n              on: FilterPartTypeEnum.PAYLOAD,\n            },\n          ],\n        },\n      ],\n      template: {\n        // 'chat'\n        type: StepTypeEnum.CHAT,\n        active: true,\n        subject: '',\n        variables: [\n          {\n            name: 'chatContent',\n            // 'String'\n            type: TemplateVariableTypeEnum.STRING,\n            required: true,\n          },\n        ],\n        content: '{{chatContent}}',\n        contentType: 'editor',\n      },\n    },\n  ],\n  description: 'Onboarding workflow to trigger after user sign up',\n  active: true,\n  draft: false,\n  critical: false,\n});\n```\n\n- #### Other Methods\n\n```ts\nimport {\n  Novu,\n  TemplateVariableTypeEnum,\n  FilterPartTypeEnum,\n  StepTypeEnum,\n} from '@novu/node';\n\n// update a workflow\n\nawait novu.notificationTemplates.update('workflowId', {\n  name: 'Send daily digest email update',\n  description: 'This workflow will send daily digest email to user at 9:00 AM',\n  /**\n   * all other fields from create workflow payload\n   */\n});\n\n// get one workflow\nawait novu.notificationTemplates.getOne('workflowId');\n\n// delete one workflow\nawait novu.notificationTemplates.delete('workflowId');\n\n// update status of one workflow\nawait novu.notificationTemplates.updateStatus('workflowId', false);\n\n// list all workflows\nawait novu.notificationTemplates.getAll({\n  page: 0, // optional\n  limit: 20, // optional\n});\n```\n\n### Organizations\n\n- #### List all organizations\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.list();\n```\n\n- #### Create new organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.create({ name: 'New Organization' });\n```\n\n- #### Rename organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.rename({ name: 'Renamed Organization' });\n```\n\n- #### Get current organization details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getCurrent();\n```\n\n- #### Remove member from organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.removeMember('memberId');\n```\n\n- #### Update organization member role\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateMemberRole('memberId', {\n  role: 'admin';\n});\n```\n\n- #### Get all members of organization\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.getMembers();\n```\n\n- #### Update organization branding details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.organizations.updateBranding({\n  logo: 'https://s3.us-east-1.amazonaws.com/bucket/image.jpeg',\n  color: '#000000',\n  fontFamily: 'Lato',\n});\n```\n\n### Inbound Parse\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\n// Validate the mx record setup for the inbound parse functionality\nawait novu.inboundParse.getMxStatus();\n```\n\n### Execution Details\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nconst executionDetailsParams = {\n  subscriberId: 'subscriberId_123',\n  notificationId: 'notificationid_abcd',\n};\n\n// get execution details\nawait novu.executionDetails.get(executionDetailsParams);\n```\n\n### Workflow Overrides\n\n- #### Create new workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.create({\n  workflowId: 'workflow_id_123',\n  tenantId: 'tenant_id_abc',\n  active: false,\n  preferenceSettings: {\n    email: false,\n    sms: false,\n    in_app: false,\n    chat: true,\n    push: false,\n  },\n});\n```\n\n- #### List all workflow overrides\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.list(3, 10);\n```\n\n- #### Get workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneById('overrideId_123');\n```\n\n- #### Get workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.getOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123'\n);\n```\n\n- #### Update workflow override by tenant and workflow ids\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneByTenantIdandWorkflowId(\n  'workflowId_123',\n  'tenantId_123',\n  {\n    active: false,\n  }\n);\n```\n\n- #### Update workflow override by id\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.updateOneById('OVERRIDE_ID', {\n  active: false,\n});\n```\n\n- #### Delete workflow override\n\n```ts\nimport { Novu } from '@novu/node';\n\nconst novu = new Novu('<NOVU_API_KEY>');\n\nawait novu.workflowOverrides.delete('overrideId_123');\n```\n\n<!-- File: packages/notification-center-angular/projects/notification-center-angular/README.md (Tokens: ~390 | Category: plugin-manifest) -->\n<div align=\"center\">\n  <a href=\"https://novu.co\" target=\"_blank\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://user-images.githubusercontent.com/2233092/213641039-220ac15f-f367-4d13-9eaf-56e79433b8c1.png\">\n    <img src=\"https://user-images.githubusercontent.com/2233092/213641043-3bbb3f21-3c53-4e67-afe5-755aeb222159.png\" width=\"280\" alt=\"Logo\"/>\n  </picture>\n  </a>\n</div>\n\n# @novu/notification-center-angular\n\n[![Version](https://img.shields.io/npm/v/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n[![Downloads](https://img.shields.io/npm/dm/@novu/notification-center-angular.svg)](https://www.npmjs.com/package/@novu/notification-center-angular)\n\nThis library contains a wrapper for the Novu Notification Center web component, allowing you to quickly integrate product notifications into your Angular application.\n\n## 📖 Client Installation\n\nFor our client installation guide, visit our [Angular Client docs](https://docs.novu.co/notification-center/client/angular?utm_campaign=github-notificationcenter-angular-readme).\n\n## 🏃‍♂️ Quickstart\n\nFor a quickstart, visit our [Angular Quickstart docs](https://docs.novu.co/quickstarts/angular).\n\n## 💻 Need Help?\n\nWe are more than happy to help you. If you are getting any errors or facing problems while working on this project, join our [Discord server](https://discord.novu.co) and ask for help. We are open to discussing anything related to the project.\n\n<!-- File: packages/notification-center-angular/README.md (Tokens: ~291 | Category: plugin-manifest) -->\n# NotificationCenterAngular\n\nThis is the Angular workspace root project for Novu Angular libraries and components. The libraries are located under `/projects/*`.\nNew libraries should also be added under `/projects/*` by using the `ng generate library <my-lib-name>` command.\n\n## Publishing\nTo publish the `@novu/notification-center-angular` package, simply run `npm run publish:npm`. The following steps will be executed:\n\n1. Build package into the `/dist/notification-center-angular` directory\n2. Publish the `/dist/notification-center-angular` to NPM under @novu/notification-center-angular`\n\n> ⚠️ Ensure that the `/projects/notification-center-angular/package.json` has the correct `@novu/*` version values before publishing\n\n## Build\n\nRun `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.\n\n## Running unit tests\n\nRun `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).\n\n## Running end-to-end tests\n\nRun `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.\n\n## Further help\n\nTo get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.\n\n<!-- File: packages/providers/README.md (Tokens: ~96 | Category: plugin-manifest) -->\n# Novu Apns Provider\n\nA Apns push provider library for [@novu/node](https://github.com/novuhq/novu)\n\n## Usage\n\n```javascript\nimport { APNSPushProvider } from '@novu/apns';\n\nconst provider = new APNSPushProvider({\n    key: \"path/to/APNsAuthKey_XXXXXXXXXX.p8\",\n    keyId: \"key-id\",\n    teamId: \"developer-team-id\"\n});\n```\n\n<!-- File: packages/sdk/README.md (Tokens: ~252 | Category: plugin-manifest) -->\n# Quickstart\n\n```typescript\nconst client = new Echo();\nclient.workflow('comment-on-post', { type: 'object', properties: { post: { type: 'string' } } }, async ({ step }) => {\n  const userResponse = step.custom(\n    'fetch-user',\n    { type: 'object', properties: { name: { type: 'string' } } },\n    async () => ({ email: 'joe@bloggs.com' })\n  );\n\n  step.email('send-email', async (payload) => {\n    return {\n      subject: 'You received a post',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n\n  step.email('send-follow-up', async (payload) => {\n    return {\n      subject: 'You received a follow-up',\n      body: `<html><body>${payload.post}</body></html>`,\n      to: userResponse.email,\n    };\n  });\n});\n\n// Get the workflows\nconst workflows = client.getRegisteredWorkflows();\n\n// Invoke a step\nconst result = client.invokeStep('comment-on-post', 'fetch-user', { post: 'Hello' }).then(console.log);\n```\n\n<!-- File: packages/stateless/README.md (Tokens: ~1002 | Category: plugin-manifest) -->\n## 📦 Install\n\n```bash\nnpm install @novu/stateless\n```\n\n```bash\nyarn add @novu/stateless\n```\n\n## 🔨 Usage\n\n```ts\nimport { NovuStateless, ChannelTypeEnum } from '@novu/stateless';\nimport { SendgridEmailProvider } from '@novu/sendgrid';\n\nconst novu = new NovuStateless();\n\nawait novu.registerProvider(\n  new SendgridEmailProvider({\n    apiKey: process.env.SENDGRID_API_KEY,\n    from: 'sender@mail.com',\n  })\n);\n\nconst passwordResetTemplate = await novu.registerTemplate({\n  id: 'password-reset',\n  messages: [\n    {\n      subject: 'Your password reset request',\n      channel: ChannelTypeEnum.EMAIL,\n      template: `\n          Hi {{firstName}}!\n          \n          To reset your password click <a href=\"{{resetLink}}\">here.</a>\n          \n          {{#if organization}}\n            <img src=\"{{organization.logo}}\" />\n          {{/if}}\n      `,\n    },\n  ],\n});\n\nawait novu.trigger('<REPLACE_WITH_EVENT_NAME>', {\n  $user_id: '<USER IDENTIFIER>',\n  $email: 'test@email.com',\n  firstName: 'John',\n  lastName: 'Doe',\n  organization: {\n    logo: 'https://evilcorp.com/logo.png',\n  },\n});\n```\n\n## Providers\n\nNovu provides a single API to manage providers across multiple channels with a simple-to-use interface.\n\n#### 💌 Email\n\n- [x] [Sendgrid](https://github.com/novuhq/novu/tree/main/providers/sendgrid)\n- [x] [Netcore](https://github.com/novuhq/novu/tree/main/providers/netcore)\n- [x] [Mailgun](https://github.com/novuhq/novu/tree/main/providers/mailgun)\n- [x] [SES](https://github.com/novuhq/novu/tree/main/providers/ses)\n- [x] [Postmark](https://github.com/novuhq/novu/tree/main/providers/postmark)\n- [x] [Custom SMTP](https://github.com/novuhq/novu/tree/main/providers/nodemailer)\n- [x] [Mailjet](https://github.com/novuhq/novu/tree/main/providers/mailjet)\n- [x] [Mandrill](https://github.com/novuhq/novu/tree/main/providers/mandrill)\n- [x] [SendinBlue](https://github.com/novuhq/novu/tree/main/providers/sendinblue)\n- [ ] SparkPost\n\n#### 📞 SMS\n\n- [x] [Twilio](https://github.com/novuhq/novu/tree/main/providers/twilio)\n- [x] [Plivo](https://github.com/novuhq/novu/tree/main/providers/plivo)\n- [x] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [x] [Nexmo - Vonage](https://github.com/novuhq/novu/tree/main/providers/nexmo)\n- [x] [Sms77](https://github.com/novuhq/novu/tree/main/providers/sms77)\n- [x] [Telnyx](https://github.com/novuhq/novu/tree/main/providers/telnyx)\n- [x] [Termii](https://github.com/novuhq/novu/tree/main/providers/termii)\n- [x] [Gupshup](https://github.com/novuhq/novu/tree/main/providers/gupshup)\n- [ ] Bandwidth\n- [ ] RingCentral\n\n#### 📱 Push\n\n- [x] [FCM](https://github.com/novuhq/novu/tree/main/providers/fcm)\n- [x] [Expo](https://github.com/novuhq/novu/tree/main/providers/expo)\n- [ ] [SNS](https://github.com/novuhq/novu/tree/main/providers/sns)\n- [ ] Pushwoosh\n\n#### 👇 Chat\n\n- [x] [Slack](https://github.com/novuhq/novu/tree/main/providers/slack)\n- [x] [Discord](https://github.com/novuhq/novu/tree/main/providers/discord)\n- [ ] MS Teams\n- [ ] Mattermost\n\n#### 📱 In-App\n\n- [x] [Novu](https://docs.novu.co/notification-center/introduction?utm_source=github-stateless-readme)\n- [ ] MagicBell\n\n#### Other (Coming Soon...)\n\n- [ ] PagerDuty\n\n## 🔗 Links\n\n- [Home page](https://novu.co/)\n</yakaai_skills>"}