diff --git a/.github/workflows/dotnet-deploy.yaml b/.github/workflows/dotnet-deploy.yaml index af8d931..ca57d0e 100644 --- a/.github/workflows/dotnet-deploy.yaml +++ b/.github/workflows/dotnet-deploy.yaml @@ -20,7 +20,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x # Step Two: build - name: Build Novu Solution (all projects) diff --git a/.github/workflows/dotnet-test.yaml b/.github/workflows/dotnet-test.yaml index 98511ae..32688e3 100644 --- a/.github/workflows/dotnet-test.yaml +++ b/.github/workflows/dotnet-test.yaml @@ -14,7 +14,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x ## Restore Novu as a solution - name: Restore dependencies diff --git a/.gitignore b/.gitignore index 5c6758b..0ccdc07 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ obj .DS_STORE src/Novu.sln.DotSettings.user **/.vs -appsettings.todd.json \ No newline at end of file +appsettings.todd.json +**/.env +**/refitter/** \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b594c69..70a567f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,12 +19,16 @@ You can open a new issue with this [issue form](https://github.com/novuhq/novu-d ### Requirements -- .NET 7 +- .NET 8 - Novu API Key - Can be located at https://web.novu.co/settings ### Setup the project -Clone the repository and run `dotnet restore` against `Novu.sln` +* Clone the repository and run `dotnet restore` against `Novu.sln` +* docker files for local development in docker folder +* difference between versions in specs folder +* autogen contract files for versions in refitter folder +* Start the local docker version of Novu against the version you are reporting/building against ## Missing a Feature? diff --git a/README.md b/README.md index bc0b9a8..4a623ce 100644 --- a/README.md +++ b/README.md @@ -16,24 +16,29 @@ novu-dotnet targets .NET Standard 2.0 and is compatible with .NET Core 2.0+ and .NET Framework 4.6.1+. +**Current:** Novu api 0.24.0 + ## Features -- Bindings against most [API endpoints](https://docs.novu.co/api/overview/) - - Events, subscribers, notifications, integrations, layouts, topics, workflows, workflow groups, messages, execution details - - Not Implemented: [environments](https://docs.novu.co/api/get-current-environment/), [inbound parse](https://docs.novu.co/api/validate-the-mx-record-setup-for-the-inbound-parse-functionality/), [changes](https://docs.novu.co/api/get-changes/) +- Bindings against all [API endpoints](https://docs.novu.co/api/overview/) + - Events, subscribers, notifications, integrations, layouts, topics, workflows, workflow groups, messages, execution + details - Bootstrap each services as part of services provider or directly as a singleton class (setting injectable) -- A Sync service that will mirror an environment based a set of templates (layouts, integrations, workflow groups, workflows) +- A Sync service that will mirror an environment based a set of templates (layouts, integrations, workflow groups, + workflows) **WARNING**: 0.3.0 has breaking changes and the tests should be relied on for understanding the client libraries ## Dependencies | dotnet novu | novu api [package](https://github.com/novuhq/novu/pkgs/container/novu%2Fapi) | Notes | -| ----------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|-------------|------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 0.2.2 | <= 0.17 | Singleton client with Refit's use of RestService | -| 0.3.0 | >= 0.18 | 0.3.0 is not compatible with 0.2.2 and requires upgrade to code. Also 0.18 introduced a breaking change only found in 0.3.0. All 0.2.2 must be upgraded if used against the production system. HttpClient can now be used and injected. | -| 0.3.1 | >= 0.18 | Failed release. You will not find this release on Nuget. | -| 0.3.2 | >= 0.18 | [BREAKING} Obsolete Notification Templates has been removed. Service registration separation of single client and each client. Novu.Extension and Novu.Sync released as packages. | +| 0.3.0 | \>= 0.18 | 0.3.0 is not compatible with 0.2.2 and requires upgrade to code. Also 0.18 introduced a breaking change only found in 0.3.0. All 0.2.2 must be upgraded if used against the production system. HttpClient can now be used and injected. | +| 0.3.1 | \>= 0.18 | Failed release. You will not find this release on Nuget. | +| 0.3.2 | \>= 0.18 | [BREAKING} Obsolete Notification Templates has been removed. Service registration separation of single client and each client. Novu.Extension and Novu.Sync released as packages. | +| 0.3.2 | \>= 0.18 | | +| 0.4.0 | \>= 0.24 | | ## Installation @@ -128,42 +133,306 @@ public class NovuNotificationService Usage of the library is best understood by looking at the tests. -- [Integration Tests](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Tests/IntegrationTests): these show the minimal dependencies required to do one primary request (create, update, delete) -- [Acceptance Tests](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Tests/AcceptanceTests): these show a sequence of actions to complete a business process in an environment +- [Integration Tests](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Tests/IntegrationTests): these show the + minimal dependencies required to do one primary request (create, update, delete) +- [Acceptance Tests](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Tests/AcceptanceTests): these show a + sequence of actions to complete a business process in an environment ## Repository Overview -[Novu](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu) is the main SDK with [Novu.Tests](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Tests) housing all unit tests. [Novu.Extensions](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Extensions) is required for DI and [Novu.Sync](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Sync) +[Novu](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu) is the main SDK +with [Novu.Tests](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Tests) housing all unit +tests. [Novu.Extensions](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Extensions) is required for DI +and [Novu.Sync](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Sync) if your are looking for mirroring environments. ### novu-dotnet The key folders to look into: -- [DTO](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu/DTO) directory holds all objects needed to use the clients -- [Interfaces](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu/Interfaces) directory holds all interfaces that are intended to outline how a class should be structured -- [Models](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu/Models) directory holds various models that are sub-resources inside the DTOs - -### Major changes - -Github issues closed - -#### 0.3.1 - -- #57 -- #58 -- #59 -- #60 -- #55 - -#### 0.3.0 - -- #19 -- #20 -- #21 -- #34 -- #48 -- #49 -- #50 -- #47 -- #45 +- [Models](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu.Domain/Models) directory holds all objects needed to + use the + clients (a port of the contracts from openapi spec and consolidated—actually + autogen [contracts](https://github.com/novuhq/novu-dotnet/tree/main/src/refitter)) +- [Clients](https://github.com/novuhq/novu-dotnet/tree/main/src/Novu/Clients) directory holds all interfaces that + are intended to outline how a class should be structured + +## API + +Note: all old release information is in `specs/[version]/README` (which includes diffs) + +**Tracking Versions**: `New`, `Changed`, `Deleted`, `Deprecated` + +* **New**: tracked since version +* **Changed**: has had changes on the endpoint attributes +* **Deleted**: was removed (obsolete) +* **Deprecated**: marked as being removed + +**Compatability**: `Full`, `Incomplete`, `None`, `Upgrade` + +* **Full**: all attributes are supported on the model on the method/endpoint call +* **None**: the method/endpoint is not implemented +* **Upgrade**: known changes to the attributes are required that are flagged (practically same as incomplete but + effectively a NEW placeholder) + +### Events + +Events represent a change in state of a subscriber. They are used to trigger workflows, and enable you to send +notifications to subscribers based on their actions. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/events/trigger | Trigger event | 0.18.0 | 0.19.0 | | | Upgrade | | +| POST | /v1/events/trigger/bulk | Bulk trigger event | 0.18.0 | | | | Full | | +| POST | /v1/events/trigger/broadcast | Broadcast event to all | 0.18.0 | | | | Full | | +| DELETE | /v1/events/trigger/{transactionId} | Cancel triggered event | 0.18.0 | | | | Full | | + +### Subscribers + +A subscriber in Novu represents someone who should receive a message. A subscriber’s profile information contains +important attributes about the subscriber that will be used in messages (name, email). The subscriber object can contain +other key-value pairs that can be used to further personalize your messages. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/subscribers | Get subscribers | 0.18.0 | | | | Full | | +| POST | /v1/subscribers | Create subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId} | Get subscriber | 0.18.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId} | Update subscriber | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId} | Delete subscriber | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/bulk | Bulk create subscribers | 0.19.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId}/credentials | Update subscriber credentials | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId}/credentials/{providerId} | Delete subscriber credentials by providerId | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/online-status | Update subscriber online status | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences | Get subscriber preferences | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences | Update subscriber global preferences | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences/{level} | Get subscriber preferences by level | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences/{templateId} | Update subscriber preference | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/feed | Get in-app notification feed for a particular subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/unseen | Get the unseen in-app notifications count for subscribers feed | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/markAs | Mark a subscriber feed message as seen | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/mark-all | Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed. | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} | Mark message action as seen | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback | Handle providers oauth redirect | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth | Handle chat oauth | 0.18.0 | | | | Full | | + +### Topics + +Topics are a way to group subscribers together so that they can be notified of events at once. A topic is identified by +a custom key. This can be helpful for things like sending out marketing emails or notifying users of new features. +Topics can also be used to send notifications to the subscribers who have been grouped together based on their +interests, location, activities and much more. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|----------------------------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/topics | Topic creation | 0.18.0 | | | | Full | | +| GET | /v1/topics | Filter topics | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers | Subscribers addition | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey}/subscribers/{externalSubscriberId} | Check topic subscriber | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers/removal | Subscribers removal | 0.18.0 | | | | Full | | +| DELETE | /v1/topics/{topicKey} | Delete topic | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey} | Get topic | 0.18.0 | | | | Full | | +| PATCH | /v1/topics/{topicKey} | Rename a topic | 0.18.0 | | | | Full | | + +### Notification + +A notification conveys information from source to recipient, triggered by a workflow acting as a message blueprint. +Notifications can be individual or bundled as digest for user-friendliness. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|-----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/notifications | Get notifications | 0.18.0 | | | | Full | | +| GET | /v1/notifications/stats | Get notification statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/graph/stats | Get notification graph statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/{notificationId} | Get notification | 0.18.0 | | | | Full | | + +### Integrations + +With the help of the Integration Store, you can easily integrate your favorite delivery provider. During the runtime of +the API, the Integrations Store is responsible for storing the configurations of all the providers. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-------------------------------------------------------|-----------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/integrations | Get integrations | 0.18.0 | | | | Full | | +| POST | /v1/integrations | Create integration | 0.18.0 | | | | Full | | +| GET | /v1/integrations/active | Get active integrations | 0.18.0 | | | | Full | | +| GET | /v1/integrations/webhook/provider/{providerId}/status | Get webhook support status for provider | 0.18.0 | | | | Full | | +| PUT | /v1/integrations/{integrationId} | Update integration | 0.18.0 | | | | Full | | +| DELETE | /v1/integrations/{integrationId} | Delete integration | 0.18.0 | | | | Full | | +| POST | /v1/integrations/{integrationId}/set-primary | Set integration as primary | 0.18.0 | | | | Full | | +| GET | /v1/integrations/{channelType}/limit | | 0.18.0 | | 0.24.0 | | Removed | | +| GET | /v1/integrations/in-app/status | | 0.18.0 | | 0.24.0 | | Removed | | + +### Layouts + +Novu allows the creation of layouts - a specific HTML design or structure to wrap content of email notifications. +Layouts can be manipulated and assigned to new or existing workflows within the Novu platform, allowing users to create, +manage, and assign these layouts to workflows, so they can be reused to structure the appearance of notifications sent +through the platform. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------|--------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/layouts | Layout creation | 0.18.0 | | | | Full | | +| GET | /v1/layouts | Filter layouts | 0.18.0 | | | | Full | | +| GET | /v1/layouts/{layoutId} | Get layout | 0.18.0 | | | | Full | | +| DELETE | /v1/layouts/{layoutId} | Delete layout | 0.18.0 | | | | Full | | +| PATCH | /v1/layouts/{layoutId} | Update a layout | 0.18.0 | | | | Full | | +| POST | /v1/layouts/{layoutId}/default | Set default layout | 0.18.0 | | | | Full | | + +### Workflows + +All notifications are sent via a workflow. Each workflow acts as a container for the logic and blueprint that are +associated with a type of notification in your system. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/workflows | Get workflows | 0.18.0 | | | | Full | | +| POST | /v1/workflows | Create workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId} | Update workflow | 0.18.0 | | | | Full | | +| DELETE | /v1/workflows/{workflowId} | Delete workflow | 0.18.0 | | | | Full | | +| GET | /v1/workflows/{workflowId} | Get workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId}/status | Update workflow status | 0.18.0 | | | | Full | | + +### Notification Templates + +Deprecated. Use Workflows (/workflows) instead, which provide the same functionality under a new name. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/notification-templates | Get workflows | 0.18.0 | | | 0.19.0 | Removed | | +| POST | /v1/notification-templates | Create workflow | 0.18.0 | | | 0.19.0 | Removed | | +| PUT | /v1/notification-templates/{templateId} | Update workflow | 0.18.0 | | | 0.19.0 | Removed | | +| DELETE | /v1/notification-templates/{templateId} | Delete workflow | 0.18.0 | | | 0.19.0 | Removed | | +| GET | /v1/notification-templates/{templateId} | Get workflow | 0.18.0 | | 0.24.0 | 0.19.0 | Removed | | +| PUT | /v1/notification-templates/{templateId}/status | Update workflow status | 0.18.0 | | 0.24.0 | 0.19.0 | Removed | | + +### Workflow Groups + +Workflow groups are used to organize workflows into logical groups. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/notification-groups | Create workflow group | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups | Get workflow groups | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups/{id} | Get workflow group | 0.18.0 | | | | Full | | +| PATCH | /v1/notification-groups/{id} | Update workflow group | 0.18.0 | | | | Full | | +| DELETE | /v1/notification-groups/{id} | Delete workflow group | 0.18.0 | | | | Full | | + +### Changes + +Changes represent a change in state of an environment. They are analagous to a pending pull request in git, enabling you +to test changes before they are applied to your environment and atomically apply them when you are ready. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-------------------|--------|---------|---------|------------|---------------|-----------------------| +| GET | /v1/changes | Get changes | 0.18.0 | | | | Full | | +| GET | /v1/changes/count | Get changes count | 0.18.0 | | | | Full | | +| POST | /v1/changes/bulk/apply | Apply changes | 0.18.0 | | | | Full | Unsure how this works | +| POST | /v1/changes/{changeId}/apply | Apply change | 0.18.0 | | | | Full | Unsure how this works | + +### Environments + +Novu uses the concept of environments to ensure logical separation of your data and configuration. This means that +subscribers, and preferences created in one environment are never accessible to another. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------|-------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/environments/me | Get current environment | 0.18.0 | | | | Full | | +| POST | /v1/environments | Create environment | 0.18.0 | | 0.24.0 | ?? | None | | +| GET | /v1/environments | Get environments | 0.18.0 | | | | Full | | +| PUT | /v1/environments{environmentId} | Update env by id | 0.18.0 | | 0.24.0 | ?? | None | | +| GET | /v1/environments/api-keys | Get api keys | 0.18.0 | | | | Full | | +| POST | /v1/environments/api-keys/regenerate | Regenerate api keys | 0.18.0 | | | | Full | | + +### Inbound Parse + +Inbound Webhook is a feature that allows processing of incoming emails for a domain or subdomain. The feature parses the +contents of the email and POSTs the information to a specified URL in a multipart/form-data format. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------|------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/inbound-parse/mx/status | Validate the mx record setup for the inbound parse functionality | 0.18.0 | | | | Full | | + +### Feeds + +Novu provides a notification activity feed that monitors every outgoing message associated with its relevant metadata. +This can be used to monitor activity and discover potential issues with a specific provider or a channel type. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------|-------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/feeds | Create feed | 0.18.0 | | | | Full | | +| GET | /v1/feeds | Get feeds | 0.18.0 | | | | Full | | +| DELETE | /v1/feeds/{feedId} | Delete feed | 0.18.0 | | | | Full | | + +### Tenants + +A tenant represents a group of users. As a developer, when your apps have organizations, they are referred to as +tenants. Tenants in Novu provides the ability to tailor specific notification experiences to users of different groups +or organizations. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------|---------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/tenants | Get tenants | 0.19.0 | | | | Full | | +| POST | /v1/tenants | Create tenant | 0.19.0 | | | | Full | | +| GET | /v1/tenants/{identifier} | Get tenant | 0.19.0 | | | | Full | | +| PATCH | /v1/tenants/{identifier} | Update tenant | 0.19.0 | | | | Full | | +| DELETE | /v1/tenants/{identifier} | Delete tenant | 0.19.0 | | | | Full | | + +### Messages + +A message in Novu represents a notification delivered to a recipient on a particular channel. Messages contain +information about the request that triggered its delivery, a view of the data sent to the recipient, and a timeline of +its lifecycle events. Learn more about messages. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------|----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/messages | Get messages | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/{messageId} | Delete message | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/transaction/{transactionId} | Delete messages by transactionId | 0.18.0 | | | | Full | | + +### Organizations + +An organization serves as a separate entity within your Novu account. Each organization you create has its own separate +integration store, workflows, subscribers, and API keys. This separation of resources allows you to manage multi-tenant +environments and separate domains within a single account. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------------|--------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/organizations | Create an organization | 0.19.0 | | | | Full | | +| GET | /v1/organizations | Fetch all organizations | 0.19.0 | | | | Full | | +| PATCH | /v1/organizations | Rename organization name | 0.19.0 | | | | Full | | +| GET | /v1/organizations/me | Fetch current organization details | 0.19.0 | | | | Full | | +| DELETE | /v1/organizations/members/{memberId} | Remove a member from organization using memberId | 0.19.0 | | | | Full | | +| PUT | /v1/organizations/members/{memberId}/roles | Update a member role to admin | 0.19.0 | | ?? | | Removed | | +| GET | /v1/organizations/members | Fetch all members of current organizations | 0.19.0 | | | | Full | | +| PUT | /v1/organizations/branding | Update organization branding details | 0.19.0 | | | | Full | | + +### Execution Details + +Execution details are used to track the execution of a workflow. They provided detailed information on the execution of +a workflow, including the status of each step, the input and output of each step, and the overall status of the +execution. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/execution-details | Get execution details | 0.18.0 | | | | Full | | + +### Default + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------------|-------------|--------|---------|---------|------------|---------------|------------------------------| +| GET | /v1/blueprints/group-by-category | | 0.19.0 | | | | Full | | +| GET | /v1/blueprints/list | | 0.19.0 | | 0.24.0 | | None | | +| GET | /v1/blueprints/{templateIdOrIdentifier} | | 0.19.0 | | | | Full | Throws 500 error on wrong id | + +### Workflow-Overrides + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------------------------|--------------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/workflow-overrides | Create a workflow override | 0.19.0 | | | | Full | | +| GET | /v1/workflow-overrides | Get workflow overrides | 0.19.0 | | | | Full | | +| PUT | /v1/workflow-overrides/{overrideId} | Update workflow by override id | 0.19.0 | | | | Full | | +| GET | /v1/workflow-overrides/{overrideId} | Get workflow override by id | 0.19.0 | | | | Full | | +| DELETE | /v1/workflow-overrides/{overrideId} | Delete workflow override | 0.19.0 | | | | Full | | +| PUT | /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} | Update workflow override | 0.19.0 | | | | Full | | +| GET | /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} | Get workflow override | 0.19.0 | | | | Full | | diff --git a/docker/.env.example b/docker/.env.example new file mode 100644 index 0000000..4babe87 --- /dev/null +++ b/docker/.env.example @@ -0,0 +1,55 @@ +# +# copy this file to .env to be picked up by docker-compose +# +# see https://github.com/novuhq/novu/pkgs/container/novu%2Fapi to find version +IMAGE_VERSION=0.24.4 + +# Secrets +# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION +JWT_SECRET=> +STORE_ENCRYPTION_KEY= + +# General +NODE_ENV=local + +MONGO_PORT=27017 +MONGO_MAX_POOL_SIZE=500 + +FORWARD_MINIO_CONSOLE_PORT=9090 +FORWARD_MINIO_PORT=9000 + +REDIS_PORT=6379 +REDIS_CACHE_SERVICE_PORT=6379 +REDIS_HOST=redis +REDIS_CACHE_SERVICE_HOST= +REDIS_PASSWORD= + +# AWS +AWS_REGION=us-east-1 +AWS_ACCESS_KEY_ID=<4_CHARS> +AWS_SECRET_ACCESS_KEY=<7_CHARS> + +S3_BUCKET_NAME=local-notifications +S3_REGION=us-east-1 + +# Novu Ports +API_PORT=3000 +WS_PORT=3002 +APP_PORT=4200 +WIDGET_PORT=4500 +WIDGET_EMBED_PORT=4701 + +DISABLE_USER_REGISTRATION=false + +# Context Paths +# Only needed for setups with reverse-proxies +GLOBAL_CONTEXT_PATH= +WEB_CONTEXT_PATH= +API_CONTEXT_PATH= +WS_CONTEXT_PATH= +WIDGET_CONTEXT_PATH= + +# Analytics +SENTRY_DSN= +NEW_RELIC_APP_NAME= +NEW_RELIC_LICENSE_KEY= diff --git a/docker/Readme.md b/docker/Readme.md new file mode 100644 index 0000000..760ecd0 --- /dev/null +++ b/docker/Readme.md @@ -0,0 +1,49 @@ +Docker is used to self-host Novu for testing. + +### Before you begin + +You need the following installed in your system: + +- [Docker](https://docs.docker.com/engine/install/) and [docker-compose](https://docs.docker.com/compose/install/) + +### Start Novu + +```sh +# Start Novu +docker-compose -f ./docker/docker-compose.yml up +``` + +### Change settings + +The current docker compose file has default settings to work immediately in testing. However, any +can be changed by creating your own `.env` file: + +```sh +# Go to the docker folder +cd docker + +# Copy the example env file (and make changes, but should work on defaults) +# the version of the Novu docker images are set in the .env file +cp .env.example .env + +# Start Novu +docker-compose -f ./docker-compose.yml up +``` + +### Testing + +* The `appsettings.Integration.json` file is pointing at http:localhost:3000 +* [http://127.0.0.1:4200](http://127.0.0.1:4200) for the API key on the organisation + +```json +{ + "Novu": { + "Url": "http://localhost:3000/v1", + "ApiKey": "082f1cdac19663855359343735aae5b1" + } +} +``` + +### OpenApi + +* [http://127.0.0.1:3000/openapi](http://127.0.0.1:3000/openapi)[.json|yaml] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..76961de --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,258 @@ +name: novu-dotnet +services: + # s3 minio is used for local development (rather than tests) + # because it stores files across docker restart unlike localstack free version (requires pro) + s3: + image: 'minio/minio:latest' + container_name: dotnet-novu-s3-minio + ports: + - ${FORWARD_MINIO_PORT:-9000}:9000 + - ${FORWARD_MINIO_CONSOLE_PORT:-9090}:9090 + environment: + MINIO_ROOT_USER: '${AWS_ACCESS_KEY_ID}' + MINIO_ROOT_PASSWORD: '${AWS_SECRET_ACCESS_KEY}' + MINIO_API_CORS_ALLOW_ORIGIN: http://localhost:${APP_PORT} + restart: always + volumes: + - 'minio:/data/minio' + command: minio server /data/minio --console-address ":9090" + networks: + - novu + # + # Novu notification services + # see https://github.com/novuhq/novu/blob/next/docker/local/deployment/docker-compose.yml + # + redis: + image: 'redis:alpine' + container_name: dotnet-novu-redis + restart: unless-stopped + ports: + - ${REDIS_PORT:-6379}:6379 + healthcheck: + test: "bash -c 'redis-cli ping'" + retries: 5 + interval: 10s + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + networks: + - novu + # redis-slave: + # image: 'redis:alpine' + # container_name: redis-slave + # restart: unless-stopped + # command: redis-server --slaveof redis-master 6379 + # logging: + # driver: 'json-file' + # options: + # max-size: '50m' + # max-file: '5' + # networks: + # - novu + mongodb: + image: mongo + container_name: dotnet-novu-mongodb + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + - PUID=1000 + - PGID=1000 + volumes: + - mongodb:/data/db + ports: + - ${MONGO_PORT:-27017}:27017 + networks: + - novu + novu-api: + image: 'ghcr.io/novuhq/novu/api:${IMAGE_VERSION}' + depends_on: + - mongodb + - redis + container_name: dotnet-novu-api + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + NODE_ENV: ${NODE_ENV} + API_ROOT_URL: http://localhost:${API_PORT} + DISABLE_USER_REGISTRATION: ${DISABLE_USER_REGISTRATION} + PORT: ${API_PORT} + FRONT_BASE_URL: http://localhost:${APP_PORT} + MONGO_URL: mongodb://mongodb:${MONGO_PORT}/novu-db + MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + REDIS_PASSWORD: ${REDIS_PASSWORD} + REDIS_DB_INDEX: 2 + REDIS_CACHE_SERVICE_HOST: ${REDIS_CACHE_SERVICE_HOST} + REDIS_CACHE_SERVICE_PORT: ${REDIS_CACHE_SERVICE_PORT} + S3_LOCAL_STACK: http://localhost:${FORWARD_MINIO_CONSOLE_PORT} + S3_BUCKET_NAME: ${S3_BUCKET_NAME} + S3_REGION: ${S3_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + JWT_SECRET: ${JWT_SECRET} + STORE_ENCRYPTION_KEY: ${STORE_ENCRYPTION_KEY} + SENTRY_DSN: ${SENTRY_DSN} + NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} + NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} + NEW_RELIC_AGENT_ENABLED: "false" + NEW_RELIC_MONITOR_MODE: "false" + NEW_RELIC_ENABLED: "false" + NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED: "false" + LOGGING_LEVEL: "warn" + API_CONTEXT_PATH: ${API_CONTEXT_PATH} + ports: + - ${API_PORT:-3000}:3000 + networks: + - novu + novu-worker: + image: 'ghcr.io/novuhq/novu/worker:${IMAGE_VERSION}' + depends_on: + - mongodb + - redis + container_name: dotnet-novu-worker + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + NODE_ENV: ${NODE_ENV} + MONGO_URL: mongodb://mongodb:${MONGO_PORT}/novu-db + MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + REDIS_PASSWORD: ${REDIS_PASSWORD} + REDIS_DB_INDEX: 2 + REDIS_CACHE_SERVICE_HOST: ${REDIS_CACHE_SERVICE_HOST} + REDIS_CACHE_SERVICE_PORT: ${REDIS_CACHE_SERVICE_PORT} + S3_LOCAL_STACK: http://localhost:${FORWARD_MINIO_CONSOLE_PORT} + S3_BUCKET_NAME: ${S3_BUCKET_NAME} + S3_REGION: ${S3_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + STORE_ENCRYPTION_KEY: ${STORE_ENCRYPTION_KEY} + SENTRY_DSN: ${SENTRY_DSN} + NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} + NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} + NEW_RELIC_AGENT_ENABLED: "false" + NEW_RELIC_MONITOR_MODE: "false" + NEW_RELIC_ENABLED: "false" + NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED: "false" + LOGGING_LEVEL: "warn" + networks: + - novu + novu-ws: + image: 'ghcr.io/novuhq/novu/ws:${IMAGE_VERSION}' + depends_on: + - mongodb + - redis + container_name: dotnet-novu-ws + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + PORT: ${WS_PORT} + NODE_ENV: ${NODE_ENV} + MONGO_URL: mongodb://mongodb:${MONGO_PORT}/novu-db + MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + REDIS_PASSWORD: ${REDIS_PASSWORD} + JWT_SECRET: ${JWT_SECRET} + WS_CONTEXT_PATH: ${WS_CONTEXT_PATH} + LOGGING_LEVEL: "warn" + ports: + - ${WS_PORT:-3002}:3002 + networks: + - novu + novu-web: + image: 'ghcr.io/novuhq/novu/web:${IMAGE_VERSION}' + depends_on: + - novu-api + - novu-worker + container_name: dotnet-novu-web + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + REACT_APP_API_URL: http://localhost:${API_PORT} + REACT_APP_ENVIRONMENT: ${NODE_ENV} + REACT_APP_WIDGET_EMBED_PATH: http://localhost:${WIDGET_EMBED_PORT}/embed.umd.min.js + REACT_APP_DOCKER_HOSTED_ENV: 'true' + REACT_APP_WS_URL: http://localhost:${WS_PORT} + LOGGING_LEVEL: "warn" + # turned off because causing problems + IS_TEMPLATE_STORE_ENABLED: "false" + # requires that there is a primary integration per environment/organisation + IS_MULTI_PROVIDER_CONFIGURATION_ENABLED: "false" + IS_MULTI_TENANCY_ENABLED: "false" + ports: + - ${APP_PORT:-4200}:4200 + networks: + - novu + novu-widget: + image: 'ghcr.io/novuhq/novu/widget:${IMAGE_VERSION}' + depends_on: + - novu-api + - novu-worker + - novu-web + container_name: dotnet-novu-widget + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + REACT_APP_API_URL: http://localhost:${API_PORT} + REACT_APP_WS_URL: http://localhost:${WS_PORT} + REACT_APP_ENVIRONMENT: ${NODE_ENV} + WIDGET_CONTEXT_PATH: ${WIDGET_CONTEXT_PATH} + LOGGING_LEVEL: "warn" + ports: + - ${WIDGET_PORT:-4500}:4500 + networks: + - novu + novu-embed: + depends_on: + - novu-widget + image: 'ghcr.io/novuhq/novu/embed:${IMAGE_VERSION}' + container_name: dotnet-novu-embed + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + WIDGET_URL: http://localhost:${WIDGET_PORT} + LOGGING_LEVEL: "warn" + ports: + - ${WIDGET_EMBED_PORT:-4701}:4701 + networks: + - novu +volumes: + data: + mongodb: ~ + minio: + driver: local +networks: + novu: diff --git a/specs/0.18.0/README.md b/specs/0.18.0/README.md new file mode 100644 index 0000000..cc91290 --- /dev/null +++ b/specs/0.18.0/README.md @@ -0,0 +1,185 @@ +## API +* **Since:** 0.18.0 +* **Latest:** 0.18.0 + +**Tracking Versions**: New, Changed, Deleted, Deprecated + +* **New**: tracked since version +* **Changed**: has had changes on the endpoint attributes +* **Deleted**: was removed (obsolete) +* **Deprecated**: marked as being removed + +**Compatability**: Full, Incomplete, None, Upgrade + +* **Full**: all attributes are supported on the model on the method/endpoint call +* **None**: the method/endpoint is not implemented +* **Upgrade**: known changes to the attributes are required that are flagged (practically same as incomplete but + effectively a NEW placeholder) + +### Events + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/events/trigger | Trigger event | 0.18.0 | | | | Upgrade | | +| POST | /v1/events/trigger/bulk | Bulk trigger event | 0.18.0 | | | | Full | | +| POST | /v1/events/trigger/broadcast | Broadcast event to all | 0.18.0 | | | | Full | | +| DELETE | /v1/events/trigger/{transactionId} | Cancel triggered event | 0.18.0 | | | | Full | | + +### Subscribers + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/subscribers | Get subscribers | 0.18.0 | | | | Full | | +| POST | /v1/subscribers | Create subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId} | Get subscriber | 0.18.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId} | Update subscriber | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId} | Delete subscriber | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/bulk | Bulk create subscribers | 0.19.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId}/credentials | Update subscriber credentials | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId}/credentials/{providerId} | Delete subscriber credentials by providerId | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/online-status | Update subscriber online status | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences | Get subscriber preferences | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences | Update subscriber global preferences | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences/{level} | Get subscriber preferences by level | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences/{templateId} | Update subscriber preference | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/feed | Get in-app notification feed for a particular subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/unseen | Get the unseen in-app notifications count for subscribers feed | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/markAs | Mark a subscriber feed message as seen | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/mark-all | Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed. | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} | Mark message action as seen | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback | Handle providers oauth redirect | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth | Handle chat oauth | 0.18.0 | | | | Full | | + +### Topics + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|----------------------------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/topics | Topic creation | 0.18.0 | | | | Full | | +| GET | /v1/topics | Filter topics | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers | Subscribers addition | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey}/subscribers/{externalSubscriberId} | Check topic subscriber | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers/removal | Subscribers removal | 0.18.0 | | | | Full | | +| DELETE | /v1/topics/{topicKey} | Delete topic | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey} | Get topic | 0.18.0 | | | | Full | | +| PATCH | /v1/topics/{topicKey} | Rename a topic | 0.18.0 | | | | Full | | + +### Notification + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|-----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/notifications | Get notifications | 0.18.0 | | | | Full | | +| GET | /v1/notifications/stats | Get notification statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/graph/stats | Get notification graph statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/{notificationId} | Get notification | 0.18.0 | | | | Full | | + +### Integrations + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-------------------------------------------------------|-----------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/integrations | Get integrations | 0.18.0 | | | | Full | | +| POST | /v1/integrations | Create integration | 0.18.0 | | | | Full | | +| GET | /v1/integrations/active | Get active integrations | 0.18.0 | | | | Full | | +| GET | /v1/integrations/webhook/provider/{providerId}/status | Get webhook support status for provider | 0.18.0 | | | | Full | | +| PUT | /v1/integrations/{integrationId} | Update integration | 0.18.0 | | | | Full | | +| DELETE | /v1/integrations/{integrationId} | Delete integration | 0.18.0 | | | | Full | | +| POST | /v1/integrations/{integrationId}/set-primary | Set integration as primary | 0.18.0 | | | | Full | | +| GET | /v1/integrations/{channelType}/limit | | 0.18.0 | | | | Full | | +| GET | /v1/integrations/in-app/status | | 0.18.0 | | | | Full | | + +### Layouts + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------|--------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/layouts | Layout creation | 0.18.0 | | | | Full | | +| GET | /v1/layouts | Filter layouts | 0.18.0 | | | | Full | | +| GET | /v1/layouts/{layoutId} | Get layout | 0.18.0 | | | | Full | | +| DELETE | /v1/layouts/{layoutId} | Delete layout | 0.18.0 | | | | Full | | +| PATCH | /v1/layouts/{layoutId} | Update a layout | 0.18.0 | | | | Full | | +| POST | /v1/layouts/{layoutId}/default | Set default layout | 0.18.0 | | | | Full | | + +### Workflows + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/workflows | Get workflows | 0.18.0 | | | | Full | | +| POST | /v1/workflows | Create workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId} | Update workflow | 0.18.0 | | | | Full | | +| DELETE | /v1/workflows/{workflowId} | Delete workflow | 0.18.0 | | | | Full | | +| GET | /v1/workflows/{workflowId} | Get workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId}/status | Update workflow status | 0.18.0 | | | | Full | | + +### Notification Templates + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/workflows | Get workflows | 0.18.0 | | | 0.18.0 | None | | +| POST | /v1/workflows | Create workflow | 0.18.0 | | | 0.18.0 | None | | +| PUT | /v1/workflows/{workflowId} | Update workflow | 0.18.0 | | | 0.18.0 | None | | +| DELETE | /v1/workflows/{workflowId} | Delete workflow | 0.18.0 | | | 0.18.0 | None | | +| GET | /v1/workflows/{workflowId} | Get workflow | 0.18.0 | | | 0.18.0 | None | | +| PUT | /v1/workflows/{workflowId}/status | Update workflow status | 0.18.0 | | | 0.18.0 | None | | + +### Workflow Groups + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/notification-groups | Create workflow group | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups | Get workflow groups | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups/{id} | Get workflow group | 0.18.0 | | | | Full | | +| PATCH | /v1/notification-groups/{id} | Update workflow group | 0.18.0 | | | | Full | | +| DELETE | /v1/notification-groups/{id} | Delete workflow group | 0.18.0 | | | | Full | | + +### Changes + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/changes | Get changes | 0.18.0 | | | | None | | +| GET | /v1/changes/count | Get changes count | 0.18.0 | | | | None | | +| POST | /v1/changes/bulk/apply | Apply changes | 0.18.0 | | | | None | | +| POST | /v1/changes/{changeId}/apply | Apply change | 0.18.0 | | | | None | | + +### Environments + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------|-------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/environments/me | Get current environment | 0.18.0 | | | | None | | +| POST | /v1/environments | Create environment | 0.18.0 | | | | None | | +| GET | /v1/environments | Get environments | 0.18.0 | | | | None | | +| PUT | /v1/environments{environmentId} | Update env by id | 0.18.0 | | | | None | | +| GET | /v1/environments/api-keys | Get api keys | 0.18.0 | | | | None | | +| POST | /v1/environments/api-keys/regenerate | Regenerate api keys | 0.18.0 | | | | None | | + +### Inbound Parse + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------|------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/inbound-parse/mx/status | Validate the mx record setup for the inbound parse functionality | 0.18.0 | | | | None | | + +### Feeds + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------|-------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/feeds | Create feed | 0.18.0 | | | | None | | +| GET | /v1/feeds | Get feeds | 0.18.0 | | | | None | | +| DELETE | /v1/feeds/{feedId} | Delete feed | 0.18.0 | | | | None | | + +### Messages + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------|----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/messages | Get messages | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/{messageId} | Delete message | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/transaction/{transactionId} | Delete messages by transactionId | 0.18.0 | | | | Full | | + +### Execution Details + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/execution-details | Get execution details | 0.18.0 | | | | Full | | + +### Default + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|----------------------------------|-------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/blueprints/group-by-category | | 0.18.0 | | | | Full | | +| GET | /v1/blueprints/{id} | | 0.18.0 | | | | Full | | diff --git a/specs/0.19.0/README.md b/specs/0.19.0/README.md new file mode 100644 index 0000000..46a15a3 --- /dev/null +++ b/specs/0.19.0/README.md @@ -0,0 +1,209 @@ +## API +* **Since:** 0.18.0 +* **Latest:** 0.19.0 + +**Tracking Versions**: New, Changed, Deleted, Deprecated + +* **New**: tracked since version +* **Changed**: has had changes on the endpoint attributes +* **Deleted**: was removed (obsolete) +* **Deprecated**: marked as being removed + +**Compatability**: Full, Incomplete, None, Upgrade + +* **Full**: all attributes are supported on the model on the method/endpoint call +* **None**: the method/endpoint is not implemented +* **Upgrade**: known changes to the attributes are required that are flagged (practically same as incomplete but + effectively a NEW placeholder) + +### Events + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/events/trigger | Trigger event | 0.18.0 | | | | Upgrade | | +| POST | /v1/events/trigger/bulk | Bulk trigger event | 0.18.0 | | | | Full | | +| POST | /v1/events/trigger/broadcast | Broadcast event to all | 0.18.0 | | | | Full | | +| DELETE | /v1/events/trigger/{transactionId} | Cancel triggered event | 0.18.0 | | | | Full | | + +### Subscribers + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/subscribers | Get subscribers | 0.18.0 | | | | Full | | +| POST | /v1/subscribers | Create subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId} | Get subscriber | 0.18.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId} | Update subscriber | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId} | Delete subscriber | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/bulk | Bulk create subscribers | 0.19.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId}/credentials | Update subscriber credentials | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId}/credentials/{providerId} | Delete subscriber credentials by providerId | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/online-status | Update subscriber online status | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences | Get subscriber preferences | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences | Update subscriber global preferences | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences/{level} | Get subscriber preferences by level | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences/{templateId} | Update subscriber preference | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/feed | Get in-app notification feed for a particular subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/unseen | Get the unseen in-app notifications count for subscribers feed | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/markAs | Mark a subscriber feed message as seen | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/mark-all | Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed. | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} | Mark message action as seen | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback | Handle providers oauth redirect | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth | Handle chat oauth | 0.18.0 | | | | Full | | + +### Topics + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|----------------------------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/topics | Topic creation | 0.18.0 | | | | Full | | +| GET | /v1/topics | Filter topics | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers | Subscribers addition | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey}/subscribers/{externalSubscriberId} | Check topic subscriber | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers/removal | Subscribers removal | 0.18.0 | | | | Full | | +| DELETE | /v1/topics/{topicKey} | Delete topic | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey} | Get topic | 0.18.0 | | | | Full | | +| PATCH | /v1/topics/{topicKey} | Rename a topic | 0.18.0 | | | | Full | | + +### Notification + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|-----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/notifications | Get notifications | 0.18.0 | | | | Full | | +| GET | /v1/notifications/stats | Get notification statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/graph/stats | Get notification graph statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/{notificationId} | Get notification | 0.18.0 | | | | Full | | + +### Integrations + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-------------------------------------------------------|-----------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/integrations | Get integrations | 0.18.0 | | | | Full | | +| POST | /v1/integrations | Create integration | 0.18.0 | | | | Full | | +| GET | /v1/integrations/active | Get active integrations | 0.18.0 | | | | Full | | +| GET | /v1/integrations/webhook/provider/{providerId}/status | Get webhook support status for provider | 0.18.0 | | | | Full | | +| PUT | /v1/integrations/{integrationId} | Update integration | 0.18.0 | | | | Full | | +| DELETE | /v1/integrations/{integrationId} | Delete integration | 0.18.0 | | | | Full | | +| POST | /v1/integrations/{integrationId}/set-primary | Set integration as primary | 0.18.0 | | | | Full | | +| GET | /v1/integrations/{channelType}/limit | | 0.18.0 | | | | Full | | +| GET | /v1/integrations/in-app/status | | 0.18.0 | | | | Full | | + +### Layouts + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------|--------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/layouts | Layout creation | 0.18.0 | | | | Full | | +| GET | /v1/layouts | Filter layouts | 0.18.0 | | | | Full | | +| GET | /v1/layouts/{layoutId} | Get layout | 0.18.0 | | | | Full | | +| DELETE | /v1/layouts/{layoutId} | Delete layout | 0.18.0 | | | | Full | | +| PATCH | /v1/layouts/{layoutId} | Update a layout | 0.18.0 | | | | Full | | +| POST | /v1/layouts/{layoutId}/default | Set default layout | 0.18.0 | | | | Full | | + +### Workflows + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/workflows | Get workflows | 0.18.0 | | | | Full | | +| POST | /v1/workflows | Create workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId} | Update workflow | 0.18.0 | | | | Full | | +| DELETE | /v1/workflows/{workflowId} | Delete workflow | 0.18.0 | | | | Full | | +| GET | /v1/workflows/{workflowId} | Get workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId}/status | Update workflow status | 0.18.0 | | | | Full | | + +### Notification Templates + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/workflows | Get workflows | 0.18.0 | | | 0.18.0 | None | | +| POST | /v1/workflows | Create workflow | 0.18.0 | | | 0.18.0 | None | | +| PUT | /v1/workflows/{workflowId} | Update workflow | 0.18.0 | | | 0.18.0 | None | | +| DELETE | /v1/workflows/{workflowId} | Delete workflow | 0.18.0 | | | 0.18.0 | None | | +| GET | /v1/workflows/{workflowId} | Get workflow | 0.18.0 | | | 0.18.0 | None | | +| PUT | /v1/workflows/{workflowId}/status | Update workflow status | 0.18.0 | | | 0.18.0 | None | | + +### Workflow Groups + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/notification-groups | Create workflow group | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups | Get workflow groups | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups/{id} | Get workflow group | 0.18.0 | | | | Full | | +| PATCH | /v1/notification-groups/{id} | Update workflow group | 0.18.0 | | | | Full | | +| DELETE | /v1/notification-groups/{id} | Delete workflow group | 0.18.0 | | | | Full | | + +### Changes + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/changes | Get changes | 0.18.0 | | | | None | | +| GET | /v1/changes/count | Get changes count | 0.18.0 | | | | None | | +| POST | /v1/changes/bulk/apply | Apply changes | 0.18.0 | | | | None | | +| POST | /v1/changes/{changeId}/apply | Apply change | 0.18.0 | | | | None | | + +### Environments + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------|-------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/environments/me | Get current environment | 0.18.0 | | | | None | | +| POST | /v1/environments | Create environment | 0.18.0 | | | | None | | +| GET | /v1/environments | Get environments | 0.18.0 | | | | None | | +| PUT | /v1/environments{environmentId} | Update env by id | 0.18.0 | | | | None | | +| GET | /v1/environments/api-keys | Get api keys | 0.18.0 | | | | None | | +| POST | /v1/environments/api-keys/regenerate | Regenerate api keys | 0.18.0 | | | | None | | + +### Inbound Parse + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------|------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/inbound-parse/mx/status | Validate the mx record setup for the inbound parse functionality | 0.18.0 | | | | None | | + +### Feeds + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------|-------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/feeds | Create feed | 0.18.0 | | | | None | | +| GET | /v1/feeds | Get feeds | 0.18.0 | | | | None | | +| DELETE | /v1/feeds/{feedId} | Delete feed | 0.18.0 | | | | None | | + +### Tenants REMOVE IN 0.18.0 + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------|---------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/tenants | Get tenants | 0.18.0 | | | | None | | +| POST | /v1/tenants | Create tenant | 0.18.0 | | | | None | | +| GET | /v1/tenants/{identifier} | Get tenant | 0.18.0 | | | | None | | +| PATCH | /v1/tenants/{identifier} | Update tenant | 0.18.0 | | | | None | | +| DELETE | /v1/tenants/{identifier} | Delete tenant | 0.18.0 | | | | None | | + +### Messages + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------|----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/messages | Get messages | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/{messageId} | Delete message | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/transaction/{transactionId} | Delete messages by transactionId | 0.18.0 | | | | Full | | + +### Organizations (0.19.0) REMOVE IN 0.18.0 + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------------|--------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/organizations | Create an organization | 0.18.0 | | | | None | | +| GET | /v1/organizations | Fetch all organizations | 0.18.0 | | | | None | | +| PATCH | /v1/organizations | Rename organization name | 0.18.0 | | | | None | | +| GET | /v1/organizations/me | Fetch current organization details | 0.18.0 | | | | None | | +| DELETE | /v1/organizations/members/{memberId} | Remove a member from organization using memberId | 0.18.0 | | | | None | | +| PUT | /v1/organizations/members/{memberId}/roles | Update a member role to admin | 0.18.0 | | | | None | | +| GET | /v1/organizations/members | Fetch all members of current organizations | 0.18.0 | | | | None | | +| PUT | /v1/organizations/branding | Update organization branding details | 0.18.0 | | | | None | | + +### Execution Details + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/execution-details | Get execution details | 0.18.0 | | | | Full | | + +### Default (second GET REMOVE in 0.18.0) + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|----------------------------------|-------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/blueprints/group-by-category | | 0.18.0 | | | | Full | | +| GET | /v1/blueprints/list | | 0.19.0 | | | | Full | | +| GET | /v1/blueprints/{id} | | 0.18.0 | | | | Full | | diff --git a/specs/0.19.0/diff.ascidoc b/specs/0.19.0/diff.ascidoc new file mode 100644 index 0000000..450cd34 --- /dev/null +++ b/specs/0.19.0/diff.ascidoc @@ -0,0 +1,228 @@ += NOVU API (v 1.0) +:reproducible: +:sectlinks: +:toc: + +== What's Changed +=== GET /v1/layouts/{layoutId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PATCH /v1/layouts/{layoutId} +* Request: +** Changed application/json +** Schema: +Broken compatibility + +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/layouts +* Request: +** Changed application/json +** Schema: +Broken compatibility + +=== GET /v1/layouts +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/integrations +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/integrations +* Return Type: +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/integrations/active +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PUT /v1/integrations/{integrationId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== DELETE/v1/integrations/{integrationId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/integrations/{integrationId}/set-primary +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/events/trigger +* Request: +** Changed application/json +** Schema: +Backward compatible + +=== POST /v1/events/trigger/broadcast +* Request: +** Changed application/json +** Schema: +Backward compatible + +=== POST /v1/events/trigger/bulk +* Request: +** Changed application/json +** Schema: +Backward compatible + +=== GET /v1/notification-templates +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/notification-templates +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/notification-templates/{templateId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PUT /v1/notification-templates/{templateId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PUT /v1/notification-templates/{templateId}/status +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/workflows +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/workflows +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/workflows/{workflowId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PUT /v1/workflows/{workflowId} +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PUT /v1/workflows/{workflowId}/status +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/subscribers/{subscriberId}/notifications/feed +* Return Type: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/subscribers/{subscriberId}/messages/markAs +* Return Type: +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} +* Return Type: +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + + +WARNING: API changes broke backward compatibility diff --git a/specs/0.19.0/diff.html b/specs/0.19.0/diff.html new file mode 100644 index 0000000..33cab33 --- /dev/null +++ b/specs/0.19.0/diff.html @@ -0,0 +1 @@ +Api Change Log

Api Change Log

What's New


  1. POST/v1/subscribers/bulk Bulk create subscribers

What's Deleted


    What's Deprecated


      What's Changed


      1. GET/v1/layouts/{layoutId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      2. PATCH/v1/layouts/{layoutId}
        • Request

          • Schema incompatible

            Changed body: 'application/json'
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      3. POST/v1/layouts
        • Request

          • Schema incompatible

            Changed body: 'application/json'
      4. GET/v1/layouts
        • Response

          • Changed response : [200]//The list of layouts that match the criteria of the query params are successfully returned.
            • Schema

              Changed body: 'application/json'
      5. GET/v1/integrations
        • Response

          • Changed response : [200]//The list of integrations belonging to the organization that are successfully returned.
            • Schema

              Changed body: 'application/json'
      6. POST/v1/integrations
        • Response

          • Changed response : [201]//
            • Schema

              Changed body: 'application/json'
      7. GET/v1/integrations/active
        • Response

          • Changed response : [200]//The list of active integrations belonging to the organization that are successfully returned.
            • Schema

              Changed body: 'application/json'
      8. PUT/v1/integrations/{integrationId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      9. DELETE/v1/integrations/{integrationId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      10. POST/v1/integrations/{integrationId}/set-primary
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
          • Changed response : [201]//
            • Schema

              Changed body: 'application/json'
      11. POST/v1/events/trigger
        • Request

          • Schema

            Changed body: 'application/json'
      12. POST/v1/events/trigger/broadcast
        • Request

          • Schema

            Changed body: 'application/json'
      13. POST/v1/events/trigger/bulk
        • Request

          • Schema

            Changed body: 'application/json'
      14. GET/v1/notification-templates
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      15. POST/v1/notification-templates
        • Request

          • Schema

            Changed body: 'application/json'
        • Response

          • Changed response : [201]//
            • Schema

              Changed body: 'application/json'
      16. GET/v1/notification-templates/{templateId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      17. PUT/v1/notification-templates/{templateId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      18. PUT/v1/notification-templates/{templateId}/status
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      19. GET/v1/workflows
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      20. POST/v1/workflows
        • Request

          • Schema

            Changed body: 'application/json'
        • Response

          • Changed response : [201]//
            • Schema

              Changed body: 'application/json'
      21. GET/v1/workflows/{workflowId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      22. PUT/v1/workflows/{workflowId}
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      23. PUT/v1/workflows/{workflowId}/status
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      24. GET/v1/subscribers/{subscriberId}/notifications/feed
        • Response

          • Changed response : [200]//
            • Schema

              Changed body: 'application/json'
      25. POST/v1/subscribers/{subscriberId}/messages/markAs
        • Response

          • Changed response : [201]//
            • Schema

              Changed body: 'application/json'
      26. POST/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}
        • Response

          • Changed response : [201]//
            • Schema

              Changed body: 'application/json'
      \ No newline at end of file diff --git a/specs/0.19.0/diff.md b/specs/0.19.0/diff.md new file mode 100644 index 0000000..e68a608 --- /dev/null +++ b/specs/0.19.0/diff.md @@ -0,0 +1,446 @@ +#### What's New +--- + +##### `POST` /v1/subscribers/bulk + +> Bulk create subscribers + + +#### What's Changed +--- + +##### `GET` /v1/layouts/{layoutId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `identifier` + + * Added property `identifier` (string) + +##### `PATCH` /v1/layouts/{layoutId} + + +###### Request: + +Changed content type : `application/json` + +New required properties: +- `identifier` + +* Added property `identifier` (string) + > User defined custom key that will be a unique identifier for the Layout updated. + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `identifier` + + * Added property `identifier` (string) + +##### `POST` /v1/layouts + + +###### Request: + +Changed content type : `application/json` + +New required properties: +- `identifier` + +* Added property `identifier` (string) + > User defined custom key that will be a unique identifier for the Layout created. + + +##### `GET` /v1/layouts + + +###### Return Type: + +Changed response : **200 OK** +> The list of layouts that match the criteria of the query params are successfully returned. + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + New required properties: + - `identifier` + + * Added property `identifier` (string) + +##### `GET` /v1/integrations + + +###### Return Type: + +Changed response : **200 OK** +> The list of integrations belonging to the organization that are successfully returned. + + +* Changed content type : `application/json` + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +##### `POST` /v1/integrations + + +###### Return Type: + +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +##### `GET` /v1/integrations/active + + +###### Return Type: + +Changed response : **200 OK** +> The list of active integrations belonging to the organization that are successfully returned. + + +* Changed content type : `application/json` + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +##### `PUT` /v1/integrations/{integrationId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +##### `DELETE` /v1/integrations/{integrationId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +##### `POST` /v1/integrations/{integrationId}/set-primary + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +Changed response : **201 Created** + +* Changed content type : `application/json` + + New required properties: + - `primary` + + * Added property `primary` (boolean) + +##### `POST` /v1/events/trigger + + +###### Request: + +Changed content type : `application/json` + +* Added property `tenant` (object) + > It is used to specify a tenant context during trigger event. + > If a new tenant object is provided, we will create a new tenant. + + + One of: + + * Property `identifier` (string) + + * Property `name` (string) + + * Property `data` (object) + +* Changed property `to` (array) + > The recipients list of people who will receive the notification. + + + Changed items (array): + +##### `POST` /v1/events/trigger/broadcast + + +###### Request: + +Changed content type : `application/json` + +* Added property `tenant` (object) + > It is used to specify a tenant context during trigger event. + > If a new tenant object is provided, we will create a new tenant. + + +##### `POST` /v1/events/trigger/bulk + + +###### Request: + +Changed content type : `application/json` + +* Changed property `events` (array) + + Changed items (object): + + * Added property `tenant` (object) + > It is used to specify a tenant context during trigger event. + > If a new tenant object is provided, we will create a new tenant. + + + * Changed property `to` (array) + > The recipients list of people who will receive the notification. + + + Changed items (array): + +##### `GET` /v1/notification-templates + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `POST` /v1/notification-templates + + +###### Request: + +Changed content type : `application/json` + +* Changed property `description` (string) + +###### Return Type: + +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `GET` /v1/notification-templates/{templateId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `PUT` /v1/notification-templates/{templateId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `PUT` /v1/notification-templates/{templateId}/status + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `GET` /v1/workflows + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `POST` /v1/workflows + + +###### Request: + +Changed content type : `application/json` + +* Changed property `description` (string) + +###### Return Type: + +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `GET` /v1/workflows/{workflowId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `PUT` /v1/workflows/{workflowId} + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `PUT` /v1/workflows/{workflowId}/status + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `GET` /v1/subscribers/{subscriberId}/notifications/feed + + +###### Return Type: + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `template` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `POST` /v1/subscribers/{subscriberId}/messages/markAs + + +###### Return Type: + +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `template` (object) + + * Added property `workflowIntegrationStatus` (object) + +##### `POST` /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} + + +###### Return Type: + +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `template` (object) + + * Added property `workflowIntegrationStatus` (object) + diff --git a/specs/0.24.0/README.md b/specs/0.24.0/README.md new file mode 100644 index 0000000..4d549ae --- /dev/null +++ b/specs/0.24.0/README.md @@ -0,0 +1,280 @@ +## API + +* **Since:** 0.18.0 +* **Latest:** 0.24.0 + +**Tracking Versions**: `New`, `Changed`, `Deleted`, `Deprecated` + +* **New**: tracked since version +* **Changed**: has had changes on the endpoint attributes +* **Deleted**: was removed (obsolete) +* **Deprecated**: marked as being removed + +**Compatability**: `Full`, `Incomplete`, `None`, `Upgrade` + +* **Full**: all attributes are supported on the model on the method/endpoint call +* **None**: the method/endpoint is not implemented +* **Upgrade**: known changes to the attributes are required that are flagged (practically same as incomplete but + effectively a NEW placeholder) + +### Events + +Events represent a change in state of a subscriber. They are used to trigger workflows, and enable you to send +notifications to subscribers based on their actions. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/events/trigger | Trigger event | 0.18.0 | 0.19.0 | | | Upgrade | | +| POST | /v1/events/trigger/bulk | Bulk trigger event | 0.18.0 | | | | Full | | +| POST | /v1/events/trigger/broadcast | Broadcast event to all | 0.18.0 | | | | Full | | +| DELETE | /v1/events/trigger/{transactionId} | Cancel triggered event | 0.18.0 | | | | Full | | + +### Subscribers + +A subscriber in Novu represents someone who should receive a message. A subscriber’s profile information contains +important attributes about the subscriber that will be used in messages (name, email). The subscriber object can contain +other key-value pairs that can be used to further personalize your messages. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/subscribers | Get subscribers | 0.18.0 | | | | Full | | +| POST | /v1/subscribers | Create subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId} | Get subscriber | 0.18.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId} | Update subscriber | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId} | Delete subscriber | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/bulk | Bulk create subscribers | 0.19.0 | | | | Full | | +| PUT | /v1/subscribers/{subscriberId}/credentials | Update subscriber credentials | 0.18.0 | | | | Full | | +| DELETE | /v1/subscribers/{subscriberId}/credentials/{providerId} | Delete subscriber credentials by providerId | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/online-status | Update subscriber online status | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences | Get subscriber preferences | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences | Update subscriber global preferences | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/preferences/{level} | Get subscriber preferences by level | 0.18.0 | | | | Full | | +| PATCH | /v1/subscribers/{subscriberId}/preferences/{templateId} | Update subscriber preference | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/feed | Get in-app notification feed for a particular subscriber | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/notifications/unseen | Get the unseen in-app notifications count for subscribers feed | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/markAs | Mark a subscriber feed message as seen | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/mark-all | Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed. | 0.18.0 | | | | Full | | +| POST | /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} | Mark message action as seen | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback | Handle providers oauth redirect | 0.18.0 | | | | Full | | +| GET | /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth | Handle chat oauth | 0.18.0 | | | | Full | | + +### Topics + +Topics are a way to group subscribers together so that they can be notified of events at once. A topic is identified by +a custom key. This can be helpful for things like sending out marketing emails or notifying users of new features. +Topics can also be used to send notifications to the subscribers who have been grouped together based on their +interests, location, activities and much more. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|----------------------------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/topics | Topic creation | 0.18.0 | | | | Full | | +| GET | /v1/topics | Filter topics | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers | Subscribers addition | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey}/subscribers/{externalSubscriberId} | Check topic subscriber | 0.18.0 | | | | Full | | +| POST | /v1/topics/{topicKey}/subscribers/removal | Subscribers removal | 0.18.0 | | | | Full | | +| DELETE | /v1/topics/{topicKey} | Delete topic | 0.18.0 | | | | Full | | +| GET | /v1/topics/{topicKey} | Get topic | 0.18.0 | | | | Full | | +| PATCH | /v1/topics/{topicKey} | Rename a topic | 0.18.0 | | | | Full | | + +### Notification + +A notification conveys information from source to recipient, triggered by a workflow acting as a message blueprint. +Notifications can be individual or bundled as digest for user-friendliness. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------|-----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/notifications | Get notifications | 0.18.0 | | | | Full | | +| GET | /v1/notifications/stats | Get notification statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/graph/stats | Get notification graph statistics | 0.18.0 | | | | Full | | +| GET | /v1/notifications/{notificationId} | Get notification | 0.18.0 | | | | Full | | + +### Integrations + +With the help of the Integration Store, you can easily integrate your favorite delivery provider. During the runtime of +the API, the Integrations Store is responsible for storing the configurations of all the providers. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-------------------------------------------------------|-----------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/integrations | Get integrations | 0.18.0 | | | | Full | | +| POST | /v1/integrations | Create integration | 0.18.0 | | | | Full | | +| GET | /v1/integrations/active | Get active integrations | 0.18.0 | | | | Full | | +| GET | /v1/integrations/webhook/provider/{providerId}/status | Get webhook support status for provider | 0.18.0 | | | | Full | | +| PUT | /v1/integrations/{integrationId} | Update integration | 0.18.0 | | | | Full | | +| DELETE | /v1/integrations/{integrationId} | Delete integration | 0.18.0 | | | | Full | | +| POST | /v1/integrations/{integrationId}/set-primary | Set integration as primary | 0.18.0 | | | | Full | | +| GET | /v1/integrations/{channelType}/limit | | 0.18.0 | | 0.24.0 | | Removed | | +| GET | /v1/integrations/in-app/status | | 0.18.0 | | 0.24.0 | | Removed | | + +### Layouts + +Novu allows the creation of layouts - a specific HTML design or structure to wrap content of email notifications. +Layouts can be manipulated and assigned to new or existing workflows within the Novu platform, allowing users to create, +manage, and assign these layouts to workflows, so they can be reused to structure the appearance of notifications sent +through the platform. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------|--------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/layouts | Layout creation | 0.18.0 | | | | Full | | +| GET | /v1/layouts | Filter layouts | 0.18.0 | | | | Full | | +| GET | /v1/layouts/{layoutId} | Get layout | 0.18.0 | | | | Full | | +| DELETE | /v1/layouts/{layoutId} | Delete layout | 0.18.0 | | | | Full | | +| PATCH | /v1/layouts/{layoutId} | Update a layout | 0.18.0 | | | | Full | | +| POST | /v1/layouts/{layoutId}/default | Set default layout | 0.18.0 | | | | Full | | + +### Workflows + +All notifications are sent via a workflow. Each workflow acts as a container for the logic and blueprint that are +associated with a type of notification in your system. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/workflows | Get workflows | 0.18.0 | | | | Full | | +| POST | /v1/workflows | Create workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId} | Update workflow | 0.18.0 | | | | Full | | +| DELETE | /v1/workflows/{workflowId} | Delete workflow | 0.18.0 | | | | Full | | +| GET | /v1/workflows/{workflowId} | Get workflow | 0.18.0 | | | | Full | | +| PUT | /v1/workflows/{workflowId}/status | Update workflow status | 0.18.0 | | | | Full | | + +### Notification Templates + +Deprecated. Use Workflows (/workflows) instead, which provide the same functionality under a new name. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------|------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/notification-templates | Get workflows | 0.18.0 | | | 0.19.0 | Removed | | +| POST | /v1/notification-templates | Create workflow | 0.18.0 | | | 0.19.0 | Removed | | +| PUT | /v1/notification-templates/{templateId} | Update workflow | 0.18.0 | | | 0.19.0 | Removed | | +| DELETE | /v1/notification-templates/{templateId} | Delete workflow | 0.18.0 | | | 0.19.0 | Removed | | +| GET | /v1/notification-templates/{templateId} | Get workflow | 0.18.0 | | 0.24.0 | 0.19.0 | Removed | | +| PUT | /v1/notification-templates/{templateId}/status | Update workflow status | 0.18.0 | | 0.24.0 | 0.19.0 | Removed | | + +### Workflow Groups + +Workflow groups are used to organize workflows into logical groups. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/notification-groups | Create workflow group | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups | Get workflow groups | 0.18.0 | | | | Full | | +| GET | /v1/notification-groups/{id} | Get workflow group | 0.18.0 | | | | Full | | +| PATCH | /v1/notification-groups/{id} | Update workflow group | 0.18.0 | | | | Full | | +| DELETE | /v1/notification-groups/{id} | Delete workflow group | 0.18.0 | | | | Full | | + +### Changes + +Changes represent a change in state of an environment. They are analagous to a pending pull request in git, enabling you +to test changes before they are applied to your environment and atomically apply them when you are ready. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------|-------------------|--------|---------|---------|------------|---------------|-----------------------| +| GET | /v1/changes | Get changes | 0.18.0 | | | | Full | | +| GET | /v1/changes/count | Get changes count | 0.18.0 | | | | Full | | +| POST | /v1/changes/bulk/apply | Apply changes | 0.18.0 | | | | Full | Unsure how this works | +| POST | /v1/changes/{changeId}/apply | Apply change | 0.18.0 | | | | Full | Unsure how this works | + +### Environments + +Novu uses the concept of environments to ensure logical separation of your data and configuration. This means that +subscribers, and preferences created in one environment are never accessible to another. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------|-------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/environments/me | Get current environment | 0.18.0 | | | | Full | | +| POST | /v1/environments | Create environment | 0.18.0 | | 0.24.0 | ?? | None | | +| GET | /v1/environments | Get environments | 0.18.0 | | | | Full | | +| PUT | /v1/environments{environmentId} | Update env by id | 0.18.0 | | 0.24.0 | ?? | None | | +| GET | /v1/environments/api-keys | Get api keys | 0.18.0 | | | | Full | | +| POST | /v1/environments/api-keys/regenerate | Regenerate api keys | 0.18.0 | | | | Full | | + +### Inbound Parse + +Inbound Webhook is a feature that allows processing of incoming emails for a domain or subdomain. The feature parses the +contents of the email and POSTs the information to a specified URL in a multipart/form-data format. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------|------------------------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/inbound-parse/mx/status | Validate the mx record setup for the inbound parse functionality | 0.18.0 | | | | Full | | + +### Feeds + +Novu provides a notification activity feed that monitors every outgoing message associated with its relevant metadata. +This can be used to monitor activity and discover potential issues with a specific provider or a channel type. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------|-------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/feeds | Create feed | 0.18.0 | | | | Full | | +| GET | /v1/feeds | Get feeds | 0.18.0 | | | | Full | | +| DELETE | /v1/feeds/{feedId} | Delete feed | 0.18.0 | | | | Full | | + +### Tenants + +A tenant represents a group of users. As a developer, when your apps have organizations, they are referred to as +tenants. Tenants in Novu provides the ability to tailor specific notification experiences to users of different groups +or organizations. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------|---------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/tenants | Get tenants | 0.19.0 | | | | Full | | +| POST | /v1/tenants | Create tenant | 0.19.0 | | | | Full | | +| GET | /v1/tenants/{identifier} | Get tenant | 0.19.0 | | | | Full | | +| PATCH | /v1/tenants/{identifier} | Update tenant | 0.19.0 | | | | Full | | +| DELETE | /v1/tenants/{identifier} | Delete tenant | 0.19.0 | | | | Full | | + +### Messages + +A message in Novu represents a notification delivered to a recipient on a particular channel. Messages contain +information about the request that triggered its delivery, a view of the data sent to the recipient, and a timeline of +its lifecycle events. Learn more about messages. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------|----------------------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/messages | Get messages | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/{messageId} | Delete message | 0.18.0 | | | | Full | | +| DELETE | /v1/messages/transaction/{transactionId} | Delete messages by transactionId | 0.18.0 | | | | Full | | + +### Organizations + +An organization serves as a separate entity within your Novu account. Each organization you create has its own separate +integration store, workflows, subscribers, and API keys. This separation of resources allows you to manage multi-tenant +environments and separate domains within a single account. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|--------------------------------------------|--------------------------------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/organizations | Create an organization | 0.19.0 | | | | Full | | +| GET | /v1/organizations | Fetch all organizations | 0.19.0 | | | | Full | | +| PATCH | /v1/organizations | Rename organization name | 0.19.0 | | | | Full | | +| GET | /v1/organizations/me | Fetch current organization details | 0.19.0 | | | | Full | | +| DELETE | /v1/organizations/members/{memberId} | Remove a member from organization using memberId | 0.19.0 | | | | Full | | +| PUT | /v1/organizations/members/{memberId}/roles | Update a member role to admin | 0.19.0 | | ?? | | Removed | | +| GET | /v1/organizations/members | Fetch all members of current organizations | 0.19.0 | | | | Full | | +| PUT | /v1/organizations/branding | Update organization branding details | 0.19.0 | | | | Full | | + +### Execution Details + +Execution details are used to track the execution of a workflow. They provided detailed information on the execution of +a workflow, including the status of each step, the input and output of each step, and the overall status of the +execution. + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------|-----------------------|--------|---------|---------|------------|---------------|-------| +| GET | /v1/execution-details | Get execution details | 0.18.0 | | | | Full | | + +### Default + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|-----------------------------------------|-------------|--------|---------|---------|------------|---------------|------------------------------| +| GET | /v1/blueprints/group-by-category | | 0.19.0 | | | | Full | | +| GET | /v1/blueprints/list | | 0.19.0 | | 0.24.0 | | None | | +| GET | /v1/blueprints/{templateIdOrIdentifier} | | 0.19.0 | | | | Full | Throws 500 error on wrong id | + +### Workflow-Overrides + +| HTTP Method | Endpoint | Description | New | Changed | Deleted | Deprecated | Compatability | Notes | +|-------------|------------------------------------------------------------------|--------------------------------|--------|---------|---------|------------|---------------|-------| +| POST | /v1/workflow-overrides | Create a workflow override | 0.19.0 | | | | Full | | +| GET | /v1/workflow-overrides | Get workflow overrides | 0.19.0 | | | | Full | | +| PUT | /v1/workflow-overrides/{overrideId} | Update workflow by override id | 0.19.0 | | | | Full | | +| GET | /v1/workflow-overrides/{overrideId} | Get workflow override by id | 0.19.0 | | | | Full | | +| DELETE | /v1/workflow-overrides/{overrideId} | Delete workflow override | 0.19.0 | | | | Full | | +| PUT | /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} | Update workflow override | 0.19.0 | | | | Full | | +| GET | /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} | Get workflow override | 0.19.0 | | | | Full | | diff --git a/specs/0.24.0/diff.ascidoc b/specs/0.24.0/diff.ascidoc new file mode 100644 index 0000000..4050c7f --- /dev/null +++ b/specs/0.24.0/diff.ascidoc @@ -0,0 +1,860 @@ += NOVU API (v 1.0) +:reproducible: +:sectlinks: +:toc: + +== What's Changed +=== POST /v1/layouts/{layoutId}/default +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 204 No Content +** Media types: +** Changed 404 Not Found +** Media types: + +=== GET /v1/integrations/active +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (object -> array) + + +=== GET /v1/integrations/webhook/provider/{providerId}/status +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== DELETE/v1/subscribers/{subscriberId}/credentials/{providerId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 204 No Content +** Media types: + +=== GET /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== GET /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== GET /v1/inbound-parse/mx/status +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/environments/me +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Missing property: data.apiKeys[n].key (string) + +*** Missing property: data.apiKeys[n]._userId (string) + + +=== GET /v1/environments +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Missing property: data[n].apiKeys[n].key (string) + +*** Missing property: data[n].apiKeys[n]._userId (string) + + +=== GET /v1/environments/api-keys +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== POST /v1/environments/api-keys/regenerate +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: + +=== GET /v1/notification-groups +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== POST /v1/notification-groups +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: + +=== GET /v1/notification-groups/{id} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== DELETE/v1/notification-groups/{id} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== PATCH /v1/notification-groups/{id} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/changes/count +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== POST /v1/changes/bulk/apply +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/changes/{changeId}/apply +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== DELETE/v1/layouts/{layoutId} +* Return Type: +** Add 429 null +** Add 503 Service Unavailable +** Changed 204 No Content +** Media types: +** Changed 404 Not Found +** Media types: +** Changed 409 Conflict +** Media types: +*** Added application/json + +=== GET /v1/layouts/{layoutId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 404 Not Found +** Media types: +** Changed 200 OK +** Media types: + +=== PATCH /v1/layouts/{layoutId} +* Return Type: +** Add 429 null +** Add 503 Service Unavailable +** Changed 400 Bad Request +** Media types: +** Changed 404 Not Found +** Media types: +** Changed 409 Conflict +** Media types: +*** Added application/json +** Changed 200 OK +** Media types: + +=== GET /v1/execution-details +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== DELETE/v1/events/trigger/{transactionId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/subscribers/{subscriberId}/preferences +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PATCH /v1/subscribers/{subscriberId}/preferences/{templateId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/subscribers/{subscriberId}/notifications/unseen +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== POST /v1/subscribers/{subscriberId}/messages/mark-all +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== POST /v1/topics/{topicKey}/subscribers +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 204 No Content +** Media types: + +=== GET /v1/topics/{topicKey}/subscribers/{externalSubscriberId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== POST /v1/topics/{topicKey}/subscribers/removal +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 204 No Content +** Media types: + +=== DELETE/v1/topics/{topicKey} +* Return Type: +** Add 429 null +** Add 503 Service Unavailable +** Changed 204 No Content +** Media types: +** Changed 404 Not Found +** Media types: +** Changed 409 Conflict +** Media types: +*** Added application/json + +=== GET /v1/topics/{topicKey} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== PATCH /v1/topics/{topicKey} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/notifications/stats +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/notifications/graph/stats +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/feeds +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== POST /v1/feeds +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: + +=== DELETE/v1/feeds/{feedId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== DELETE/v1/messages/{messageId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/changes +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/layouts +* Request: +** Deleted application/json + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: + +=== GET /v1/layouts +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 400 Bad Request +** Media types: +** Changed 200 OK +** Media types: + +=== GET /v1/integrations +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (object -> array) + + +=== POST /v1/integrations +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== PUT /v1/integrations/{integrationId} +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 404 Not Found +** Media types: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== DELETE/v1/integrations/{integrationId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/integrations/{integrationId}/set-primary +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 404 Not Found +** Media types: +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/events/trigger +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/events/trigger/broadcast +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/subscribers +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/subscribers +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== DELETE/v1/subscribers/{subscriberId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/subscribers/{subscriberId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PUT /v1/subscribers/{subscriberId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/subscribers/bulk +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== PUT /v1/subscribers/{subscriberId}/credentials +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PATCH /v1/subscribers/{subscriberId}/online-status +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/topics +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: + +=== GET /v1/topics +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== GET /v1/blueprints/group-by-category +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== GET /v1/blueprints/{templateId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable + +=== POST /v1/events/trigger/bulk +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/notification-templates +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/notification-templates +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== DELETE/v1/notification-templates/{templateId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== PUT /v1/notification-templates/{templateId} +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PUT /v1/notification-templates/{templateId}/status +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/workflows +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Missing property: data._id (string) + +*** Missing property: data.name (string) + +*** Missing property: data.description (string) + +*** Missing property: data.active (boolean) + +*** Missing property: data.draft (boolean) + +*** Missing property: data.preferenceSettings (object) + +*** Missing property: data.critical (boolean) + +*** Missing property: data.tags (array) + +*** Missing property: data.steps (array) + +*** Missing property: data._organizationId (string) + +*** Missing property: data._creatorId (string) + +*** Missing property: data._environmentId (string) + +*** Missing property: data.triggers (array) + +*** Missing property: data._notificationGroupId (string) + +*** Missing property: data._parentId (string) + +*** Missing property: data.deleted (boolean) + +*** Missing property: data.deletedAt (string) + +*** Missing property: data.deletedBy (string) + +*** Missing property: data.notificationGroup (object) + +*** Missing property: data.workflowIntegrationStatus (object) + +*** Changed property type: data.data (object -> array) + + +=== POST /v1/workflows +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== DELETE/v1/workflows/{workflowId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: + +=== PUT /v1/workflows/{workflowId} +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PUT /v1/workflows/{workflowId}/status +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/subscribers/{subscriberId}/notifications/feed +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/subscribers/{subscriberId}/messages/markAs +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/notifications/{notificationId} +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/notifications +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/messages +* Return Type: +** Add 409 Conflict +** Add 429 null +** Add 503 Service Unavailable +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + + +WARNING: API changes broke backward compatibility diff --git a/specs/0.24.0/diff.html b/specs/0.24.0/diff.html new file mode 100644 index 0000000..7c88eb3 --- /dev/null +++ b/specs/0.24.0/diff.html @@ -0,0 +1 @@ +Api Change Log

      Api Change Log

      What's New


      1. GET/v1/organizations Fetch all organizations
      2. POST/v1/organizations Create an organization
      3. PATCH/v1/organizations Rename organization name
      4. GET/v1/organizations/me Fetch current organization details
      5. DELETE/v1/organizations/members/{memberId} Remove a member from organization using memberId
      6. GET/v1/organizations/members Fetch all members of current organizations
      7. PUT/v1/organizations/branding Update organization branding details
      8. GET/v1/notification-templates/{workflowIdOrIdentifier} Get Notification template
      9. GET/v1/workflows/variables Get available variables
      10. GET/v1/workflows/{workflowIdOrIdentifier} Get workflow
      11. GET/v1/subscribers/{subscriberId}/preferences/{level} Get subscriber preferences by level
      12. GET/v1/tenants Get tenants
      13. POST/v1/tenants Create tenant
      14. GET/v1/tenants/{identifier} Get tenant
      15. DELETE/v1/tenants/{identifier} Delete tenant
      16. PATCH/v1/tenants/{identifier} Update tenant
      17. DELETE/v1/messages/transaction/{transactionId} Delete messages by transactionId
      18. GET/v1/workflow-overrides Get workflow overrides
      19. POST/v1/workflow-overrides Create workflow override
      20. GET/v1/workflow-overrides/{overrideId} Get workflow override by id
      21. PUT/v1/workflow-overrides/{overrideId} Update workflow override by id
      22. DELETE/v1/workflow-overrides/{overrideId} Delete workflow override
      23. GET/v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} Get workflow override
      24. PUT/v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} Update workflow override
      25. PATCH/v1/subscribers/{subscriberId}/preferences Update subscriber global preferences
      26. PATCH/v1/subscribers/{subscriberId}/credentials Modify subscriber credentials

      What's Deleted


      1. PUT/v1/environments/{environmentId} Update env by id
      2. GET/v1/integrations/{channelType}/limit null
      3. GET/v1/integrations/in-app/status null
      4. POST/v1/environments Create environment
      5. GET/v1/notification-templates/{templateId} Get Notification template
      6. GET/v1/workflows/{workflowId} Get workflow

      What's Deprecated


        What's Changed


        1. POST/v1/layouts/{layoutId}/default
          • Response

            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
            • New response : [429]//The client has sent too many requests in a given amount of time.
            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
            • Changed response : [204]//The selected layout has been set as the default for the environment.
              • Changed response : [404]//The layout with the layoutId provided does not exist in the database so it can not be set as the default for the environment.
            • GET/v1/integrations/active
              • Response

                • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                • New response : [429]//The client has sent too many requests in a given amount of time.
                • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                • Changed response : [200]//The list of active integrations belonging to the organization that are successfully returned.
                  • Schema incompatible

                    Changed body: 'application/json'

                    Changed property type: (object -> array)

            • GET/v1/integrations/webhook/provider/{providerId}/status
              • Response

                • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                • New response : [429]//The client has sent too many requests in a given amount of time.
                • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                • Changed response : [200]//The status of the webhook for the provider requested
              • DELETE/v1/subscribers/{subscriberId}/credentials/{providerId}
                • Response

                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                  • New response : [429]//The client has sent too many requests in a given amount of time.
                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                  • Changed response : [204]//
                • GET/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback
                  • Response

                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                    • New response : [429]//The client has sent too many requests in a given amount of time.
                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                • GET/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth
                  • Response

                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                    • New response : [429]//The client has sent too many requests in a given amount of time.
                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                • GET/v1/inbound-parse/mx/status
                  • Response

                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                    • New response : [429]//The client has sent too many requests in a given amount of time.
                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                    • Changed response : [200]//Ok
                  • GET/v1/environments/me
                    • Response

                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                      • New response : [429]//The client has sent too many requests in a given amount of time.
                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                      • Changed response : [200]//Ok
                        • Schema incompatible

                          Changed body: 'application/json'

                          Missing property: data.apiKeys[n].key (string)

                          Missing property: data.apiKeys[n]._userId (string)

                  • GET/v1/environments
                    • Response

                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                      • New response : [429]//The client has sent too many requests in a given amount of time.
                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                      • Changed response : [200]//Ok
                        • Schema incompatible

                          Changed body: 'application/json'

                          Missing property: data[n].apiKeys[n].key (string)

                          Missing property: data[n].apiKeys[n]._userId (string)

                  • GET/v1/environments/api-keys
                    • Response

                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                      • New response : [429]//The client has sent too many requests in a given amount of time.
                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                      • Changed response : [200]//Ok
                    • POST/v1/environments/api-keys/regenerate
                      • Response

                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                        • New response : [429]//The client has sent too many requests in a given amount of time.
                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                        • Changed response : [201]//Created
                      • GET/v1/notification-groups
                        • Response

                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                          • New response : [429]//The client has sent too many requests in a given amount of time.
                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                          • Changed response : [200]//Ok
                        • POST/v1/notification-groups
                          • Response

                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                            • New response : [429]//The client has sent too many requests in a given amount of time.
                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                            • Changed response : [201]//Created
                          • GET/v1/notification-groups/{id}
                            • Response

                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                              • New response : [429]//The client has sent too many requests in a given amount of time.
                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                              • Changed response : [200]//Ok
                            • DELETE/v1/notification-groups/{id}
                              • Response

                                • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                • New response : [429]//The client has sent too many requests in a given amount of time.
                                • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                • Changed response : [200]//Ok
                              • PATCH/v1/notification-groups/{id}
                                • Response

                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                  • Changed response : [200]//Ok
                                • GET/v1/changes/count
                                  • Response

                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                    • Changed response : [200]//
                                  • POST/v1/changes/bulk/apply
                                    • Response

                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                      • Changed response : [201]//Created
                                        • Schema incompatible

                                          Changed body: 'application/json'
                                  • POST/v1/changes/{changeId}/apply
                                    • Response

                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                      • Changed response : [201]//Created
                                        • Schema incompatible

                                          Changed body: 'application/json'
                                  • DELETE/v1/layouts/{layoutId}
                                    • Response

                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                      • Changed response : [204]//The layout has been deleted correctly
                                        • Changed response : [404]//The layout with the layoutId provided does not exist in the database so it can not be deleted.
                                          • Changed response : [409]//Either you are trying to delete a layout that is being used or a layout that is the default in the environment.
                                            • New body: 'application/json'
                                      • GET/v1/layouts/{layoutId}
                                        • Response

                                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                          • New response : [429]//The client has sent too many requests in a given amount of time.
                                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                          • Changed response : [404]//The layout with the layoutId provided does not exist in the database.
                                            • Changed response : [200]//Ok
                                          • PATCH/v1/layouts/{layoutId}
                                            • Response

                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                              • Changed response : [400]//The payload provided or the URL param are not right.
                                                • Changed response : [404]//The layout with the layoutId provided does not exist in the database so it can not be updated.
                                                  • Changed response : [409]//One default layout is needed. If you are trying to turn a default layout as not default, you should turn a different layout as default first and automatically it will be done by the system.
                                                    • New body: 'application/json'
                                                  • Changed response : [200]//Ok
                                                • GET/v1/execution-details
                                                  • Response

                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                    • Changed response : [200]//Ok
                                                  • DELETE/v1/events/trigger/{transactionId}
                                                    • Response

                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                      • Changed response : [200]//
                                                    • GET/v1/subscribers/{subscriberId}/preferences
                                                      • Response

                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                        • Changed response : [200]//Ok
                                                          • Schema

                                                            Changed body: 'application/json'
                                                    • PATCH/v1/subscribers/{subscriberId}/preferences/{templateId}
                                                      • Response

                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                        • Changed response : [200]//Ok
                                                          • Schema

                                                            Changed body: 'application/json'
                                                    • GET/v1/subscribers/{subscriberId}/notifications/unseen
                                                      • Response

                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                        • Changed response : [200]//Ok
                                                      • POST/v1/subscribers/{subscriberId}/messages/mark-all
                                                        • Response

                                                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                          • New response : [429]//The client has sent too many requests in a given amount of time.
                                                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                      • POST/v1/topics/{topicKey}/subscribers
                                                        • Response

                                                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                          • New response : [429]//The client has sent too many requests in a given amount of time.
                                                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                          • Changed response : [204]//
                                                        • GET/v1/topics/{topicKey}/subscribers/{externalSubscriberId}
                                                          • Response

                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                        • POST/v1/topics/{topicKey}/subscribers/removal
                                                          • Response

                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                            • Changed response : [204]//
                                                          • DELETE/v1/topics/{topicKey}
                                                            • Response

                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                              • Changed response : [204]//The topic has been deleted correctly
                                                                • Changed response : [404]//The topic with the key provided does not exist in the database so it can not be deleted.
                                                                  • Changed response : [409]//The topic you are trying to delete has subscribers assigned to it. Delete the subscribers before deleting the topic.
                                                                    • New body: 'application/json'
                                                              • GET/v1/topics/{topicKey}
                                                                • Response

                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                  • Changed response : [200]//Ok
                                                                • PATCH/v1/topics/{topicKey}
                                                                  • Response

                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                    • Changed response : [200]//Ok
                                                                  • GET/v1/notifications/stats
                                                                    • Response

                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                      • Changed response : [200]//Ok
                                                                    • GET/v1/notifications/graph/stats
                                                                      • Response

                                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                        • Changed response : [200]//Ok
                                                                      • GET/v1/feeds
                                                                        • Response

                                                                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                          • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                          • Changed response : [200]//Ok
                                                                        • POST/v1/feeds
                                                                          • Response

                                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                            • Changed response : [201]//Created
                                                                          • DELETE/v1/feeds/{feedId}
                                                                            • Response

                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                              • Changed response : [200]//Ok
                                                                            • DELETE/v1/messages/{messageId}
                                                                              • Response

                                                                                • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                • Changed response : [200]//Ok
                                                                              • GET/v1/changes
                                                                                • Response

                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                  • Changed response : [200]//
                                                                                    • Schema incompatible

                                                                                      Changed body: 'application/json'
                                                                              • POST/v1/layouts
                                                                                • Request

                                                                                  • Deleted body: 'application/json'
                                                                                • Response

                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                  • Changed response : [201]//Created
                                                                                • GET/v1/layouts
                                                                                  • Response

                                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                    • Changed response : [400]//Page size can not be larger than the page size limit.
                                                                                      • Changed response : [200]//The list of layouts that match the criteria of the query params are successfully returned.
                                                                                    • GET/v1/integrations
                                                                                      • Response

                                                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                        • Changed response : [200]//The list of integrations belonging to the organization that are successfully returned.
                                                                                          • Schema incompatible

                                                                                            Changed body: 'application/json'

                                                                                            Changed property type: (object -> array)

                                                                                    • POST/v1/integrations
                                                                                      • Request

                                                                                        • Schema

                                                                                          Changed body: 'application/json'
                                                                                      • Response

                                                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                        • Changed response : [201]//Created
                                                                                          • Schema

                                                                                            Changed body: 'application/json'
                                                                                    • PUT/v1/integrations/{integrationId}
                                                                                      • Request

                                                                                        • Schema

                                                                                          Changed body: 'application/json'
                                                                                      • Response

                                                                                        • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                        • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                        • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                        • Changed response : [404]//The integration with the integrationId provided does not exist in the database.
                                                                                          • Changed response : [200]//Ok
                                                                                            • Schema

                                                                                              Changed body: 'application/json'
                                                                                      • DELETE/v1/integrations/{integrationId}
                                                                                        • Response

                                                                                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                          • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                          • Changed response : [200]//Ok
                                                                                            • Schema

                                                                                              Changed body: 'application/json'
                                                                                      • POST/v1/integrations/{integrationId}/set-primary
                                                                                        • Response

                                                                                          • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                          • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                          • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                          • Changed response : [404]//The integration with the integrationId provided does not exist in the database.
                                                                                            • Changed response : [200]//Ok
                                                                                              • Schema

                                                                                                Changed body: 'application/json'
                                                                                            • Changed response : [201]//
                                                                                              • Schema

                                                                                                Changed body: 'application/json'
                                                                                        • POST/v1/events/trigger
                                                                                          • Response

                                                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                            • Changed response : [201]//Created
                                                                                              • Schema incompatible

                                                                                                Changed body: 'application/json'
                                                                                        • POST/v1/events/trigger/broadcast
                                                                                          • Response

                                                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                            • Changed response : [200]//Ok
                                                                                              • Schema incompatible

                                                                                                Changed body: 'application/json'
                                                                                            • Changed response : [201]//
                                                                                              • Schema incompatible

                                                                                                Changed body: 'application/json'
                                                                                        • GET/v1/subscribers
                                                                                          • Response

                                                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                            • Changed response : [200]//
                                                                                              • Schema incompatible

                                                                                                Changed body: 'application/json'
                                                                                        • POST/v1/subscribers
                                                                                          • Response

                                                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                            • Changed response : [201]//Created
                                                                                              • Schema incompatible

                                                                                                Changed body: 'application/json'
                                                                                        • DELETE/v1/subscribers/{subscriberId}
                                                                                          • Response

                                                                                            • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                            • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                            • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                            • Changed response : [200]//Ok
                                                                                          • GET/v1/subscribers/{subscriberId}
                                                                                            • Response

                                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • Changed response : [200]//Ok
                                                                                                • Schema incompatible

                                                                                                  Changed body: 'application/json'
                                                                                          • PUT/v1/subscribers/{subscriberId}
                                                                                            • Response

                                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • Changed response : [200]//Ok
                                                                                                • Schema incompatible

                                                                                                  Changed body: 'application/json'
                                                                                          • POST/v1/subscribers/bulk
                                                                                            • Response

                                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                          • PUT/v1/subscribers/{subscriberId}/credentials
                                                                                            • Request

                                                                                              • Schema

                                                                                                Changed body: 'application/json'
                                                                                            • Response

                                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • Changed response : [200]//Ok
                                                                                                • Schema incompatible

                                                                                                  Changed body: 'application/json'
                                                                                          • PATCH/v1/subscribers/{subscriberId}/online-status
                                                                                            • Response

                                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • Changed response : [200]//Ok
                                                                                                • Schema incompatible

                                                                                                  Changed body: 'application/json'
                                                                                          • POST/v1/topics
                                                                                            • Response

                                                                                              • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                              • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                              • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • Changed response : [201]//Created
                                                                                            • GET/v1/topics
                                                                                              • Response

                                                                                                • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                • Changed response : [200]//
                                                                                              • GET/v1/blueprints/group-by-category
                                                                                                • Response

                                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • GET/v1/blueprints/{templateId}
                                                                                                • Response

                                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                              • POST/v1/events/trigger/bulk
                                                                                                • Response

                                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                  • Changed response : [201]//Created
                                                                                                    • Schema incompatible

                                                                                                      Changed body: 'application/json'
                                                                                              • GET/v1/notification-templates
                                                                                                • Response

                                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                  • Changed response : [200]//Ok
                                                                                                    • Schema incompatible

                                                                                                      Changed body: 'application/json'
                                                                                              • POST/v1/notification-templates
                                                                                                • Request

                                                                                                  • Schema

                                                                                                    Changed body: 'application/json'
                                                                                                • Response

                                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                  • Changed response : [201]//Created
                                                                                                    • Schema incompatible

                                                                                                      Changed body: 'application/json'
                                                                                              • DELETE/v1/notification-templates/{templateId}
                                                                                                • Response

                                                                                                  • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                  • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                  • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                  • Changed response : [200]//
                                                                                                • PUT/v1/notification-templates/{templateId}
                                                                                                  • Request

                                                                                                    • Schema

                                                                                                      Changed body: 'application/json'
                                                                                                  • Response

                                                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                    • Changed response : [200]//Ok
                                                                                                      • Schema incompatible

                                                                                                        Changed body: 'application/json'
                                                                                                • PUT/v1/notification-templates/{templateId}/status
                                                                                                  • Response

                                                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                    • Changed response : [200]//Ok
                                                                                                      • Schema incompatible

                                                                                                        Changed body: 'application/json'
                                                                                                • GET/v1/workflows
                                                                                                  • Response

                                                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                    • Changed response : [200]//Ok
                                                                                                      • Schema incompatible

                                                                                                        Changed body: 'application/json'

                                                                                                        Missing property: data._id (string)

                                                                                                        Missing property: data.name (string)

                                                                                                        Missing property: data.description (string)

                                                                                                        Missing property: data.active (boolean)

                                                                                                        Missing property: data.draft (boolean)

                                                                                                        Missing property: data.preferenceSettings (object)

                                                                                                        Missing property: data.critical (boolean)

                                                                                                        Missing property: data.tags (array)

                                                                                                        Missing property: data.steps (array)

                                                                                                        Missing property: data._organizationId (string)

                                                                                                        Missing property: data._creatorId (string)

                                                                                                        Missing property: data._environmentId (string)

                                                                                                        Missing property: data.triggers (array)

                                                                                                        Missing property: data._notificationGroupId (string)

                                                                                                        Missing property: data._parentId (string)

                                                                                                        Missing property: data.deleted (boolean)

                                                                                                        Missing property: data.deletedAt (string)

                                                                                                        Missing property: data.deletedBy (string)

                                                                                                        Missing property: data.notificationGroup (object)

                                                                                                        Missing property: data.workflowIntegrationStatus (object)

                                                                                                        Changed property type: data.data (object -> array)

                                                                                                • POST/v1/workflows
                                                                                                  • Request

                                                                                                    • Schema

                                                                                                      Changed body: 'application/json'
                                                                                                  • Response

                                                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                    • Changed response : [201]//Created
                                                                                                      • Schema incompatible

                                                                                                        Changed body: 'application/json'
                                                                                                • DELETE/v1/workflows/{workflowId}
                                                                                                  • Response

                                                                                                    • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                    • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                    • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                    • Changed response : [200]//
                                                                                                  • PUT/v1/workflows/{workflowId}
                                                                                                    • Request

                                                                                                      • Schema

                                                                                                        Changed body: 'application/json'
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [200]//Ok
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • PUT/v1/workflows/{workflowId}/status
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [200]//Ok
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • GET/v1/subscribers/{subscriberId}/notifications/feed
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [200]//
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • POST/v1/subscribers/{subscriberId}/messages/markAs
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [201]//Created
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • POST/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [201]//Created
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • GET/v1/notifications/{notificationId}
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [200]//Ok
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • GET/v1/notifications
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [200]//
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  • GET/v1/messages
                                                                                                    • Response

                                                                                                      • New response : [409]//The request could not be completed due to a conflict with the current state of the target resource.
                                                                                                      • New response : [429]//The client has sent too many requests in a given amount of time.
                                                                                                      • New response : [503]//The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.
                                                                                                      • Changed response : [200]//
                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'
                                                                                                  \ No newline at end of file diff --git a/specs/0.24.0/diff.md b/specs/0.24.0/diff.md new file mode 100644 index 0000000..c876923 --- /dev/null +++ b/specs/0.24.0/diff.md @@ -0,0 +1,4718 @@ +#### What's New +--- + +##### `GET` /v1/organizations + +> Fetch all organizations + + +##### `POST` /v1/organizations + +> Create an organization + + +##### `PATCH` /v1/organizations + +> Rename organization name + + +##### `GET` /v1/organizations/me + +> Fetch current organization details + + +##### `DELETE` /v1/organizations/members/{memberId} + +> Remove a member from organization using memberId + + +##### `GET` /v1/organizations/members + +> Fetch all members of current organizations + + +##### `PUT` /v1/organizations/branding + +> Update organization branding details + + +##### `GET` /v1/notification-templates/{workflowIdOrIdentifier} + +> Get Notification template + + +##### `GET` /v1/workflows/variables + +> Get available variables + + +##### `GET` /v1/workflows/{workflowIdOrIdentifier} + +> Get workflow + + +##### `GET` /v1/subscribers/{subscriberId}/preferences/{level} + +> Get subscriber preferences by level + + +##### `GET` /v1/tenants + +> Get tenants + + +##### `POST` /v1/tenants + +> Create tenant + + +##### `GET` /v1/tenants/{identifier} + +> Get tenant + + +##### `DELETE` /v1/tenants/{identifier} + +> Delete tenant + + +##### `PATCH` /v1/tenants/{identifier} + +> Update tenant + + +##### `DELETE` /v1/messages/transaction/{transactionId} + +> Delete messages by transactionId + + +##### `GET` /v1/workflow-overrides + +> Get workflow overrides + + +##### `POST` /v1/workflow-overrides + +> Create workflow override + + +##### `GET` /v1/workflow-overrides/{overrideId} + +> Get workflow override by id + + +##### `PUT` /v1/workflow-overrides/{overrideId} + +> Update workflow override by id + + +##### `DELETE` /v1/workflow-overrides/{overrideId} + +> Delete workflow override + + +##### `GET` /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} + +> Get workflow override + + +##### `PUT` /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} + +> Update workflow override + + +##### `PATCH` /v1/subscribers/{subscriberId}/preferences + +> Update subscriber global preferences + + +##### `PATCH` /v1/subscribers/{subscriberId}/credentials + +> Modify subscriber credentials + + +#### What's Deleted +--- + +##### `PUT` /v1/environments/{environmentId} + +> Update env by id + + +##### `GET` /v1/integrations/{channelType}/limit + + +##### `GET` /v1/integrations/in-app/status + + +##### `POST` /v1/environments + +> Create environment + + +##### `GET` /v1/notification-templates/{templateId} + +> Get Notification template + + +##### `GET` /v1/workflows/{workflowId} + +> Get workflow + + +#### What's Changed +--- + +##### `POST` /v1/layouts/{layoutId}/default + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **204 No Content** +> The selected layout has been set as the default for the environment. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **404 Not Found** +> The layout with the layoutId provided does not exist in the database so it can not be set as the default for the environment. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/integrations/active + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> The list of active integrations belonging to the organization that are successfully returned. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + +##### `GET` /v1/integrations/webhook/provider/{providerId}/status + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> The status of the webhook for the provider requested + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `DELETE` /v1/subscribers/{subscriberId}/credentials/{providerId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **204 No Content** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `GET` /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `GET` /v1/inbound-parse/mx/status + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/environments/me + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New optional properties: + - `apiKeys` + + * Changed property `apiKeys` (array) + + Changed items (object): + + New optional properties: + - `_userId` + - `key` + + * Deleted property `key` (string) + + * Deleted property `_userId` (string) + +##### `GET` /v1/environments + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + New optional properties: + - `apiKeys` + + * Changed property `apiKeys` (array) + + Changed items (object): + + New optional properties: + - `_userId` + - `key` + + * Deleted property `key` (string) + + * Deleted property `_userId` (string) + +##### `GET` /v1/environments/api-keys + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `POST` /v1/environments/api-keys/regenerate + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/notification-groups + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `POST` /v1/notification-groups + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/notification-groups/{id} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `DELETE` /v1/notification-groups/{id} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `PATCH` /v1/notification-groups/{id} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/changes/count + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `POST` /v1/changes/bulk/apply + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum values: + + * `TranslationGroup` + * `Translation` +##### `POST` /v1/changes/{changeId}/apply + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum values: + + * `TranslationGroup` + * `Translation` +##### `DELETE` /v1/layouts/{layoutId} + + +###### Return Type: + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **204 No Content** +> The layout has been deleted correctly + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **404 Not Found** +> The layout with the layoutId provided does not exist in the database so it can not be deleted. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **409 Conflict** +> Either you are trying to delete a layout that is being used or a layout that is the default in the environment. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* New content type : `application/json` + +##### `GET` /v1/layouts/{layoutId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **404 Not Found** +> The layout with the layoutId provided does not exist in the database. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `PATCH` /v1/layouts/{layoutId} + + +###### Return Type: + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **400 Bad Request** +> The payload provided or the URL param are not right. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **404 Not Found** +> The layout with the layoutId provided does not exist in the database so it can not be updated. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **409 Conflict** +> One default layout is needed. If you are trying to turn a default layout as not default, you should turn a different layout as default first and automatically it will be done by the system. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* New content type : `application/json` + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/execution-details + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `DELETE` /v1/events/trigger/{transactionId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/subscribers/{subscriberId}/preferences + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `template` (object) + > The workflow information and if it is critical or not + + + New required properties: + - `triggers` + + * Added property `triggers` (array) + > Triggers are the events that will trigger the workflow. + + + Items (string): + +##### `PATCH` /v1/subscribers/{subscriberId}/preferences/{templateId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `template` (object) + > The workflow information and if it is critical or not + + + New required properties: + - `triggers` + + * Added property `triggers` (array) + > Triggers are the events that will trigger the workflow. + + +##### `GET` /v1/subscribers/{subscriberId}/notifications/unseen + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `POST` /v1/subscribers/{subscriberId}/messages/mark-all + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `POST` /v1/topics/{topicKey}/subscribers + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **204 No Content** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/topics/{topicKey}/subscribers/{externalSubscriberId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `POST` /v1/topics/{topicKey}/subscribers/removal + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **204 No Content** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `DELETE` /v1/topics/{topicKey} + + +###### Return Type: + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **204 No Content** +> The topic has been deleted correctly + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **404 Not Found** +> The topic with the key provided does not exist in the database so it can not be deleted. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **409 Conflict** +> The topic you are trying to delete has subscribers assigned to it. Delete the subscribers before deleting the topic. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* New content type : `application/json` + +##### `GET` /v1/topics/{topicKey} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `PATCH` /v1/topics/{topicKey} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/notifications/stats + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/notifications/graph/stats + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/feeds + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `POST` /v1/feeds + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `DELETE` /v1/feeds/{feedId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `DELETE` /v1/messages/{messageId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/changes + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum values: + + * `TranslationGroup` + * `Translation` +##### `POST` /v1/layouts + + +###### Request: + +Deleted content type : `application/json` + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/layouts + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **400 Bad Request** +> Page size can not be larger than the page size limit. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **200 OK** +> The list of layouts that match the criteria of the query params are successfully returned. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/integrations + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> The list of integrations belonging to the organization that are successfully returned. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + +##### `POST` /v1/integrations + + +###### Request: + +Changed content type : `application/json` + +* Added property `conditions` (array) + + Items (object): + + * Property `isNegated` (boolean) + + * Property `type` (string) + + Enum values: + + * `BOOLEAN` + * `TEXT` + * `DATE` + * `NUMBER` + * `STATEMENT` + * `LIST` + * `MULTI_LIST` + * `GROUP` + * Property `value` (string) + + Enum values: + + * `AND` + * `OR` + * Property `children` (array) + + Items (object): + + * Property `field` (string) + + * Property `value` (string) + + * Property `operator` (string) + + Enum values: + + * `LARGER` + * `SMALLER` + * `LARGER_EQUAL` + * `SMALLER_EQUAL` + * `EQUAL` + * `NOT_EQUAL` + * `ALL_IN` + * `ANY_IN` + * `NOT_IN` + * `BETWEEN` + * `NOT_BETWEEN` + * `LIKE` + * `NOT_LIKE` + * `IN` + * Property `on` (string) + + Enum values: + + * `subscriber` + * `payload` +* Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `conditions` (array) + + * Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +##### `PUT` /v1/integrations/{integrationId} + + +###### Request: + +Changed content type : `application/json` + +* Added property `conditions` (array) + +* Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **404 Not Found** +> The integration with the integrationId provided does not exist in the database. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `conditions` (array) + + * Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +##### `DELETE` /v1/integrations/{integrationId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Added property `conditions` (array) + + * Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +##### `POST` /v1/integrations/{integrationId}/set-primary + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **404 Not Found** +> The integration with the integrationId provided does not exist in the database. + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `conditions` (array) + + * Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Added property `conditions` (array) + + * Changed property `credentials` (object) + + * Added property `apiKeyRequestHeader` (string) + + * Added property `secretKeyRequestHeader` (string) + + * Added property `idPath` (string) + + * Added property `datePath` (string) + + * Added property `apiToken` (string) + + * Added property `authenticateByToken` (boolean) + + * Added property `authenticationTokenKey` (string) + + * Added property `instanceId` (string) + + * Added property `alertUid` (string) + + * Added property `title` (string) + + * Added property `imageUrl` (string) + + * Added property `state` (string) + + * Added property `externalLink` (string) + +##### `POST` /v1/events/trigger + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `status` (string) + > Status for trigger + + + Added enum values: + + * `no_workflow_active_steps_defined` + * `no_workflow_steps_defined` + * `no_tenant_found` +##### `POST` /v1/events/trigger/broadcast + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `status` (string) + > Status for trigger + + + Added enum values: + + * `no_workflow_active_steps_defined` + * `no_workflow_steps_defined` + * `no_tenant_found` +Changed response : **201 Created** + +* Changed content type : `application/json` + + * Changed property `status` (string) + > Status for trigger + + + Added enum values: + + * `no_workflow_active_steps_defined` + * `no_workflow_steps_defined` + * `no_tenant_found` +##### `GET` /v1/subscribers + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +##### `POST` /v1/subscribers + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +##### `DELETE` /v1/subscribers/{subscriberId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/subscribers/{subscriberId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +##### `PUT` /v1/subscribers/{subscriberId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +##### `POST` /v1/subscribers/bulk + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `PUT` /v1/subscribers/{subscriberId}/credentials + + +###### Request: + +Changed content type : `application/json` + +* Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` +* Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +##### `PATCH` /v1/subscribers/{subscriberId}/online-status + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + +##### `POST` /v1/topics + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/topics + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `GET` /v1/blueprints/group-by-category + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `GET` /v1/blueprints/{templateId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +##### `POST` /v1/events/trigger/bulk + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `status` (string) + > Status for trigger + + + Added enum values: + + * `no_workflow_active_steps_defined` + * `no_workflow_steps_defined` + * `no_tenant_found` +##### `GET` /v1/notification-templates + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + + * Property `_id` (string) + + * Property `uuid` (string) + + * Property `name` (string) + + * Property `_templateId` (string) + + * Property `active` (boolean) + + * Property `shouldStopOnFail` (boolean) + + * Property `template` (object) + + * Property `filters` (array) + + * Property `_parentId` (object) + + * Property `metadata` (object) + + One of: + + * Property `amount` (number) + + * Property `unit` (string) + + Enum values: + + * `seconds` + * `minutes` + * `hours` + * `days` + * `weeks` + * `months` + * Property `digestKey` (string) + + * Property `type` (string) + + Enum values: + + * `regular` + * `backoff` + * Property `backoff` (boolean) + + * Property `backoffAmount` (number) + + * Property `backoffUnit` (string) + + * Property `updateMode` (boolean) + + * Property `amount` (number) + + * Property `unit` (string) + + * Property `digestKey` (string) + + * Property `type` (string) + + Enum value: + + * `timed` + * Property `timed` (object) + + * Property `atTime` (string) + + * Property `weekDays` (array) + + Items (string): + + Enum values: + + * `monday` + * `tuesday` + * `wednesday` + * `thursday` + * `friday` + * `saturday` + * `sunday` + * Property `monthDays` (array) + + Items (string): + + * Property `ordinal` (string) + + Enum values: + + * `1` + * `2` + * `3` + * `4` + * `5` + * `last` + * Property `ordinalValue` (string) + + Enum values: + + * `day` + * `weekday` + * `weekend` + * `sunday` + * `monday` + * `tuesday` + * `wednesday` + * `thursday` + * `friday` + * `saturday` + * Property `monthlyType` (string) + + Enum values: + + * `each` + * `on` + * Property `amount` (number) + + * Property `unit` (string) + + * Property `type` (string) + + Enum value: + + * `regular` + * Property `type` (string) + + Enum value: + + * `scheduled` + * Property `delayPath` (string) + + * Property `replyCallback` (object) + +##### `POST` /v1/notification-templates + + +###### Request: + +Changed content type : `application/json` + +* Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `DELETE` /v1/notification-templates/{templateId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `PUT` /v1/notification-templates/{templateId} + + +###### Request: + +Changed content type : `application/json` + +* Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `PUT` /v1/notification-templates/{templateId}/status + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `GET` /v1/workflows + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `data` + - `page` + - `pageSize` + - `totalCount` + + New optional properties: + - `_creatorId` + - `_environmentId` + - `_notificationGroupId` + - `_organizationId` + - `active` + - `critical` + - `deleted` + - `deletedAt` + - `deletedBy` + - `description` + - `draft` + - `name` + - `preferenceSettings` + - `steps` + - `tags` + - `triggers` + + * Added property `totalCount` (number) + + * Added property `pageSize` (number) + + * Added property `page` (number) + + * Deleted property `_id` (string) + + * Deleted property `name` (string) + + * Deleted property `description` (string) + + * Deleted property `active` (boolean) + + * Deleted property `draft` (boolean) + + * Deleted property `preferenceSettings` (object) + + * Deleted property `critical` (boolean) + + * Deleted property `tags` (array) + + * Deleted property `steps` (array) + + * Deleted property `_organizationId` (string) + + * Deleted property `_creatorId` (string) + + * Deleted property `_environmentId` (string) + + * Deleted property `triggers` (array) + + * Deleted property `_notificationGroupId` (string) + + * Deleted property `_parentId` (string) + + * Deleted property `deleted` (boolean) + + * Deleted property `deletedAt` (string) + + * Deleted property `deletedBy` (string) + + * Deleted property `notificationGroup` (object) + + * Deleted property `workflowIntegrationStatus` (object) + + * Changed property `data` (object -> array) + +##### `POST` /v1/workflows + + +###### Request: + +Changed content type : `application/json` + +* Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `DELETE` /v1/workflows/{workflowId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +##### `PUT` /v1/workflows/{workflowId} + + +###### Request: + +Changed content type : `application/json` + +* Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `PUT` /v1/workflows/{workflowId}/status + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `GET` /v1/subscribers/{subscriberId}/notifications/feed + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `subscriber` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `POST` /v1/subscribers/{subscriberId}/messages/markAs + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `subscriber` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `POST` /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **201 Created** +> Created + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `subscriber` (object) + + * Changed property `channels` (array) + > Channels settings for subscriber + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum values: + + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `pushpad` + * `pusher-beams` + * Changed property `credentials` (object) + > Credentials payload for the specified provider + + + * Added property `alertUid` (string) + > alert_uid for grafana on-call webhook payload + + + * Added property `title` (string) + > title to be used with grafana on call webhook + + + * Added property `imageUrl` (string) + > image_url property fo grafana on call webhook + + + * Added property `state` (string) + > state property fo grafana on call webhook + + + * Added property `externalUrl` (string) + > link_to_upstream_details property fo grafana on call webhook + + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` + * Changed property `steps` (array) + + Changed items (object): + + * Added property `variants` (object) + +##### `GET` /v1/notifications/{notificationId} + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +> Ok + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` +##### `GET` /v1/notifications + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` +##### `GET` /v1/messages + + +###### Return Type: + +New response : **409 Conflict** +> The request could not be completed due to a conflict with the current state of the target resource. + +New response : **429 null** +> The client has sent too many requests in a given amount of time. + +New response : **503 Service Unavailable** +> The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay. + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object): + + * Changed property `type` (string) + + Added enum value: + + * `event` diff --git a/specs/2.0.6/diff.ascidoc b/specs/2.0.6/diff.ascidoc new file mode 100644 index 0000000..ddd46c4 --- /dev/null +++ b/specs/2.0.6/diff.ascidoc @@ -0,0 +1,870 @@ += NOVU API (v 1.0) +:reproducible: +:sectlinks: +:toc: + +== What's Changed +=== GET /v1/integrations/webhook/provider/{providerOrIntegrationId}/status +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== DELETE/v1/subscribers/{subscriberId}/credentials/{providerId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== GET /v1/subscribers/{subscriberId}/notifications/feed +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (object -> object) + +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== GET /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback +* Parameter: +** Changed providerId in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== GET /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth +* Parameter: +** Changed providerId in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== DELETE/v1/messages/transaction/{transactionId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== DELETE/v1/events/trigger/{transactionId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== POST /v1/subscribers/bulk +* Request: +** Changed application/json +** Schema: +Broken compatibility +*** Changed property type: subscribers[n] (object -> string) + + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== GET /v1/subscribers/{subscriberId}/preferences/{level} +* Parameter: +** Add includeInactiveChannels in query + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== GET /v1/subscribers/{subscriberId}/notifications/unseen +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== POST /v1/subscribers/{subscriberId}/messages/mark-all +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 201 Created +** Media types: +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== POST /v1/topics/{topicKey}/subscribers +* Parameter: +** Changed topicKey in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Deleted 204 No Content +** Changed 200 OK +** Media types: +*** Added application/json +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== GET /v1/topics/{topicKey}/subscribers/{externalSubscriberId} +* Parameter: +** Changed topicKey in path +** Changed externalSubscriberId in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/topics/{topicKey}/subscribers/removal +* Parameter: +** Changed topicKey in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== DELETE/v1/topics/{topicKey} +* Parameter: +** Changed topicKey in path + +* Return Type: +** Add 400 Bad Request +** Add 422 Unprocessable Entity +** Changed 404 Not Found +** Media types: +*** Added application/json + +=== GET /v1/topics/{topicKey} +* Parameter: +** Changed topicKey in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== PATCH /v1/topics/{topicKey} +* Parameter: +** Changed topicKey in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== GET /v1/notifications/stats +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== GET /v1/notifications/graph/stats +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== DELETE/v1/messages/{messageId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== POST /v1/events/trigger +* Request: +** Changed application/json +** Schema: +Broken compatibility +*** Changed property type: to (array -> object) + + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== POST /v1/events/trigger/broadcast +* Request: +** Changed application/json +** Schema: +Broken compatibility + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Backward compatible +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/subscribers +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== POST /v1/subscribers +* Request: +** Changed application/json +** Schema: +Broken compatibility + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== DELETE/v1/subscribers/{subscriberId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== GET /v1/subscribers/{subscriberId} +* Parameter: +** Add includeTopics in query + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PUT /v1/subscribers/{subscriberId} +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PUT /v1/subscribers/{subscriberId}/credentials +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PATCH /v1/subscribers/{subscriberId}/credentials +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== PATCH /v1/subscribers/{subscriberId}/online-status +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility + +=== GET /v1/subscribers/{subscriberId}/preferences +* Parameter: +** Add includeInactiveChannels in query + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== PATCH /v1/subscribers/{subscriberId}/preferences +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: + +=== POST /v1/topics +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/topics +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + + +=== GET /v1/notifications/{notificationId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data.jobs[n] (object -> string) + +*** Changed property type: data.template.triggers[n] (object -> string) + + +=== GET /v1/integrations +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: [n].credentials (object -> object) + + +=== POST /v1/integrations +* Request: +** Changed application/json +** Schema: +Broken compatibility +*** Changed property type: _environmentId (string -> string) + +*** Changed property type: credentials (object -> object) + + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data.credentials (object -> object) + + +=== GET /v1/integrations/active +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: [n].credentials (object -> object) + + +=== PUT /v1/integrations/{integrationId} +* Request: +** Changed application/json +** Schema: +Backward compatible + +* Return Type: +** Add 400 Bad Request +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data.credentials (object -> object) + + +=== DELETE/v1/integrations/{integrationId} +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data[n].credentials (object -> object) + + +=== POST /v1/integrations/{integrationId}/set-primary +* Return Type: +** Add 400 Bad Request +** Add 422 Unprocessable Entity +** Deleted 201 Created +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data.credentials (object -> object) + + +=== POST /v1/events/trigger/bulk +* Request: +** Changed application/json +** Schema: +Broken compatibility +*** Changed property type: events[n].to (array -> object) + + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Backward compatible + +=== GET /v1/notifications +* Parameter: +** Add after in query +** Add before in query +** Changed channels in query +** Changed templates in query +** Changed emails in query +** Changed search in query +** Changed subscriberIds in query + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data[n].jobs[n] (object -> string) + +*** Changed property type: data[n].template.triggers[n] (object -> string) + + +=== GET /v1/messages +* Parameter: +** Changed channel in query + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 200 OK +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data[n].jobs[n] (object -> string) + +*** Changed property type: data[n].template.triggers[n] (object -> string) + + +=== POST /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} +* Parameter: +** Changed type in path + +* Return Type: +** Add 400 Bad Request +** Add 404 Not Found +** Add 422 Unprocessable Entity +** Changed 409 Conflict +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: (string -> object) + +** Changed 201 Created +** Media types: +*** Changed application/json +*** Schema: +Broken compatibility +*** Changed property type: data._feedId (string -> object) + + + +WARNING: API changes broke backward compatibility diff --git a/specs/2.0.6/diff.html b/specs/2.0.6/diff.html new file mode 100644 index 0000000..171d70b --- /dev/null +++ b/specs/2.0.6/diff.html @@ -0,0 +1 @@ +Api Change Log

                                                                                                  Api Change Log

                                                                                                  What's New


                                                                                                  1. POST/v1/subscribers/{subscriberId}/messages/mark-as Mark a subscriber messages as seen, read, unseen or unread
                                                                                                  2. POST/v1/support/user-organizations null
                                                                                                  3. POST/v1/support/create-thread null
                                                                                                  4. PATCH/v1/subscribers/{subscriberId}/preferences/{parameter} Update subscriber preference

                                                                                                  What's Deleted


                                                                                                  1. GET/v1/inbound-parse/mx/status Validate the mx record setup for the inbound parse functionality
                                                                                                  2. GET/v1/organizations Fetch all organizations
                                                                                                  3. POST/v1/organizations Create an organization
                                                                                                  4. PATCH/v1/organizations Rename organization name
                                                                                                  5. GET/v1/organizations/me Fetch current organization details
                                                                                                  6. DELETE/v1/organizations/members/{memberId} Remove a member from organization using memberId
                                                                                                  7. GET/v1/organizations/members Fetch all members of current organizations
                                                                                                  8. PUT/v1/organizations/branding Update organization branding details
                                                                                                  9. GET/v1/environments/me Get current environment
                                                                                                  10. GET/v1/environments Get environments
                                                                                                  11. GET/v1/environments/api-keys Get api keys
                                                                                                  12. POST/v1/environments/api-keys/regenerate Regenerate api keys
                                                                                                  13. GET/v1/notification-groups Get workflow groups
                                                                                                  14. POST/v1/notification-groups Create workflow group
                                                                                                  15. GET/v1/notification-groups/{id} Get workflow group
                                                                                                  16. DELETE/v1/notification-groups/{id} Delete workflow group
                                                                                                  17. PATCH/v1/notification-groups/{id} Update workflow group
                                                                                                  18. GET/v1/changes Get changes
                                                                                                  19. GET/v1/changes/count Get changes count
                                                                                                  20. POST/v1/changes/bulk/apply Apply changes
                                                                                                  21. POST/v1/changes/{changeId}/apply Apply change
                                                                                                  22. GET/v1/layouts Filter layouts
                                                                                                  23. POST/v1/layouts Layout creation
                                                                                                  24. GET/v1/layouts/{layoutId} Get layout
                                                                                                  25. DELETE/v1/layouts/{layoutId} Delete layout
                                                                                                  26. PATCH/v1/layouts/{layoutId} Update a layout
                                                                                                  27. POST/v1/layouts/{layoutId}/default Set default layout
                                                                                                  28. GET/v1/execution-details Get execution details
                                                                                                  29. GET/v1/notification-templates Get Notification templates
                                                                                                  30. POST/v1/notification-templates Create Notification template
                                                                                                  31. PUT/v1/notification-templates/{templateId} Update Notification template
                                                                                                  32. DELETE/v1/notification-templates/{templateId} Delete Notification template
                                                                                                  33. GET/v1/notification-templates/{workflowIdOrIdentifier} Get Notification template
                                                                                                  34. PUT/v1/notification-templates/{templateId}/status Update Notification template status
                                                                                                  35. GET/v1/workflows Get workflows
                                                                                                  36. POST/v1/workflows Create workflow
                                                                                                  37. PUT/v1/workflows/{workflowId} Update workflow
                                                                                                  38. DELETE/v1/workflows/{workflowId} Delete workflow
                                                                                                  39. GET/v1/workflows/variables Get available variables
                                                                                                  40. GET/v1/workflows/{workflowIdOrIdentifier} Get workflow
                                                                                                  41. PUT/v1/workflows/{workflowId}/status Update workflow status
                                                                                                  42. PATCH/v1/subscribers/{subscriberId}/preferences/{templateId} Update subscriber preference
                                                                                                  43. POST/v1/subscribers/{subscriberId}/messages/markAs Mark a subscriber feed message as seen
                                                                                                  44. GET/v1/tenants Get tenants
                                                                                                  45. POST/v1/tenants Create tenant
                                                                                                  46. GET/v1/tenants/{identifier} Get tenant
                                                                                                  47. DELETE/v1/tenants/{identifier} Delete tenant
                                                                                                  48. PATCH/v1/tenants/{identifier} Update tenant
                                                                                                  49. GET/v1/feeds Get feeds
                                                                                                  50. POST/v1/feeds Create feed
                                                                                                  51. DELETE/v1/feeds/{feedId} Delete feed
                                                                                                  52. GET/v1/blueprints/group-by-category null
                                                                                                  53. GET/v1/blueprints/{templateIdOrIdentifier} null
                                                                                                  54. GET/v1/workflow-overrides Get workflow overrides
                                                                                                  55. POST/v1/workflow-overrides Create workflow override
                                                                                                  56. GET/v1/workflow-overrides/{overrideId} Get workflow override by id
                                                                                                  57. PUT/v1/workflow-overrides/{overrideId} Update workflow override by id
                                                                                                  58. DELETE/v1/workflow-overrides/{overrideId} Delete workflow override
                                                                                                  59. GET/v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} Get workflow override
                                                                                                  60. PUT/v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} Update workflow override

                                                                                                  What's Deprecated


                                                                                                    What's Changed


                                                                                                    1. GET/v1/integrations/webhook/provider/{providerOrIntegrationId}/status
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    2. DELETE/v1/subscribers/{subscriberId}/credentials/{providerId}
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    3. GET/v1/subscribers/{subscriberId}/notifications/feed
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [200]//OK
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (object -> object)

                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    4. GET/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback
                                                                                                      • Parameters

                                                                                                        • providerId in path
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    5. GET/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth
                                                                                                      • Parameters

                                                                                                        • providerId in path
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    6. DELETE/v1/messages/transaction/{transactionId}
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    7. DELETE/v1/events/trigger/{transactionId}
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    8. POST/v1/subscribers/bulk
                                                                                                      • Request

                                                                                                        • Schema incompatible

                                                                                                          Changed body: 'application/json'

                                                                                                          Changed property type: subscribers[n] (object -> string)

                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                    9. GET/v1/subscribers/{subscriberId}/preferences/{level}
                                                                                                      • Parameters

                                                                                                        • Add includeInactiveChannels in query//A flag which specifies if the inactive workflow channels should be included in the retrieved preferences. Default is true
                                                                                                      • Response

                                                                                                        • New response : [400]//Bad Request
                                                                                                        • New response : [404]//Not Found
                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                        • Changed response : [409]//Conflict
                                                                                                          • Schema incompatible

                                                                                                            Changed body: 'application/json'

                                                                                                            Changed property type: (string -> object)

                                                                                                        • Changed response : [200]//OK
                                                                                                      • GET/v1/subscribers/{subscriberId}/notifications/unseen
                                                                                                        • Response

                                                                                                          • New response : [400]//Bad Request
                                                                                                          • New response : [404]//Not Found
                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                          • Changed response : [409]//Conflict
                                                                                                            • Schema incompatible

                                                                                                              Changed body: 'application/json'

                                                                                                              Changed property type: (string -> object)

                                                                                                          • Changed response : [200]//OK
                                                                                                        • POST/v1/subscribers/{subscriberId}/messages/mark-all
                                                                                                          • Response

                                                                                                            • New response : [400]//Bad Request
                                                                                                            • New response : [404]//Not Found
                                                                                                            • New response : [422]//Unprocessable Entity
                                                                                                            • Changed response : [201]//
                                                                                                              • Changed response : [409]//Conflict
                                                                                                                • Schema incompatible

                                                                                                                  Changed body: 'application/json'

                                                                                                                  Changed property type: (string -> object)

                                                                                                          • POST/v1/topics/{topicKey}/subscribers
                                                                                                            • Parameters

                                                                                                              • topicKey in path Notes null change into The topic key
                                                                                                            • Response

                                                                                                              • New response : [400]//Bad Request
                                                                                                              • New response : [404]//Not Found
                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                              • Deleted response : [204]//
                                                                                                              • Changed response : [200]//
                                                                                                                • New body: 'application/json'
                                                                                                              • Changed response : [409]//Conflict
                                                                                                                • Schema incompatible

                                                                                                                  Changed body: 'application/json'

                                                                                                                  Changed property type: (string -> object)

                                                                                                          • GET/v1/topics/{topicKey}/subscribers/{externalSubscriberId}
                                                                                                            • Parameters

                                                                                                              • topicKey in path Notes null change into The topic key
                                                                                                              • externalSubscriberId in path Notes null change into The external subscriber id
                                                                                                            • Response

                                                                                                              • New response : [400]//Bad Request
                                                                                                              • New response : [404]//Not Found
                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                              • Changed response : [409]//Conflict
                                                                                                                • Schema incompatible

                                                                                                                  Changed body: 'application/json'

                                                                                                                  Changed property type: (string -> object)

                                                                                                              • Changed response : [200]//
                                                                                                                • Schema

                                                                                                                  Changed body: 'application/json'
                                                                                                          • POST/v1/topics/{topicKey}/subscribers/removal
                                                                                                            • Parameters

                                                                                                              • topicKey in path Notes null change into The topic key
                                                                                                            • Response

                                                                                                              • New response : [400]//Bad Request
                                                                                                              • New response : [404]//Not Found
                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                              • Changed response : [409]//Conflict
                                                                                                                • Schema incompatible

                                                                                                                  Changed body: 'application/json'

                                                                                                                  Changed property type: (string -> object)

                                                                                                          • DELETE/v1/topics/{topicKey}
                                                                                                            • Parameters

                                                                                                              • topicKey in path Notes null change into The topic key
                                                                                                            • Response

                                                                                                              • New response : [400]//Bad Request
                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                              • Changed response : [404]//Not Found
                                                                                                                • New body: 'application/json'
                                                                                                          • GET/v1/topics/{topicKey}
                                                                                                            • Parameters

                                                                                                              • topicKey in path Notes null change into The topic key
                                                                                                            • Response

                                                                                                              • New response : [400]//Bad Request
                                                                                                              • New response : [404]//Not Found
                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                              • Changed response : [409]//Conflict
                                                                                                                • Schema incompatible

                                                                                                                  Changed body: 'application/json'

                                                                                                                  Changed property type: (string -> object)

                                                                                                              • Changed response : [200]//OK
                                                                                                            • PATCH/v1/topics/{topicKey}
                                                                                                              • Parameters

                                                                                                                • topicKey in path Notes null change into The topic key
                                                                                                              • Response

                                                                                                                • New response : [400]//Bad Request
                                                                                                                • New response : [404]//Not Found
                                                                                                                • New response : [422]//Unprocessable Entity
                                                                                                                • Changed response : [409]//Conflict
                                                                                                                  • Schema incompatible

                                                                                                                    Changed body: 'application/json'

                                                                                                                    Changed property type: (string -> object)

                                                                                                                • Changed response : [200]//OK
                                                                                                              • GET/v1/notifications/stats
                                                                                                                • Response

                                                                                                                  • New response : [400]//Bad Request
                                                                                                                  • New response : [404]//Not Found
                                                                                                                  • New response : [422]//Unprocessable Entity
                                                                                                                  • Changed response : [409]//Conflict
                                                                                                                    • Schema incompatible

                                                                                                                      Changed body: 'application/json'

                                                                                                                      Changed property type: (string -> object)

                                                                                                                  • Changed response : [200]//OK
                                                                                                                • GET/v1/notifications/graph/stats
                                                                                                                  • Response

                                                                                                                    • New response : [400]//Bad Request
                                                                                                                    • New response : [404]//Not Found
                                                                                                                    • New response : [422]//Unprocessable Entity
                                                                                                                    • Changed response : [409]//Conflict
                                                                                                                      • Schema incompatible

                                                                                                                        Changed body: 'application/json'

                                                                                                                        Changed property type: (string -> object)

                                                                                                                    • Changed response : [200]//OK
                                                                                                                  • DELETE/v1/messages/{messageId}
                                                                                                                    • Response

                                                                                                                      • New response : [400]//Bad Request
                                                                                                                      • New response : [404]//Not Found
                                                                                                                      • New response : [422]//Unprocessable Entity
                                                                                                                      • Changed response : [409]//Conflict
                                                                                                                        • Schema incompatible

                                                                                                                          Changed body: 'application/json'

                                                                                                                          Changed property type: (string -> object)

                                                                                                                      • Changed response : [200]//OK
                                                                                                                    • POST/v1/events/trigger
                                                                                                                      • Request

                                                                                                                        • Schema incompatible

                                                                                                                          Changed body: 'application/json'

                                                                                                                          Changed property type: to (array -> object)

                                                                                                                      • Response

                                                                                                                        • New response : [400]//Bad Request
                                                                                                                        • New response : [404]//Not Found
                                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                                        • Changed response : [409]//Conflict
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'

                                                                                                                            Changed property type: (string -> object)

                                                                                                                        • Changed response : [201]//Created
                                                                                                                          • Schema

                                                                                                                            Changed body: 'application/json'
                                                                                                                    • POST/v1/events/trigger/broadcast
                                                                                                                      • Request

                                                                                                                        • Schema incompatible

                                                                                                                          Changed body: 'application/json'
                                                                                                                      • Response

                                                                                                                        • New response : [400]//Bad Request
                                                                                                                        • New response : [404]//Not Found
                                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                                        • Changed response : [409]//Conflict
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'

                                                                                                                            Changed property type: (string -> object)

                                                                                                                        • Changed response : [200]//OK
                                                                                                                          • Schema

                                                                                                                            Changed body: 'application/json'
                                                                                                                        • Changed response : [201]//Broadcast request has been registered successfully
                                                                                                                          • Schema

                                                                                                                            Changed body: 'application/json'
                                                                                                                    • GET/v1/subscribers
                                                                                                                      • Response

                                                                                                                        • New response : [400]//Bad Request
                                                                                                                        • New response : [404]//Not Found
                                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                                        • Changed response : [409]//Conflict
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'

                                                                                                                            Changed property type: (string -> object)

                                                                                                                        • Changed response : [200]//
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'
                                                                                                                    • POST/v1/subscribers
                                                                                                                      • Request

                                                                                                                        • Schema incompatible

                                                                                                                          Changed body: 'application/json'
                                                                                                                      • Response

                                                                                                                        • New response : [400]//Bad Request
                                                                                                                        • New response : [404]//Not Found
                                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                                        • Changed response : [409]//Conflict
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'

                                                                                                                            Changed property type: (string -> object)

                                                                                                                        • Changed response : [201]//Created
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'
                                                                                                                    • DELETE/v1/subscribers/{subscriberId}
                                                                                                                      • Response

                                                                                                                        • New response : [400]//Bad Request
                                                                                                                        • New response : [404]//Not Found
                                                                                                                        • New response : [422]//Unprocessable Entity
                                                                                                                        • Changed response : [409]//Conflict
                                                                                                                          • Schema incompatible

                                                                                                                            Changed body: 'application/json'

                                                                                                                            Changed property type: (string -> object)

                                                                                                                        • Changed response : [200]//OK
                                                                                                                      • GET/v1/subscribers/{subscriberId}
                                                                                                                        • Parameters

                                                                                                                          • Add includeTopics in query//Includes the topics associated with the subscriber
                                                                                                                        • Response

                                                                                                                          • New response : [400]//Bad Request
                                                                                                                          • New response : [404]//Not Found
                                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                                          • Changed response : [409]//Conflict
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'

                                                                                                                              Changed property type: (string -> object)

                                                                                                                          • Changed response : [200]//OK
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'
                                                                                                                      • PUT/v1/subscribers/{subscriberId}
                                                                                                                        • Request

                                                                                                                          • Schema

                                                                                                                            Changed body: 'application/json'
                                                                                                                        • Response

                                                                                                                          • New response : [400]//Bad Request
                                                                                                                          • New response : [404]//Not Found
                                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                                          • Changed response : [409]//Conflict
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'

                                                                                                                              Changed property type: (string -> object)

                                                                                                                          • Changed response : [200]//OK
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'
                                                                                                                      • PUT/v1/subscribers/{subscriberId}/credentials
                                                                                                                        • Request

                                                                                                                          • Schema

                                                                                                                            Changed body: 'application/json'
                                                                                                                        • Response

                                                                                                                          • New response : [400]//Bad Request
                                                                                                                          • New response : [404]//Not Found
                                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                                          • Changed response : [409]//Conflict
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'

                                                                                                                              Changed property type: (string -> object)

                                                                                                                          • Changed response : [200]//OK
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'
                                                                                                                      • PATCH/v1/subscribers/{subscriberId}/credentials
                                                                                                                        • Request

                                                                                                                          • Schema

                                                                                                                            Changed body: 'application/json'
                                                                                                                        • Response

                                                                                                                          • New response : [400]//Bad Request
                                                                                                                          • New response : [404]//Not Found
                                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                                          • Changed response : [409]//Conflict
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'

                                                                                                                              Changed property type: (string -> object)

                                                                                                                          • Changed response : [200]//OK
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'
                                                                                                                      • PATCH/v1/subscribers/{subscriberId}/online-status
                                                                                                                        • Response

                                                                                                                          • New response : [400]//Bad Request
                                                                                                                          • New response : [404]//Not Found
                                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                                          • Changed response : [409]//Conflict
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'

                                                                                                                              Changed property type: (string -> object)

                                                                                                                          • Changed response : [200]//OK
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'
                                                                                                                      • GET/v1/subscribers/{subscriberId}/preferences
                                                                                                                        • Parameters

                                                                                                                          • Add includeInactiveChannels in query//A flag which specifies if the inactive workflow channels should be included in the retrieved preferences. Default is true
                                                                                                                        • Response

                                                                                                                          • New response : [400]//Bad Request
                                                                                                                          • New response : [404]//Not Found
                                                                                                                          • New response : [422]//Unprocessable Entity
                                                                                                                          • Changed response : [409]//Conflict
                                                                                                                            • Schema incompatible

                                                                                                                              Changed body: 'application/json'

                                                                                                                              Changed property type: (string -> object)

                                                                                                                          • Changed response : [200]//OK
                                                                                                                        • PATCH/v1/subscribers/{subscriberId}/preferences
                                                                                                                          • Response

                                                                                                                            • New response : [400]//Bad Request
                                                                                                                            • New response : [404]//Not Found
                                                                                                                            • New response : [422]//Unprocessable Entity
                                                                                                                            • Changed response : [409]//Conflict
                                                                                                                              • Schema incompatible

                                                                                                                                Changed body: 'application/json'

                                                                                                                                Changed property type: (string -> object)

                                                                                                                            • Changed response : [200]//OK
                                                                                                                          • POST/v1/topics
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [201]//Created
                                                                                                                                • Schema

                                                                                                                                  Changed body: 'application/json'
                                                                                                                          • GET/v1/topics
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                          • GET/v1/notifications/{notificationId}
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//OK
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data.jobs[n] (object -> string)

                                                                                                                                  Changed property type: data.template.triggers[n] (object -> string)

                                                                                                                          • GET/v1/integrations
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//The list of integrations belonging to the organization that are successfully returned.
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: [n].credentials (object -> object)

                                                                                                                          • POST/v1/integrations
                                                                                                                            • Request

                                                                                                                              • Schema incompatible

                                                                                                                                Changed body: 'application/json'

                                                                                                                                Changed property type: _environmentId (string -> string)

                                                                                                                                Changed property type: credentials (object -> object)

                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [201]//Created
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data.credentials (object -> object)

                                                                                                                          • GET/v1/integrations/active
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//The list of active integrations belonging to the organization that are successfully returned.
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: [n].credentials (object -> object)

                                                                                                                          • PUT/v1/integrations/{integrationId}
                                                                                                                            • Request

                                                                                                                              • Schema

                                                                                                                                Changed body: 'application/json'
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//OK
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data.credentials (object -> object)

                                                                                                                          • DELETE/v1/integrations/{integrationId}
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//OK
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data[n].credentials (object -> object)

                                                                                                                          • POST/v1/integrations/{integrationId}/set-primary
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Deleted response : [201]//
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//OK
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data.credentials (object -> object)

                                                                                                                          • POST/v1/events/trigger/bulk
                                                                                                                            • Request

                                                                                                                              • Schema incompatible

                                                                                                                                Changed body: 'application/json'

                                                                                                                                Changed property type: events[n].to (array -> object)

                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [201]//Created
                                                                                                                                • Schema

                                                                                                                                  Changed body: 'application/json'
                                                                                                                          • GET/v1/notifications
                                                                                                                            • Parameters

                                                                                                                              • Add after in query
                                                                                                                              • Add before in query
                                                                                                                              • channels in query change into not required
                                                                                                                              • templates in query change into not required
                                                                                                                              • emails in query change into not required
                                                                                                                              • search in query change into not required
                                                                                                                              • subscriberIds in query change into not required
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data[n].jobs[n] (object -> string)

                                                                                                                                  Changed property type: data[n].template.triggers[n] (object -> string)

                                                                                                                          • GET/v1/messages
                                                                                                                            • Parameters

                                                                                                                              • channel in query
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [200]//
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data[n].jobs[n] (object -> string)

                                                                                                                                  Changed property type: data[n].template.triggers[n] (object -> string)

                                                                                                                          • POST/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}
                                                                                                                            • Parameters

                                                                                                                              • type in path
                                                                                                                            • Response

                                                                                                                              • New response : [400]//Bad Request
                                                                                                                              • New response : [404]//Not Found
                                                                                                                              • New response : [422]//Unprocessable Entity
                                                                                                                              • Changed response : [409]//Conflict
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: (string -> object)

                                                                                                                              • Changed response : [201]//Created
                                                                                                                                • Schema incompatible

                                                                                                                                  Changed body: 'application/json'

                                                                                                                                  Changed property type: data._feedId (string -> object)

                                                                                                                          \ No newline at end of file diff --git a/specs/2.0.6/diff.md b/specs/2.0.6/diff.md new file mode 100644 index 0000000..3492327 --- /dev/null +++ b/specs/2.0.6/diff.md @@ -0,0 +1,3512 @@ +#### What's New +--- + +##### `POST` /v1/subscribers/{subscriberId}/messages/mark-as + +> Mark a subscriber messages as seen, read, unseen or unread + + +##### `POST` /v1/support/user-organizations + + +##### `POST` /v1/support/create-thread + + +##### `PATCH` /v1/subscribers/{subscriberId}/preferences/{parameter} + +> Update subscriber preference + + +#### What's Deleted +--- + +##### `GET` /v1/inbound-parse/mx/status + +> Validate the mx record setup for the inbound parse functionality + + +##### `GET` /v1/organizations + +> Fetch all organizations + + +##### `POST` /v1/organizations + +> Create an organization + + +##### `PATCH` /v1/organizations + +> Rename organization name + + +##### `GET` /v1/organizations/me + +> Fetch current organization details + + +##### `DELETE` /v1/organizations/members/{memberId} + +> Remove a member from organization using memberId + + +##### `GET` /v1/organizations/members + +> Fetch all members of current organizations + + +##### `PUT` /v1/organizations/branding + +> Update organization branding details + + +##### `GET` /v1/environments/me + +> Get current environment + + +##### `GET` /v1/environments + +> Get environments + + +##### `GET` /v1/environments/api-keys + +> Get api keys + + +##### `POST` /v1/environments/api-keys/regenerate + +> Regenerate api keys + + +##### `GET` /v1/notification-groups + +> Get workflow groups + + +##### `POST` /v1/notification-groups + +> Create workflow group + + +##### `GET` /v1/notification-groups/{id} + +> Get workflow group + + +##### `DELETE` /v1/notification-groups/{id} + +> Delete workflow group + + +##### `PATCH` /v1/notification-groups/{id} + +> Update workflow group + + +##### `GET` /v1/changes + +> Get changes + + +##### `GET` /v1/changes/count + +> Get changes count + + +##### `POST` /v1/changes/bulk/apply + +> Apply changes + + +##### `POST` /v1/changes/{changeId}/apply + +> Apply change + + +##### `GET` /v1/layouts + +> Filter layouts + + +##### `POST` /v1/layouts + +> Layout creation + + +##### `GET` /v1/layouts/{layoutId} + +> Get layout + + +##### `DELETE` /v1/layouts/{layoutId} + +> Delete layout + + +##### `PATCH` /v1/layouts/{layoutId} + +> Update a layout + + +##### `POST` /v1/layouts/{layoutId}/default + +> Set default layout + + +##### `GET` /v1/execution-details + +> Get execution details + + +##### `GET` /v1/notification-templates + +> Get Notification templates + + +##### `POST` /v1/notification-templates + +> Create Notification template + + +##### `PUT` /v1/notification-templates/{templateId} + +> Update Notification template + + +##### `DELETE` /v1/notification-templates/{templateId} + +> Delete Notification template + + +##### `GET` /v1/notification-templates/{workflowIdOrIdentifier} + +> Get Notification template + + +##### `PUT` /v1/notification-templates/{templateId}/status + +> Update Notification template status + + +##### `GET` /v1/workflows + +> Get workflows + + +##### `POST` /v1/workflows + +> Create workflow + + +##### `PUT` /v1/workflows/{workflowId} + +> Update workflow + + +##### `DELETE` /v1/workflows/{workflowId} + +> Delete workflow + + +##### `GET` /v1/workflows/variables + +> Get available variables + + +##### `GET` /v1/workflows/{workflowIdOrIdentifier} + +> Get workflow + + +##### `PUT` /v1/workflows/{workflowId}/status + +> Update workflow status + + +##### `PATCH` /v1/subscribers/{subscriberId}/preferences/{templateId} + +> Update subscriber preference + + +##### `POST` /v1/subscribers/{subscriberId}/messages/markAs + +> Mark a subscriber feed message as seen + + +##### `GET` /v1/tenants + +> Get tenants + + +##### `POST` /v1/tenants + +> Create tenant + + +##### `GET` /v1/tenants/{identifier} + +> Get tenant + + +##### `DELETE` /v1/tenants/{identifier} + +> Delete tenant + + +##### `PATCH` /v1/tenants/{identifier} + +> Update tenant + + +##### `GET` /v1/feeds + +> Get feeds + + +##### `POST` /v1/feeds + +> Create feed + + +##### `DELETE` /v1/feeds/{feedId} + +> Delete feed + + +##### `GET` /v1/blueprints/group-by-category + + +##### `GET` /v1/blueprints/{templateIdOrIdentifier} + + +##### `GET` /v1/workflow-overrides + +> Get workflow overrides + + +##### `POST` /v1/workflow-overrides + +> Create workflow override + + +##### `GET` /v1/workflow-overrides/{overrideId} + +> Get workflow override by id + + +##### `PUT` /v1/workflow-overrides/{overrideId} + +> Update workflow override by id + + +##### `DELETE` /v1/workflow-overrides/{overrideId} + +> Delete workflow override + + +##### `GET` /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} + +> Get workflow override + + +##### `PUT` /v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId} + +> Update workflow override + + +#### What's Changed +--- + +##### `GET` /v1/integrations/webhook/provider/{providerOrIntegrationId}/status + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `DELETE` /v1/subscribers/{subscriberId}/credentials/{providerId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `GET` /v1/subscribers/{subscriberId}/notifications/feed + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `GET` /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback + + +###### Parameters: + +Changed: `providerId` in `path` + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `GET` /v1/subscribers/{subscriberId}/credentials/{providerId}/oauth + + +###### Parameters: + +Changed: `providerId` in `path` + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `DELETE` /v1/messages/transaction/{transactionId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `DELETE` /v1/events/trigger/{transactionId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `POST` /v1/subscribers/bulk + + +###### Request: + +Changed content type : `application/json` + +* Changed property `subscribers` (array) + > An array of subscribers to be created in bulk. + + + Changed items (object -> string): + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `GET` /v1/subscribers/{subscriberId}/preferences/{level} + + +###### Parameters: + +Added: `includeInactiveChannels` in `query` +> A flag which specifies if the inactive workflow channels should be included in the retrieved preferences. Default is true + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `GET` /v1/subscribers/{subscriberId}/notifications/unseen + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `POST` /v1/subscribers/{subscriberId}/messages/mark-all + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **201 Created** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `POST` /v1/topics/{topicKey}/subscribers + + +###### Parameters: + +Changed: `topicKey` in `path` +> The topic key + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Deleted response : **204 No Content** +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* New content type : `application/json` + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `GET` /v1/topics/{topicKey}/subscribers/{externalSubscriberId} + + +###### Parameters: + +Changed: `topicKey` in `path` +> The topic key + + +Changed: `externalSubscriberId` in `path` +> The external subscriber id + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `_organizationId` (string) + > Unique identifier for the organization + + + * Changed property `_environmentId` (string) + > Unique identifier for the environment + + + * Changed property `_subscriberId` (string) + > Unique identifier for the subscriber + + + * Changed property `_topicId` (string) + > Unique identifier for the topic + + + * Changed property `topicKey` (string) + > Key associated with the topic + + + * Changed property `externalSubscriberId` (string) + > External identifier for the subscriber + + +##### `POST` /v1/topics/{topicKey}/subscribers/removal + + +###### Parameters: + +Changed: `topicKey` in `path` +> The topic key + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `DELETE` /v1/topics/{topicKey} + + +###### Parameters: + +Changed: `topicKey` in `path` +> The topic key + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **404 Not Found** +> Not Found + + +* New content type : `application/json` + +##### `GET` /v1/topics/{topicKey} + + +###### Parameters: + +Changed: `topicKey` in `path` +> The topic key + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `PATCH` /v1/topics/{topicKey} + + +###### Parameters: + +Changed: `topicKey` in `path` +> The topic key + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `GET` /v1/notifications/stats + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `GET` /v1/notifications/graph/stats + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `DELETE` /v1/messages/{messageId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `POST` /v1/events/trigger + + +###### Request: + +Changed content type : `application/json` + +* Added property `bridgeUrl` (string) + > A URL to bridge for additional processing. + + +* Added property `controls` (object) + > Additional control configurations. + + + * Property `steps` (object) + > A mapping of step IDs to their corresponding data. + + +* Changed property `payload` (object) + > The payload object is used to pass additional custom information that could be + > used to render the workflow, or perform routing rules based on it. + > This data will also be available when fetching the notifications feed from the API to display certain parts of the UI. + + +* Changed property `overrides` (object) + > This could be used to override provider specific configurations + + +* Changed property `to` (array -> object) + > The recipients list of people who will receive the notification. + + +* Changed property `transactionId` (string) + > A unique identifier for this transaction, we will generate a UUID if not provided. + + +* Changed property `actor` (object) + > It is used to display the Avatar of the provided actor's subscriber id or actor object. + > If a new actor object is provided, we will create a new subscriber in our system + + + Updated `SubscriberPayloadDto` : + * Added property `channels` (array) + > An optional array of subscriber channels. + + + Items (object): + + * Property `providerId` (string) + > The ID of the chat or push provider. + + + Enum values: + + * `slack` + * `discord` + * `msteams` + * `mattermost` + * `ryver` + * `zulip` + * `grafana-on-call` + * `getstream` + * `rocket-chat` + * `whatsapp-business` + * `fcm` + * `apns` + * `expo` + * `one-signal` + * `pushpad` + * `push-webhook` + * `pusher-beams` + * Property `integrationIdentifier` (string) + > An optional identifier for the integration. + + + * Property `credentials` (object) + > Credentials for the channel. + + + * Property `webhookUrl` (string) + > The URL for the webhook associated with the channel. + + + * Property `deviceTokens` (array) + > An array of device tokens for push notifications. + + + Items (string): + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > An HTTP URL to the profile image of your subscriber. + + + * Changed property `locale` (string) + > The locale of the subscriber. + + + * Changed property `data` (object) + > An optional payload object that can contain any properties. + + +* Changed property `tenant` (object) + > It is used to specify a tenant context during trigger event. + > Existing tenants will be updated with the provided details. + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **201 Created** +> Created + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `acknowledged` (boolean) + > Indicates whether the trigger was acknowledged or not + + + * Changed property `status` (string) + > Status of the trigger + + + Removed enum value: + + * `subscriber_id_missing` + * Changed property `error` (array) + > In case of an error, this field will contain the error message(s) + + + * Changed property `transactionId` (string) + > The returned transaction ID of the trigger + + +##### `POST` /v1/events/trigger/broadcast + + +###### Request: + +Changed content type : `application/json` + +* Changed property `payload` (object) + > The payload object is used to pass additional information that + > could be used to render the template, or perform routing rules based on it. + > For In-App channel, payload data are also available in + + +* Changed property `actor` (object) + > It is used to display the Avatar of the provided actor's subscriber id or actor object. + > If a new actor object is provided, we will create a new subscriber in our system + + + Updated `SubscriberPayloadDto` : + * Added property `channels` (array) + > An optional array of subscriber channels. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > An HTTP URL to the profile image of your subscriber. + + + * Changed property `locale` (string) + > The locale of the subscriber. + + + * Changed property `data` (object) + > An optional payload object that can contain any properties. + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `acknowledged` (boolean) + > Indicates whether the trigger was acknowledged or not + + + * Changed property `status` (string) + > Status of the trigger + + + Removed enum value: + + * `subscriber_id_missing` + * Changed property `error` (array) + > In case of an error, this field will contain the error message(s) + + + * Changed property `transactionId` (string) + > The returned transaction ID of the trigger + + +Changed response : **201 Created** +> Broadcast request has been registered successfully + +New header : `Content-Type` + + +New header : `RateLimit-Limit` + + +New header : `RateLimit-Remaining` + + +New header : `RateLimit-Reset` + + +New header : `RateLimit-Policy` + + +New header : `Idempotency-Key` + + +New header : `Idempotency-Replay` + + + +* Changed content type : `application/json` + + * Changed property `acknowledged` (boolean) + > Indicates whether the trigger was acknowledged or not + + + * Changed property `status` (string) + > Status of the trigger + + + Removed enum value: + + * `subscriber_id_missing` + * Changed property `error` (array) + > In case of an error, this field will contain the error message(s) + + + * Changed property `transactionId` (string) + > The returned transaction ID of the trigger + + +##### `GET` /v1/subscribers + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + Items (string): + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `POST` /v1/subscribers + + +###### Request: + +Changed content type : `application/json` + +* Added property `channels` (array) + > An optional array of subscriber channels. + + +* Changed property `email` (string) + > The email address of the subscriber. + + +* Changed property `firstName` (string) + > The first name of the subscriber. + + +* Changed property `lastName` (string) + > The last name of the subscriber. + + +* Changed property `phone` (string) + > The phone number of the subscriber. + + +* Changed property `avatar` (string) + > An HTTP URL to the profile image of your subscriber. + + +* Changed property `locale` (string) + > The locale of the subscriber. + + +* Changed property `data` (object) + > An optional payload object that can contain any properties. + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **201 Created** +> Created + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `DELETE` /v1/subscribers/{subscriberId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `GET` /v1/subscribers/{subscriberId} + + +###### Parameters: + +Added: `includeTopics` in `query` +> Includes the topics associated with the subscriber + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `PUT` /v1/subscribers/{subscriberId} + + +###### Request: + +Changed content type : `application/json` + +* Added property `channels` (array) + + Items (string): + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `PUT` /v1/subscribers/{subscriberId}/credentials + + +###### Request: + +Changed content type : `application/json` + +* Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `PATCH` /v1/subscribers/{subscriberId}/credentials + + +###### Request: + +Changed content type : `application/json` + +* Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `PATCH` /v1/subscribers/{subscriberId}/online-status + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + +##### `GET` /v1/subscribers/{subscriberId}/preferences + + +###### Parameters: + +Added: `includeInactiveChannels` in `query` +> A flag which specifies if the inactive workflow channels should be included in the retrieved preferences. Default is true + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `PATCH` /v1/subscribers/{subscriberId}/preferences + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + +##### `POST` /v1/topics + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **201 Created** +> Created + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `key` + + * Added property `_id` (string) + > The unique identifier for the Topic created. + + + * Added property `key` (string) + > User defined custom key and provided by the user that will be an unique identifier for the Topic created. + + +##### `GET` /v1/topics + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +##### `GET` /v1/notifications/{notificationId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + * Changed property `channels` (array) + + Changed items (string): + + Added enum value: + + * `custom` + Added enum value: + + * `custom` + * Changed property `jobs` (array) + + Changed items (object -> string): + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object -> string): + +##### `GET` /v1/integrations + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> The list of integrations belonging to the organization that are successfully returned. + + +* Changed content type : `application/json` + + Changed items (object): + + New optional properties: + - `deletedAt` + - `deletedBy` + + * Changed property `_id` (string) + > The unique identifier of the integration record in the database. This is automatically generated. + + + * Changed property `_environmentId` (string) + > The unique identifier for the environment associated with this integration. This links to the Environment collection. + + + * Changed property `_organizationId` (string) + > The unique identifier for the organization that owns this integration. This links to the Organization collection. + + + * Changed property `name` (string) + > The name of the integration, which is used to identify it in the user interface. + + + * Changed property `identifier` (string) + > A unique string identifier for the integration, often used for API calls or internal references. + + + * Changed property `providerId` (string) + > The identifier for the provider of the integration (e.g., "mailgun", "twilio"). + + + * Changed property `channel` (string) + > The channel type for the integration, which defines how the integration communicates (e.g., email, SMS). + + + * Changed property `credentials` (object -> object) + > The credentials required for the integration to function, including API keys and other sensitive information. + + + * Changed property `active` (boolean) + > Indicates whether the integration is currently active. An active integration will process events and messages. + + + * Changed property `deleted` (boolean) + > Indicates whether the integration has been marked as deleted (soft delete). + + + * Changed property `deletedAt` (string) + > The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted. + + + * Changed property `deletedBy` (string) + > The identifier of the user who performed the deletion of this integration. Useful for audit trails. + + + * Changed property `primary` (boolean) + > Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing. + + + * Changed property `conditions` (array) + > An array of conditions associated with the integration that may influence its behavior or processing logic. + + +##### `POST` /v1/integrations + + +###### Request: + +Changed content type : `application/json` + +* Changed property `name` (string) + > The name of the integration + + +* Changed property `identifier` (string) + > The unique identifier for the integration + + +* Changed property `_environmentId` (string -> string) + > The ID of the associated environment + + +* Changed property `providerId` (string) + > The provider ID for the integration + + +* Changed property `channel` (string) + > The channel type for the integration + + +* Changed property `credentials` (object -> object) + > The credentials for the integration + + +* Changed property `active` (boolean) + > If the integration is active, the validation on the credentials field will run + + +* Changed property `check` (boolean) + > Flag to check the integration status + + +* Changed property `conditions` (array) + > Conditions for the integration + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **201 Created** +> Created + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New optional properties: + - `deletedAt` + - `deletedBy` + + * Changed property `_id` (string) + > The unique identifier of the integration record in the database. This is automatically generated. + + + * Changed property `_environmentId` (string) + > The unique identifier for the environment associated with this integration. This links to the Environment collection. + + + * Changed property `_organizationId` (string) + > The unique identifier for the organization that owns this integration. This links to the Organization collection. + + + * Changed property `name` (string) + > The name of the integration, which is used to identify it in the user interface. + + + * Changed property `identifier` (string) + > A unique string identifier for the integration, often used for API calls or internal references. + + + * Changed property `providerId` (string) + > The identifier for the provider of the integration (e.g., "mailgun", "twilio"). + + + * Changed property `channel` (string) + > The channel type for the integration, which defines how the integration communicates (e.g., email, SMS). + + + * Changed property `credentials` (object -> object) + > The credentials required for the integration to function, including API keys and other sensitive information. + + + * Changed property `active` (boolean) + > Indicates whether the integration is currently active. An active integration will process events and messages. + + + * Changed property `deleted` (boolean) + > Indicates whether the integration has been marked as deleted (soft delete). + + + * Changed property `deletedAt` (string) + > The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted. + + + * Changed property `deletedBy` (string) + > The identifier of the user who performed the deletion of this integration. Useful for audit trails. + + + * Changed property `primary` (boolean) + > Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing. + + + * Changed property `conditions` (array) + > An array of conditions associated with the integration that may influence its behavior or processing logic. + + +##### `GET` /v1/integrations/active + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> The list of active integrations belonging to the organization that are successfully returned. + + +* Changed content type : `application/json` + + Changed items (object): + + New optional properties: + - `deletedAt` + - `deletedBy` + + * Changed property `_id` (string) + > The unique identifier of the integration record in the database. This is automatically generated. + + + * Changed property `_environmentId` (string) + > The unique identifier for the environment associated with this integration. This links to the Environment collection. + + + * Changed property `_organizationId` (string) + > The unique identifier for the organization that owns this integration. This links to the Organization collection. + + + * Changed property `name` (string) + > The name of the integration, which is used to identify it in the user interface. + + + * Changed property `identifier` (string) + > A unique string identifier for the integration, often used for API calls or internal references. + + + * Changed property `providerId` (string) + > The identifier for the provider of the integration (e.g., "mailgun", "twilio"). + + + * Changed property `channel` (string) + > The channel type for the integration, which defines how the integration communicates (e.g., email, SMS). + + + * Changed property `credentials` (object -> object) + > The credentials required for the integration to function, including API keys and other sensitive information. + + + * Changed property `active` (boolean) + > Indicates whether the integration is currently active. An active integration will process events and messages. + + + * Changed property `deleted` (boolean) + > Indicates whether the integration has been marked as deleted (soft delete). + + + * Changed property `deletedAt` (string) + > The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted. + + + * Changed property `deletedBy` (string) + > The identifier of the user who performed the deletion of this integration. Useful for audit trails. + + + * Changed property `primary` (boolean) + > Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing. + + + * Changed property `conditions` (array) + > An array of conditions associated with the integration that may influence its behavior or processing logic. + + +##### `PUT` /v1/integrations/{integrationId} + + +###### Request: + +Changed content type : `application/json` + +* Added property `removeNovuBranding` (boolean) + > If true, the Novu branding will be removed from the Inbox component + + +* Changed property `credentials` (object) + + * Added property `channelId` (string) + + * Added property `phoneNumberIdentification` (string) + + * Added property `accessKey` (string) + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New optional properties: + - `deletedAt` + - `deletedBy` + + * Changed property `_id` (string) + > The unique identifier of the integration record in the database. This is automatically generated. + + + * Changed property `_environmentId` (string) + > The unique identifier for the environment associated with this integration. This links to the Environment collection. + + + * Changed property `_organizationId` (string) + > The unique identifier for the organization that owns this integration. This links to the Organization collection. + + + * Changed property `name` (string) + > The name of the integration, which is used to identify it in the user interface. + + + * Changed property `identifier` (string) + > A unique string identifier for the integration, often used for API calls or internal references. + + + * Changed property `providerId` (string) + > The identifier for the provider of the integration (e.g., "mailgun", "twilio"). + + + * Changed property `channel` (string) + > The channel type for the integration, which defines how the integration communicates (e.g., email, SMS). + + + * Changed property `credentials` (object -> object) + > The credentials required for the integration to function, including API keys and other sensitive information. + + + * Changed property `active` (boolean) + > Indicates whether the integration is currently active. An active integration will process events and messages. + + + * Changed property `deleted` (boolean) + > Indicates whether the integration has been marked as deleted (soft delete). + + + * Changed property `deletedAt` (string) + > The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted. + + + * Changed property `deletedBy` (string) + > The identifier of the user who performed the deletion of this integration. Useful for audit trails. + + + * Changed property `primary` (boolean) + > Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing. + + + * Changed property `conditions` (array) + > An array of conditions associated with the integration that may influence its behavior or processing logic. + + +##### `DELETE` /v1/integrations/{integrationId} + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + New optional properties: + - `deletedAt` + - `deletedBy` + + * Changed property `_id` (string) + > The unique identifier of the integration record in the database. This is automatically generated. + + + * Changed property `_environmentId` (string) + > The unique identifier for the environment associated with this integration. This links to the Environment collection. + + + * Changed property `_organizationId` (string) + > The unique identifier for the organization that owns this integration. This links to the Organization collection. + + + * Changed property `name` (string) + > The name of the integration, which is used to identify it in the user interface. + + + * Changed property `identifier` (string) + > A unique string identifier for the integration, often used for API calls or internal references. + + + * Changed property `providerId` (string) + > The identifier for the provider of the integration (e.g., "mailgun", "twilio"). + + + * Changed property `channel` (string) + > The channel type for the integration, which defines how the integration communicates (e.g., email, SMS). + + + * Changed property `credentials` (object -> object) + > The credentials required for the integration to function, including API keys and other sensitive information. + + + * Changed property `active` (boolean) + > Indicates whether the integration is currently active. An active integration will process events and messages. + + + * Changed property `deleted` (boolean) + > Indicates whether the integration has been marked as deleted (soft delete). + + + * Changed property `deletedAt` (string) + > The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted. + + + * Changed property `deletedBy` (string) + > The identifier of the user who performed the deletion of this integration. Useful for audit trails. + + + * Changed property `primary` (boolean) + > Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing. + + + * Changed property `conditions` (array) + > An array of conditions associated with the integration that may influence its behavior or processing logic. + + +##### `POST` /v1/integrations/{integrationId}/set-primary + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Deleted response : **201 Created** +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** +> OK + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New optional properties: + - `deletedAt` + - `deletedBy` + + * Changed property `_id` (string) + > The unique identifier of the integration record in the database. This is automatically generated. + + + * Changed property `_environmentId` (string) + > The unique identifier for the environment associated with this integration. This links to the Environment collection. + + + * Changed property `_organizationId` (string) + > The unique identifier for the organization that owns this integration. This links to the Organization collection. + + + * Changed property `name` (string) + > The name of the integration, which is used to identify it in the user interface. + + + * Changed property `identifier` (string) + > A unique string identifier for the integration, often used for API calls or internal references. + + + * Changed property `providerId` (string) + > The identifier for the provider of the integration (e.g., "mailgun", "twilio"). + + + * Changed property `channel` (string) + > The channel type for the integration, which defines how the integration communicates (e.g., email, SMS). + + + * Changed property `credentials` (object -> object) + > The credentials required for the integration to function, including API keys and other sensitive information. + + + * Changed property `active` (boolean) + > Indicates whether the integration is currently active. An active integration will process events and messages. + + + * Changed property `deleted` (boolean) + > Indicates whether the integration has been marked as deleted (soft delete). + + + * Changed property `deletedAt` (string) + > The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted. + + + * Changed property `deletedBy` (string) + > The identifier of the user who performed the deletion of this integration. Useful for audit trails. + + + * Changed property `primary` (boolean) + > Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing. + + + * Changed property `conditions` (array) + > An array of conditions associated with the integration that may influence its behavior or processing logic. + + +##### `POST` /v1/events/trigger/bulk + + +###### Request: + +Changed content type : `application/json` + +* Changed property `events` (array) + + Changed items (object): + + * Added property `bridgeUrl` (string) + > A URL to bridge for additional processing. + + + * Added property `controls` (object) + > Additional control configurations. + + + * Changed property `payload` (object) + > The payload object is used to pass additional custom information that could be + > used to render the workflow, or perform routing rules based on it. + > This data will also be available when fetching the notifications feed from the API to display certain parts of the UI. + + + * Changed property `overrides` (object) + > This could be used to override provider specific configurations + + + * Changed property `to` (array -> object) + > The recipients list of people who will receive the notification. + + + * Changed property `transactionId` (string) + > A unique identifier for this transaction, we will generate a UUID if not provided. + + + * Changed property `actor` (object) + > It is used to display the Avatar of the provided actor's subscriber id or actor object. + > If a new actor object is provided, we will create a new subscriber in our system + + + Updated `SubscriberPayloadDto` : + * Added property `channels` (array) + > An optional array of subscriber channels. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > An HTTP URL to the profile image of your subscriber. + + + * Changed property `locale` (string) + > The locale of the subscriber. + + + * Changed property `data` (object) + > An optional payload object that can contain any properties. + + + * Changed property `tenant` (object) + > It is used to specify a tenant context during trigger event. + > Existing tenants will be updated with the provided details. + + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **201 Created** +> Created + + +* Changed content type : `application/json` + + * Changed property `data` (array) + + Changed items (object): + + * Changed property `acknowledged` (boolean) + > Indicates whether the trigger was acknowledged or not + + + * Changed property `status` (string) + > Status of the trigger + + + Removed enum value: + + * `subscriber_id_missing` + * Changed property `error` (array) + > In case of an error, this field will contain the error message(s) + + + * Changed property `transactionId` (string) + > The returned transaction ID of the trigger + + +##### `GET` /v1/notifications + + +###### Parameters: + +Added: `after` in `query` + +Added: `before` in `query` + +Changed: `channels` in `query` + +Changed: `templates` in `query` + +Changed: `emails` in `query` + +Changed: `search` in `query` + +Changed: `subscriberIds` in `query` + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (array) + > Array of Activity notifications + + + Changed items (object): + + * Changed property `channels` (array) + + Changed items (string): + + Added enum value: + + * `custom` + Added enum value: + + * `custom` + * Changed property `jobs` (array) + + Changed items (object -> string): + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object -> string): + +##### `GET` /v1/messages + + +###### Parameters: + +Changed: `channel` in `query` + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **200 OK** + +* Changed content type : `application/json` + + * Changed property `data` (array) + > Array of Activity notifications + + + Changed items (object): + + * Changed property `channels` (array) + + Changed items (string): + + Added enum value: + + * `custom` + Added enum value: + + * `custom` + * Changed property `jobs` (array) + + Changed items (object -> string): + + * Changed property `template` (object) + + * Changed property `triggers` (array) + + Changed items (object -> string): + +##### `POST` /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} + + +###### Parameters: + +Changed: `type` in `path` + +###### Return Type: + +New response : **400 Bad Request** +> Bad Request + +New response : **404 Not Found** +> Not Found + +New response : **422 Unprocessable Entity** +> Unprocessable Entity + +Changed response : **409 Conflict** +> Conflict + +Deleted header : `Retry-After` + + +Deleted header : `Link` + + + +* Changed content type : `application/json` + +Changed response : **201 Created** +> Created + + +* Changed content type : `application/json` + + * Changed property `data` (object) + + New required properties: + - `createdAt` + - `read` + + New optional properties: + - `lastSeenDate` + + * Added property `lastReadDate` (string) + + * Added property `read` (boolean) + + * Changed property `_feedId` (string -> object) + + * Changed property `subscriber` (object) + + * Added property `topics` (array) + > An array of topics that the subscriber is subscribed to. + + + * Changed property `_id` (string) + > The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier. + + + * Changed property `firstName` (string) + > The first name of the subscriber. + + + * Changed property `lastName` (string) + > The last name of the subscriber. + + + * Changed property `email` (string) + > The email address of the subscriber. + + + * Changed property `phone` (string) + > The phone number of the subscriber. + + + * Changed property `avatar` (string) + > The URL of the subscriber's avatar image. + + + * Changed property `locale` (string) + > The locale setting of the subscriber, indicating their preferred language or region. + + + * Changed property `subscriberId` (string) + > The identifier used to create this subscriber, which typically corresponds to the user ID in your system. + + + * Changed property `isOnline` (boolean) + > Indicates whether the subscriber is currently online. + + + * Changed property `lastOnlineAt` (string) + > The timestamp indicating when the subscriber was last online, in ISO 8601 format. + + + * Changed property `_organizationId` (string) + > The unique identifier of the organization to which the subscriber belongs. + + + * Changed property `_environmentId` (string) + > The unique identifier of the environment associated with this subscriber. + + + * Changed property `deleted` (boolean) + > Indicates whether the subscriber has been deleted. + + + * Changed property `createdAt` (string) + > The timestamp indicating when the subscriber was created, in ISO 8601 format. + + + * Changed property `updatedAt` (string) + > The timestamp indicating when the subscriber was last updated, in ISO 8601 format. + + + * Changed property `__v` (number) + > The version of the subscriber document. + + + * Changed property `channels` (array) + > An array of channel settings associated with the subscriber. + + + Changed items (object): + + * Changed property `providerId` (string) + > The provider identifier for the credentials + + + Added enum value: + + * `whatsapp-business` + * Changed property `_integrationId` (string) + > The unique identifier of the integration associated with this channel. + + + * Changed property `content` (object) + + Updated `EmailBlock` : + * Changed property `styles` (object) + + New required properties: + - `textAlign` + + * Changed property `cta` (object) + + * Changed property `action` (object) + + * Changed property `buttons` (array) + + Changed items (object): + + * Changed property `type` (string) + + Removed enum value: + + * `clicked` + * Changed property `result` (object) + + * Changed property `type` (string) + + Removed enum value: + + * `clicked` diff --git a/specs/go.sh b/specs/go.sh new file mode 100644 index 0000000..3d9aa6c --- /dev/null +++ b/specs/go.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +## latest +# https://github.com/novuhq/novu/pkgs/container/novu%2Fapi +# current 2.0.6 (jan 2025) +wget https://api.novu.co/openapi.json \ No newline at end of file diff --git a/specs/openapi-0.18.0.json b/specs/openapi-0.18.0.json new file mode 100644 index 0000000..7af4cf3 --- /dev/null +++ b/specs/openapi-0.18.0.json @@ -0,0 +1,6684 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/inbound-parse/mx/status": { + "get": { + "operationId": "InboundParseController_getMxRecordStatus", + "summary": "Validate the mx record setup for the inbound parse functionality", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetMxRecordResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Inbound Parse" + ] + } + }, + "/v1/environments/me": { + "get": { + "operationId": "EnvironmentsController_getCurrentEnvironment", + "summary": "Get current environment", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments": { + "post": { + "operationId": "EnvironmentsController_createEnvironment", + "summary": "Create environment", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEnvironmentRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + }, + "get": { + "operationId": "EnvironmentsController_getMyEnvironments", + "summary": "Get environments", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/{environmentId}": { + "put": { + "operationId": "EnvironmentsController_updateMyEnvironment", + "summary": "Update env by id", + "parameters": [ + { + "name": "environmentId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEnvironmentRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/api-keys": { + "get": { + "operationId": "EnvironmentsController_getOrganizationApiKeys", + "summary": "Get api keys", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/api-keys/regenerate": { + "post": { + "operationId": "EnvironmentsController_regenerateOrganizationApiKeys", + "summary": "Regenerate api keys", + "parameters": [], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/notification-groups": { + "post": { + "operationId": "NotificationGroupsController_createNotificationGroup", + "summary": "Create workflow group", + "description": "workflow group was previously named notification group", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationGroupRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "get": { + "operationId": "NotificationGroupsController_getNotificationGroups", + "summary": "Get workflow groups", + "description": "workflow group was previously named notification group", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + } + }, + "/v1/notification-groups/{id}": { + "get": { + "operationId": "NotificationGroupsController_getNotificationGroup", + "summary": "Get workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "patch": { + "operationId": "NotificationGroupsController_updateNotificationGroup", + "summary": "Update workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationGroupRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "delete": { + "operationId": "NotificationGroupsController_deleteNotificationGroup", + "summary": "Delete workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteNotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + } + }, + "/v1/changes": { + "get": { + "operationId": "ChangesController_getChanges", + "summary": "Get changes", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + }, + { + "name": "promoted", + "required": true, + "in": "query", + "schema": { + "default": "false", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangesResponseDto" + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/count": { + "get": { + "operationId": "ChangesController_getChangesCount", + "summary": "Get changes count", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataNumberDto" + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/bulk/apply": { + "post": { + "operationId": "ChangesController_bulkApplyDiff", + "summary": "Apply changes", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkApplyChangeDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/{changeId}/apply": { + "post": { + "operationId": "ChangesController_applyDiff", + "summary": "Apply change", + "parameters": [ + { + "name": "changeId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/layouts": { + "post": { + "operationId": "LayoutsController_createLayout", + "summary": "Layout creation", + "description": "Create a layout", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateLayoutRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateLayoutResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Layouts" + ] + }, + "get": { + "operationId": "LayoutsController_filterLayouts", + "summary": "Filter layouts", + "description": "Returns a list of layouts that can be paginated using the `page` query parameter and filtered by the environment where it is executed from the organization the user belongs to.", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "Number of page for the pagination", + "schema": { + "minimum": 0, + "type": "number" + } + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "description": "Size of page for the pagination", + "schema": { + "minimum": 0, + "type": "number" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "Sort field. Currently only supported `createdAt`", + "schema": { + "type": "string" + } + }, + { + "name": "orderBy", + "required": false, + "in": "query", + "description": "Direction of the sorting query param. Either ascending (1) or descending (-1)", + "schema": { + "enum": [ + 1, + -1 + ], + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "The list of layouts that match the criteria of the query params are successfully returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterLayoutsResponseDto" + } + } + } + }, + "400": { + "description": "Page size can not be larger than the page size limit." + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/layouts/{layoutId}": { + "get": { + "operationId": "LayoutsController_getLayout", + "summary": "Get layout", + "description": "Get a layout by its ID", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetLayoutResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database." + } + }, + "tags": [ + "Layouts" + ] + }, + "delete": { + "operationId": "LayoutsController_deleteLayout", + "summary": "Delete layout", + "description": "Execute a soft delete of a layout given a certain ID.", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The layout has been deleted correctly" + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be deleted." + }, + "409": { + "description": "Either you are trying to delete a layout that is being used or a layout that is the default in the environment." + } + }, + "tags": [ + "Layouts" + ] + }, + "patch": { + "operationId": "LayoutsController_updateLayout", + "summary": "Update a layout", + "description": "Update the name, content and variables of a layout. Also change it to be default or no.", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateLayoutRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateLayoutResponseDto" + } + } + } + } + } + }, + "400": { + "description": "The payload provided or the URL param are not right." + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be updated." + }, + "409": { + "description": "One default layout is needed. If you are trying to turn a default layout as not default, you should turn a different layout as default first and automatically it will be done by the system." + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/layouts/{layoutId}/default": { + "post": { + "operationId": "LayoutsController_setDefaultLayout", + "summary": "Set default layout", + "description": "Sets the default layout for the environment and updates to non default to the existing default layout (if any).", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The selected layout has been set as the default for the environment." + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be set as the default for the environment." + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/integrations": { + "get": { + "operationId": "IntegrationsController_getIntegrations", + "summary": "Get integrations", + "description": "Return all the integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change", + "parameters": [], + "responses": { + "200": { + "description": "The list of integrations belonging to the organization that are successfully returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + }, + "tags": [ + "Integrations" + ] + }, + "post": { + "operationId": "IntegrationsController_createIntegration", + "summary": "Create integration", + "description": "Create an integration for the current environment the user is based on the API key provided", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIntegrationRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/active": { + "get": { + "operationId": "IntegrationsController_getActiveIntegrations", + "summary": "Get active integrations", + "description": "Return all the active integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change", + "parameters": [], + "responses": { + "200": { + "description": "The list of active integrations belonging to the organization that are successfully returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/webhook/provider/{providerId}/status": { + "get": { + "operationId": "IntegrationsController_getWebhookSupportStatus", + "summary": "Get webhook support status for provider", + "description": "Return the status of the webhook for this provider, if it is supported or if it is not based on a boolean value", + "parameters": [ + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The status of the webhook for the provider requested", + "content": { + "application/json": { + "schema": { + "type": "boolean" + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{integrationId}": { + "put": { + "operationId": "IntegrationsController_updateIntegrationById", + "summary": "Update integration", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegrationRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The integration with the integrationId provided does not exist in the database." + } + }, + "tags": [ + "Integrations" + ] + }, + "delete": { + "operationId": "IntegrationsController_removeIntegration", + "summary": "Delete integration", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{integrationId}/set-primary": { + "post": { + "operationId": "IntegrationsController_setIntegrationAsPrimary", + "summary": "Set integration as primary", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + }, + "404": { + "description": "The integration with the integrationId provided does not exist in the database." + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{channelType}/limit": { + "get": { + "operationId": "IntegrationsController_getProviderLimit", + "parameters": [ + { + "name": "channelType", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ChannelTypeLimitDto" + } + } + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/in-app/status": { + "get": { + "operationId": "IntegrationsController_getInAppActivated", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/execution-details": { + "get": { + "operationId": "ExecutionDetailsController_getExecutionDetailsForNotification", + "summary": "Get execution details", + "parameters": [ + { + "name": "notificationId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExecutionDetailsResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Execution Details" + ] + } + }, + "/v1/notification-templates": { + "get": { + "operationId": "NotificationTemplateController_getNotificationTemplates", + "summary": "Get Notification templates", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "post": { + "operationId": "NotificationTemplateController_createNotificationTemplates", + "summary": "Create Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{templateId}": { + "put": { + "operationId": "NotificationTemplateController_updateTemplateById", + "summary": "Update Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "delete": { + "operationId": "NotificationTemplateController_deleteTemplateById", + "summary": "Delete Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "get": { + "operationId": "NotificationTemplateController_getNotificationTemplateById", + "summary": "Get Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{templateId}/status": { + "put": { + "operationId": "NotificationTemplateController_changeActiveStatus", + "summary": "Update Notification template status", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeWorkflowStatusRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/workflows": { + "get": { + "operationId": "WorkflowController_getWorkflows", + "summary": "Get workflows", + "description": "Workflows were previously named notification templates", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "post": { + "operationId": "WorkflowController_createWorkflows", + "summary": "Create workflow", + "description": "Workflow was previously named notification template", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowId}": { + "put": { + "operationId": "WorkflowController_updateWorkflowById", + "summary": "Update workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "delete": { + "operationId": "WorkflowController_deleteWorkflowById", + "summary": "Delete workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "get": { + "operationId": "WorkflowController_getWorkflowById", + "summary": "Get workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowId}/status": { + "put": { + "operationId": "WorkflowController_changeActiveStatus", + "summary": "Update workflow status", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeWorkflowStatusRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/events/trigger": { + "post": { + "operationId": "EventsController_trackEvent", + "summary": "Trigger event", + "description": "\n Trigger event is the main (and only) way to send notifications to subscribers. \n The trigger identifier is used to match the particular workflow associated with it. \n Additional information can be passed according the body interface below.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/bulk": { + "post": { + "operationId": "EventsController_triggerBulkEvents", + "summary": "Bulk trigger event", + "description": "\n Using this endpoint you can trigger multiple events at once, to avoid multiple calls to the API.\n The bulk API is limited to 100 events per request.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkTriggerEventDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/broadcast": { + "post": { + "operationId": "EventsController_trackEventToAll", + "summary": "Broadcast event to all", + "description": "Trigger a broadcast event to all existing subscribers, could be used to send announcements, etc.\n In the future could be used to trigger events to a subset of subscribers based on defined filters.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventToAllRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/{transactionId}": { + "delete": { + "operationId": "EventsController_cancelDelayed", + "summary": "Cancel triggered event", + "description": "\n Using a previously generated transactionId during the event trigger,\n will cancel any active or pending workflows. This is useful to cancel active digests, delays etc...\n ", + "parameters": [ + { + "name": "transactionId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/subscribers": { + "get": { + "operationId": "SubscribersController_getSubscribers", + "summary": "Get subscribers", + "description": "Returns a list of subscribers, could paginated using the `page` and `limit` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + ] + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "post": { + "operationId": "SubscribersController_createSubscriber", + "summary": "Create subscriber", + "description": "Creates a subscriber entity, in the Novu platform. The subscriber will be later used to receive notifications, and access notification feeds. Communication credentials such as email, phone number, and 3 rd party credentials i.e slack tokens could be later associated to this entity.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSubscriberRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}": { + "get": { + "operationId": "SubscribersController_getSubscriber", + "summary": "Get subscriber", + "description": "Get subscriber by your internal id used to identify the subscriber", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "put": { + "operationId": "SubscribersController_updateSubscriber", + "summary": "Update subscriber", + "description": "Used to update the subscriber entity with new information", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "delete": { + "operationId": "SubscribersController_removeSubscriber", + "summary": "Delete subscriber", + "description": "Deletes a subscriber entity from the Novu platform", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteSubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials": { + "put": { + "operationId": "SubscribersController_updateSubscriberChannel", + "summary": "Update subscriber credentials", + "description": "Subscriber credentials associated to the delivery methods such as slack and push tokens.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberChannelRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}": { + "delete": { + "operationId": "SubscribersController_deleteSubscriberCredentials", + "summary": "Delete subscriber credentials by providerId", + "description": "Delete subscriber credentials such as slack and expo tokens.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "" + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/online-status": { + "patch": { + "operationId": "SubscribersController_updateSubscriberOnlineFlag", + "summary": "Update subscriber online status", + "description": "Used to update the subscriber isOnline flag.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberOnlineFlagRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences": { + "get": { + "operationId": "SubscribersController_getSubscriberPreference", + "summary": "Get subscriber preferences", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences/{templateId}": { + "patch": { + "operationId": "SubscribersController_updateSubscriberPreference", + "summary": "Update subscriber preference", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/notifications/feed": { + "get": { + "operationId": "SubscribersController_getNotificationsFeed", + "summary": "Get in-app notification feed for a particular subscriber", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + }, + { + "name": "read", + "required": false, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "seen", + "required": false, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "payload", + "required": false, + "in": "query", + "description": "Base64 encoded string of the partial payload JSON object", + "example": "btoa(JSON.stringify({ foo: 123 })) results in base64 encoded string like eyJmb28iOjEyM30=", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + ] + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/notifications/unseen": { + "get": { + "operationId": "SubscribersController_getUnseenCount", + "summary": "Get the unseen in-app notifications count for subscribers feed", + "parameters": [ + { + "name": "seen", + "required": true, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "required": true, + "in": "query", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UnseenCountResponse" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/markAs": { + "post": { + "operationId": "SubscribersController_markMessageAs", + "summary": "Mark a subscriber feed message as seen", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkMessageAsRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/mark-all": { + "post": { + "operationId": "SubscribersController_markAllUnreadAsRead", + "summary": "Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkAllMessageAsRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "number" + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}": { + "post": { + "operationId": "SubscribersController_markActionAsSeen", + "summary": "Mark message action as seen", + "parameters": [ + { + "name": "messageId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "type", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkMessageActionAsSeenDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback": { + "get": { + "operationId": "SubscribersController_chatOauthCallback", + "summary": "Handle providers oauth redirect", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "code", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "hmacHash", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "integrationIdentifier", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth": { + "get": { + "operationId": "SubscribersController_chatAccessOauth", + "summary": "Handle chat oauth", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "hmacHash", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "integrationIdentifier", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/topics": { + "post": { + "operationId": "TopicsController_createTopic", + "summary": "Topic creation", + "description": "Create a topic", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTopicRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateTopicResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "get": { + "operationId": "TopicsController_filterTopics", + "summary": "Filter topics", + "description": "Returns a list of topics that can be paginated using the `page` query parameter and filtered by the topic key with the `key` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "Number of page for the pagination", + "schema": { + "minimum": 0, + "default": 0, + "type": "number" + } + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "description": "Size of page for the pagination", + "schema": { + "minimum": 0, + "default": 10, + "type": "number" + } + }, + { + "name": "key", + "required": false, + "in": "query", + "description": "Topic key", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterTopicsResponseDto" + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers": { + "post": { + "operationId": "TopicsController_addSubscribers", + "summary": "Subscribers addition", + "description": "Add subscribers to a topic by key", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSubscribersRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "" + }, + "204": { + "description": "" + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers/{externalSubscriberId}": { + "get": { + "operationId": "TopicsController_getTopicSubscriber", + "summary": "Check topic subscriber", + "description": "Check if a subscriber belongs to a certain topic", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "externalSubscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TopicSubscriberDto" + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers/removal": { + "post": { + "operationId": "TopicsController_removeSubscribers", + "summary": "Subscribers removal", + "description": "Remove subscribers from a topic", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveSubscribersRequestDto" + } + } + } + }, + "responses": { + "204": { + "description": "" + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}": { + "delete": { + "operationId": "TopicsController_deleteTopic", + "summary": "Delete topic", + "description": "Delete a topic by its topic key if it has no subscribers", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The topic has been deleted correctly" + }, + "404": { + "description": "The topic with the key provided does not exist in the database so it can not be deleted." + }, + "409": { + "description": "The topic you are trying to delete has subscribers assigned to it. Delete the subscribers before deleting the topic." + } + }, + "tags": [ + "Topics" + ] + }, + "get": { + "operationId": "TopicsController_getTopic", + "summary": "Get topic", + "description": "Get a topic by its topic key", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetTopicResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "patch": { + "operationId": "TopicsController_renameTopic", + "summary": "Rename a topic", + "description": "Rename a topic by providing a new name", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RenameTopicRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/RenameTopicResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/notifications": { + "get": { + "operationId": "NotificationsController_getNotifications", + "summary": "Get notifications", + "parameters": [ + { + "name": "channels", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ] + } + } + }, + { + "name": "templates", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "emails", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "search", + "required": true, + "in": "query", + "deprecated": true, + "schema": { + "type": "string" + } + }, + { + "name": "subscriberIds", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 0, + "type": "number" + } + }, + { + "name": "transactionId", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivitiesResponseDto" + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/stats": { + "get": { + "operationId": "NotificationsController_getActivityStats", + "summary": "Get notification statistics", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ActivityStatsResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/graph/stats": { + "get": { + "operationId": "NotificationsController_getActivityGraphStats", + "summary": "Get notification graph statistics", + "parameters": [ + { + "name": "days", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityGraphStatesResponse" + } + } + } + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/{notificationId}": { + "get": { + "operationId": "NotificationsController_getActivity", + "summary": "Get notification", + "parameters": [ + { + "name": "notificationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ActivityNotificationResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/feeds": { + "post": { + "operationId": "FeedsController_createFeed", + "summary": "Create feed", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateFeedRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Feeds" + ] + }, + "get": { + "operationId": "FeedsController_getFeeds", + "summary": "Get feeds", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Feeds" + ] + } + }, + "/v1/feeds/{feedId}": { + "delete": { + "operationId": "FeedsController_deleteFeedById", + "summary": "Delete feed", + "parameters": [ + { + "name": "feedId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Feeds" + ] + } + }, + "/v1/messages": { + "get": { + "operationId": "MessagesController_getMessages", + "summary": "Get messages", + "description": "Returns a list of messages, could paginate using the `page` query parameter", + "parameters": [ + { + "name": "channel", + "required": false, + "in": "query", + "schema": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + } + }, + { + "name": "subscriberId", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "transactionId", + "required": false, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 0, + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivitiesResponseDto" + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/messages/{messageId}": { + "delete": { + "operationId": "MessagesController_deleteMessage", + "summary": "Delete message", + "description": "Deletes a message entity from the Novu platform", + "parameters": [ + { + "name": "messageId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteMessageResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/blueprints/group-by-category": { + "get": { + "operationId": "BlueprintController_getGroupedBlueprints", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupedBlueprintResponse" + } + } + } + } + } + } + }, + "/v1/blueprints/{templateId}": { + "get": { + "operationId": "BlueprintController_getBlueprintById", + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetBlueprintResponse" + } + } + } + } + } + } + } + }, + "info": { + "title": "Novu API", + "description": "The Novu API description", + "version": "1.0", + "contact": {} + }, + "tags": [ + { + "name": "Events", + "description": "" + }, + { + "name": "Subscribers", + "description": "" + }, + { + "name": "Topics", + "description": "" + }, + { + "name": "Notification", + "description": "" + }, + { + "name": "Integrations", + "description": "" + }, + { + "name": "Layouts", + "description": "" + }, + { + "name": "Workflows", + "description": "" + }, + { + "name": "Notification Templates", + "description": "" + }, + { + "name": "Workflow groups", + "description": "" + }, + { + "name": "Changes", + "description": "" + }, + { + "name": "Environments", + "description": "" + }, + { + "name": "Inbound Parse", + "description": "" + }, + { + "name": "Feeds", + "description": "" + }, + { + "name": "Messages", + "description": "" + }, + { + "name": "Execution Details", + "description": "" + } + ], + "servers": [], + "components": { + "schemas": { + "DataWrapperDto": { + "type": "object", + "properties": { + "data": { + "type": "object" + } + }, + "required": [ + "data" + ] + }, + "GetMxRecordResponseDto": { + "type": "object", + "properties": { + "mxRecordConfigured": { + "type": "boolean" + } + }, + "required": [ + "mxRecordConfigured" + ] + }, + "ApiKey": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "_userId": { + "type": "string" + } + }, + "required": [ + "key", + "_userId" + ] + }, + "EnvironmentResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "apiKeys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_organizationId", + "identifier", + "apiKeys", + "_parentId" + ] + }, + "CreateEnvironmentRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "parentId": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "InBoundParseDomainDto": { + "type": "object", + "properties": { + "inboundParseDomain": { + "type": "string" + } + } + }, + "UpdateEnvironmentRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "parentId": { + "type": "string" + }, + "dns": { + "$ref": "#/components/schemas/InBoundParseDomainDto" + } + } + }, + "NotificationGroupResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_environmentId", + "_organizationId" + ] + }, + "CreateNotificationGroupRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "DeleteNotificationGroupResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "ChangeResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_entityId": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "type": { + "enum": [ + "Feed", + "MessageTemplate", + "Layout", + "DefaultLayout", + "NotificationTemplate", + "NotificationGroup" + ], + "type": "string" + }, + "change": { + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_creatorId", + "_environmentId", + "_organizationId", + "_entityId", + "enabled", + "type", + "change", + "createdAt" + ] + }, + "ChangesResponseDto": { + "type": "object", + "properties": { + "totalCount": { + "type": "number" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "totalCount", + "data", + "pageSize", + "page" + ] + }, + "DataNumberDto": { + "type": "object", + "properties": { + "data": { + "type": "number" + } + }, + "required": [ + "data" + ] + }, + "BulkApplyChangeDto": { + "type": "object", + "properties": { + "changeIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "changeIds" + ] + }, + "CreateLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + } + }, + "required": [ + "_id" + ] + }, + "CreateLayoutRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Layout created." + }, + "description": { + "type": "string", + "description": "User description of the layout" + }, + "content": { + "type": "string", + "description": "User defined content for the layout." + }, + "variables": { + "description": "User defined variables to render in the layout placeholders.", + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean", + "description": "Variable that defines if the layout is chosen as default when creating a layout." + } + }, + "required": [ + "name", + "content" + ] + }, + "LayoutDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "FilterLayoutsResponseDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LayoutDto" + } + }, + "page": { + "type": "number" + }, + "pageSize": { + "type": "number" + }, + "totalCount": { + "type": "number" + } + }, + "required": [ + "data", + "page", + "pageSize", + "totalCount" + ] + }, + "GetLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "UpdateLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "UpdateLayoutRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Layout updated." + }, + "description": { + "type": "string", + "description": "User defined description of the layout" + }, + "content": { + "type": "string", + "description": "User defined content for the layout." + }, + "variables": { + "description": "User defined variables to render in the layout placeholders.", + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean", + "description": "Variable that defines if the layout is chosen as default when creating a layout." + } + } + }, + "CredentialsDto": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + }, + "user": { + "type": "string" + }, + "secretKey": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "password": { + "type": "string" + }, + "host": { + "type": "string" + }, + "port": { + "type": "string" + }, + "secure": { + "type": "boolean" + }, + "region": { + "type": "string" + }, + "accountSid": { + "type": "string" + }, + "messageProfileId": { + "type": "string" + }, + "token": { + "type": "string" + }, + "from": { + "type": "string" + }, + "senderName": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "applicationId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "requireTls": { + "type": "boolean" + }, + "ignoreTls": { + "type": "boolean" + }, + "tlsOptions": { + "type": "object" + }, + "baseUrl": { + "type": "string" + }, + "webhookUrl": { + "type": "string" + }, + "redirectUrl": { + "type": "string" + }, + "hmac": { + "type": "boolean" + }, + "serviceAccount": { + "type": "string" + }, + "ipPoolName": { + "type": "string" + } + } + }, + "IntegrationResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "active": { + "type": "boolean" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + } + }, + "required": [ + "_environmentId", + "_organizationId", + "name", + "identifier", + "providerId", + "channel", + "credentials", + "active", + "deleted", + "deletedAt", + "deletedBy" + ] + }, + "CreateIntegrationRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "active": { + "type": "boolean", + "description": "If the integration is active the validation on the credentials field will run" + }, + "check": { + "type": "boolean" + } + }, + "required": [ + "providerId", + "channel" + ] + }, + "UpdateIntegrationRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "active": { + "type": "boolean", + "description": "If the integration is active the validation on the credentials field will run" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "check": { + "type": "boolean" + } + } + }, + "ChannelTypeLimitDto": { + "type": "object", + "properties": { + "limit": { + "type": "number" + }, + "count": { + "type": "number" + } + }, + "required": [ + "limit", + "count" + ] + }, + "ExecutionDetailsResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_jobId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_notificationId": { + "type": "string" + }, + "_notificationTemplateId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "_messageId": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "transactionId": { + "type": "string" + }, + "channel": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "detail": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "Credentials", + "Internal", + "Payload", + "Webhook" + ] + }, + "status": { + "type": "string", + "enum": [ + "Success", + "Warning", + "Failed", + "Pending", + "Queued", + "ReadConfirmation" + ] + }, + "isTest": { + "type": "boolean" + }, + "isRetry": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_jobId", + "_environmentId", + "_notificationId", + "_notificationTemplateId", + "_subscriberId", + "transactionId", + "channel", + "detail", + "source", + "status", + "isTest", + "isRetry" + ] + }, + "NotificationGroup": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_environmentId", + "_organizationId" + ] + }, + "PreferenceChannels": { + "type": "object", + "properties": { + "email": { + "type": "boolean" + }, + "sms": { + "type": "boolean" + }, + "in_app": { + "type": "boolean" + }, + "chat": { + "type": "boolean" + }, + "push": { + "type": "boolean" + } + } + }, + "DigestRegularMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "digestKey": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "regular", + "backoff" + ] + }, + "backoff": { + "type": "boolean" + }, + "backoffAmount": { + "type": "number" + }, + "backoffUnit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "updateMode": { + "type": "boolean" + } + }, + "required": [ + "type" + ] + }, + "TimedConfig": { + "type": "object", + "properties": { + "atTime": { + "type": "string" + }, + "weekDays": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday" + ] + } + }, + "monthDays": { + "type": "array", + "items": { + "type": "string" + } + }, + "ordinal": { + "type": "string", + "enum": [ + "1", + "2", + "3", + "4", + "5", + "last" + ] + }, + "ordinalValue": { + "type": "string", + "enum": [ + "day", + "weekday", + "weekend", + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday" + ] + }, + "monthlyType": { + "type": "string", + "enum": [ + "each", + "on" + ] + } + } + }, + "DigestTimedMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "digestKey": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "timed" + ] + }, + "timed": { + "$ref": "#/components/schemas/TimedConfig" + } + }, + "required": [ + "type" + ] + }, + "DelayRegularMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "type": { + "type": "string", + "enum": [ + "regular" + ] + } + }, + "required": [ + "type" + ] + }, + "DelayScheduledMetadata": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "scheduled" + ] + }, + "delayPath": { + "type": "string" + } + }, + "required": [ + "type", + "delayPath" + ] + }, + "MessageTemplate": { + "type": "object", + "properties": {} + }, + "FieldFilterPart": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + }, + "operator": { + "type": "string", + "enum": [ + "LARGER", + "SMALLER", + "LARGER_EQUAL", + "SMALLER_EQUAL", + "EQUAL", + "NOT_EQUAL", + "ALL_IN", + "ANY_IN", + "NOT_IN", + "BETWEEN", + "NOT_BETWEEN", + "LIKE", + "NOT_LIKE", + "IN" + ] + }, + "on": { + "type": "string", + "enum": [ + "subscriber", + "payload" + ] + } + }, + "required": [ + "field", + "value", + "operator", + "on" + ] + }, + "StepFilter": { + "type": "object", + "properties": { + "isNegated": { + "type": "boolean" + }, + "type": { + "type": "string", + "enum": [ + "BOOLEAN", + "TEXT", + "DATE", + "NUMBER", + "STATEMENT", + "LIST", + "MULTI_LIST", + "GROUP" + ] + }, + "value": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "children": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FieldFilterPart" + } + } + }, + "required": [ + "isNegated", + "type", + "value", + "children" + ] + }, + "NotificationStep": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "shouldStopOnFail": { + "type": "boolean" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplate" + }, + "filters": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + }, + "_parentId": { + "type": "object" + }, + "metadata": { + "oneOf": [ + { + "$ref": "#/components/schemas/DigestRegularMetadata" + }, + { + "$ref": "#/components/schemas/DigestTimedMetadata" + }, + { + "$ref": "#/components/schemas/DelayRegularMetadata" + }, + { + "$ref": "#/components/schemas/DelayScheduledMetadata" + } + ] + }, + "replyCallback": { + "type": "object" + } + } + }, + "NotificationTriggerVariable": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "NotificationTrigger": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTriggerVariable" + } + }, + "subscriberVariables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTriggerVariable" + } + } + }, + "required": [ + "type", + "identifier", + "variables" + ] + }, + "WorkflowResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "critical": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "_organizationId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTrigger" + } + }, + "_notificationGroupId": { + "type": "string" + }, + "_parentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "notificationGroup": { + "$ref": "#/components/schemas/NotificationGroup" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "description", + "active", + "draft", + "preferenceSettings", + "critical", + "tags", + "steps", + "_organizationId", + "_creatorId", + "_environmentId", + "triggers", + "_notificationGroupId", + "deleted", + "deletedAt", + "deletedBy" + ] + }, + "UpdateWorkflowRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "maxLength": 300 + }, + "identifier": { + "type": "string" + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "notificationGroupId": { + "type": "string" + }, + "critical": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "notificationGroupId" + ] + }, + "DataBooleanDto": { + "type": "object", + "properties": { + "data": { + "type": "boolean" + } + }, + "required": [ + "data" + ] + }, + "CreateWorkflowRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "notificationGroupId": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "maxLength": 100 + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean", + "deprecated": true + }, + "critical": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "blueprintId": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "notificationGroupId", + "steps" + ] + }, + "ChangeWorkflowStatusRequestDto": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + } + }, + "required": [ + "active" + ] + }, + "TriggerEventResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "If trigger was acknowledged or not" + }, + "status": { + "type": "string", + "description": "Status for trigger", + "enum": [ + "processed", + "trigger_not_active", + "subscriber_id_missing", + "error" + ] + }, + "error": { + "description": "In case of an error, this field will contain the error message", + "type": "array", + "items": { + "type": "string" + } + }, + "transactionId": { + "type": "string", + "description": "Transaction id for trigger" + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "TopicPayloadDto": { + "type": "object", + "properties": { + "topicKey": { + "type": "string" + }, + "type": { + "enum": [ + "Subscriber", + "Topic" + ], + "type": "string", + "example": "Topic" + } + }, + "required": [ + "topicKey", + "type" + ] + }, + "SubscriberPayloadDto": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string", + "description": "An http url to the profile image of your subscriber" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "subscriberId" + ] + }, + "TriggerEventRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The trigger identifier of the workflow you wish to send. This identifier can be found on the workflow page." + }, + "payload": { + "type": "object", + "description": "The payload object is used to pass additional custom information that could be used to render the workflow, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.", + "example": { + "comment_id": "string", + "post": { + "text": "string" + } + } + }, + "overrides": { + "type": "object", + "description": "This could be used to override provider specific configurations", + "example": { + "fcm": { + "data": { + "key": "value" + } + } + } + }, + "to": { + "type": "array", + "items": { + "required": true, + "description": "The recipients list of people who will receive the notification.", + "oneOf": [ + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + }, + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems", + "example": "SUBSCRIBER_ID" + }, + { + "$ref": "#/components/schemas/TopicPayloadDto" + } + ], + "type": "array", + "items": { + "type": "object" + } + } + }, + "transactionId": { + "type": "string", + "description": "A unique identifier for this transaction, we will generated a UUID if not provided." + }, + "actor": { + "description": "It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems" + }, + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + } + ] + } + }, + "required": [ + "name", + "to" + ] + }, + "BulkTriggerEventDto": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TriggerEventRequestDto" + } + } + }, + "required": [ + "events" + ] + }, + "TriggerEventToAllRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The trigger identifier associated for the template you wish to send. This identifier can be found on the template page." + }, + "payload": { + "type": "object", + "description": "The payload object is used to pass additional custom information that could be used to render the template, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.", + "example": { + "comment_id": "string", + "post": { + "text": "string" + } + } + }, + "overrides": { + "type": "object", + "description": "This could be used to override provider specific configurations", + "example": { + "fcm": { + "data": { + "key": "value" + } + } + } + }, + "transactionId": { + "type": "string", + "description": "A unique identifier for this transaction, we will generated a UUID if not provided." + }, + "actor": { + "description": "It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems" + }, + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + } + ] + } + }, + "required": [ + "name", + "payload" + ] + }, + "PaginatedResponseDto": { + "type": "object", + "properties": { + "page": { + "type": "number", + "description": "The current page of the paginated response" + }, + "hasMore": { + "type": "boolean", + "description": "Does the list have more items to fetch" + }, + "pageSize": { + "type": "number", + "description": "Number of items on each page" + }, + "data": { + "description": "The list of items matching the query", + "type": "array", + "items": { + "type": "array" + } + } + }, + "required": [ + "page", + "hasMore", + "pageSize", + "data" + ] + }, + "ChannelCredentials": { + "type": "object", + "properties": { + "webhookUrl": { + "type": "string", + "description": "Webhook url used by chat app integrations. The webhook should be obtained from the chat app provider." + }, + "channel": { + "type": "string", + "description": "Channel specification for Mattermost chat notifications" + }, + "deviceTokens": { + "description": "Contains an array of the subscriber device tokens for a given provider. Used on Push integrations", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "webhookUrl" + ] + }, + "ChannelSettings": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "enum": [ + "slack", + "discord", + "msteams", + "mattermost", + "fcm", + "apns", + "expo", + "one-signal", + "push-webhook" + ], + "description": "The provider identifier for the credentials" + }, + "integrationIdentifier": { + "type": "string", + "description": "The integration identifier" + }, + "credentials": { + "description": "Credentials payload for the specified provider", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelCredentials" + } + ] + }, + "_integrationId": { + "type": "string", + "description": "Id of the integration that is used for this channel" + } + }, + "required": [ + "providerId", + "credentials", + "_integrationId" + ] + }, + "SubscriberResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "description": "The internal id novu generated for your subscriber, this is not the subscriberId matching your query. See `subscriberId` for that" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "channels": { + "description": "Channels settings for subscriber", + "type": "array", + "items": { + "$ref": "#/components/schemas/ChannelSettings" + } + }, + "isOnline": { + "type": "boolean" + }, + "lastOnlineAt": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "__v": { + "type": "number" + } + }, + "required": [ + "subscriberId", + "_organizationId", + "_environmentId", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "CreateSubscriberRequestDto": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string", + "description": "An http url to the profile image of your subscriber" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "subscriberId" + ] + }, + "UpdateSubscriberRequestDto": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + } + }, + "UpdateSubscriberChannelRequestDto": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "enum": [ + "slack", + "discord", + "msteams", + "mattermost", + "fcm", + "apns", + "expo", + "one-signal", + "push-webhook" + ], + "description": "The provider identifier for the credentials" + }, + "integrationIdentifier": { + "type": "string", + "description": "The integration identifier" + }, + "credentials": { + "description": "Credentials payload for the specified provider", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelCredentials" + } + ] + } + }, + "required": [ + "providerId", + "credentials" + ] + }, + "UpdateSubscriberOnlineFlagRequestDto": { + "type": "object", + "properties": { + "isOnline": { + "type": "boolean" + } + }, + "required": [ + "isOnline" + ] + }, + "DeleteSubscriberResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "TemplateResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "description": "Unique identifier of the workflow" + }, + "name": { + "type": "string", + "description": "Name of the workflow" + }, + "critical": { + "type": "boolean", + "description": "Critical templates will always be delivered to the end user and should be hidden from the subscriber preferences screen" + } + }, + "required": [ + "_id", + "name", + "critical" + ] + }, + "Preference": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Sets if the workflow is fully enabled for all channels or not for the subscriber." + }, + "channels": { + "description": "Subscriber preferences for the different channels regarding this workflow", + "allOf": [ + { + "$ref": "#/components/schemas/PreferenceChannels" + } + ] + } + }, + "required": [ + "enabled", + "channels" + ] + }, + "UpdateSubscriberPreferenceResponseDto": { + "type": "object", + "properties": { + "template": { + "description": "The workflow information and if it is critical or not", + "allOf": [ + { + "$ref": "#/components/schemas/TemplateResponse" + } + ] + }, + "preference": { + "description": "The preferences of the subscriber regarding the related workflow", + "allOf": [ + { + "$ref": "#/components/schemas/Preference" + } + ] + } + }, + "required": [ + "template", + "preference" + ] + }, + "ChannelPreference": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "description": "The type of channel that is enabled or not" + }, + "enabled": { + "type": "boolean", + "description": "If channel is enabled or not" + } + }, + "required": [ + "type", + "enabled" + ] + }, + "UpdateSubscriberPreferenceRequestDto": { + "type": "object", + "properties": { + "channel": { + "description": "The subscriber preferences for every ChannelTypeEnum for the workflow assigned.", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelPreference" + } + ] + }, + "enabled": { + "type": "boolean", + "description": "Sets if the workflow is fully enabled for all channels or not for the subscriber." + } + } + }, + "EmailBlockStyles": { + "type": "object", + "properties": { + "textAlign": { + "enum": [ + "left", + "right", + "center" + ], + "type": "string" + } + } + }, + "EmailBlock": { + "type": "object", + "properties": { + "type": { + "enum": [ + "text", + "button" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "url": { + "type": "string" + }, + "styles": { + "$ref": "#/components/schemas/EmailBlockStyles" + } + }, + "required": [ + "type", + "content" + ] + }, + "MessageCTAData": { + "type": "object", + "properties": { + "url": { + "type": "string" + } + } + }, + "MessageButton": { + "type": "object", + "properties": { + "type": { + "enum": [ + "primary", + "secondary", + "clicked" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "resultContent": { + "type": "string" + } + }, + "required": [ + "type", + "content" + ] + }, + "MessageActionResult": { + "type": "object", + "properties": { + "payload": { + "type": "object" + }, + "type": { + "enum": [ + "primary", + "secondary", + "clicked" + ], + "type": "string" + } + } + }, + "MessageAction": { + "type": "object", + "properties": { + "status": { + "enum": [ + "pending", + "done" + ], + "type": "string" + }, + "buttons": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageButton" + } + }, + "result": { + "$ref": "#/components/schemas/MessageActionResult" + } + } + }, + "MessageCTA": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "redirect" + ] + }, + "data": { + "$ref": "#/components/schemas/MessageCTAData" + }, + "action": { + "$ref": "#/components/schemas/MessageAction" + } + }, + "required": [ + "data" + ] + }, + "MessageResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_messageTemplateId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_notificationId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "subscriber": { + "$ref": "#/components/schemas/SubscriberResponseDto" + }, + "template": { + "$ref": "#/components/schemas/WorkflowResponse" + }, + "templateIdentifier": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "content": { + "oneOf": [ + { + "$ref": "#/components/schemas/EmailBlock" + }, + { + "type": "string" + } + ] + }, + "transactionId": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "seen": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "directWebhookUrl": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "deviceTokens": { + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "type": "string" + }, + "lastSeenDate": { + "type": "string" + }, + "cta": { + "$ref": "#/components/schemas/MessageCTA" + }, + "_feedId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "sent", + "error", + "warning" + ] + }, + "errorId": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "payload": { + "type": "object", + "description": "The payload that was used to send the notification trigger" + }, + "overrides": { + "type": "object", + "description": "Provider specific overrides used when triggering the notification" + } + }, + "required": [ + "_templateId", + "_environmentId", + "_messageTemplateId", + "_organizationId", + "_notificationId", + "_subscriberId", + "content", + "transactionId", + "channel", + "seen", + "lastSeenDate", + "cta", + "status", + "errorId", + "errorText", + "payload", + "overrides" + ] + }, + "UnseenCountResponse": { + "type": "object", + "properties": { + "count": { + "type": "number" + } + }, + "required": [ + "count" + ] + }, + "MarkMessageFields": { + "type": "object", + "properties": { + "seen": { + "type": "boolean" + }, + "read": { + "type": "boolean" + } + } + }, + "MarkMessageAsRequestDto": { + "type": "object", + "properties": { + "messageId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "mark": { + "$ref": "#/components/schemas/MarkMessageFields" + } + }, + "required": [ + "messageId", + "mark" + ] + }, + "MarkAllMessageAsRequestDto": { + "type": "object", + "properties": { + "feedIdentifier": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Optional feed identifier or array of feed identifiers" + }, + "markAs": { + "enum": [ + "read", + "seen", + "unread", + "unseen" + ], + "type": "string", + "description": "Mark all subscriber messages as read, unread, seen or unseen" + } + }, + "required": [ + "markAs" + ] + }, + "MarkMessageActionAsSeenDto": { + "type": "object", + "properties": { + "status": { + "enum": [ + "pending", + "done" + ], + "type": "string", + "description": "Message action status" + }, + "payload": { + "type": "object", + "description": "Message action payload" + } + }, + "required": [ + "status" + ] + }, + "CreateTopicResponseDto": { + "type": "object", + "properties": {} + }, + "CreateTopicRequestDto": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "User defined custom key and provided by the user that will be an unique identifier for the Topic created." + }, + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Topic created." + } + }, + "required": [ + "key", + "name" + ] + }, + "AddSubscribersRequestDto": { + "type": "object", + "properties": { + "subscribers": { + "description": "List of subscriber identifiers that will be associated to the topic", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "subscribers" + ] + }, + "TopicSubscriberDto": { + "type": "object", + "properties": { + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "_topicId": { + "type": "string" + }, + "topicKey": { + "type": "string" + }, + "externalSubscriberId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_subscriberId", + "_topicId", + "topicKey", + "externalSubscriberId" + ] + }, + "RemoveSubscribersRequestDto": { + "type": "object", + "properties": { + "subscribers": { + "description": "List of subscriber identifiers that will be removed to the topic", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "subscribers" + ] + }, + "TopicDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "FilterTopicsResponseDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TopicDto" + } + }, + "page": { + "type": "number" + }, + "pageSize": { + "type": "number" + }, + "totalCount": { + "type": "number" + } + }, + "required": [ + "data", + "page", + "pageSize", + "totalCount" + ] + }, + "GetTopicResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "RenameTopicResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "RenameTopicRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user to rename the topic." + } + }, + "required": [ + "name" + ] + }, + "ActivityNotificationSubscriberResponseDto": { + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "_id": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + } + }, + "required": [ + "_id" + ] + }, + "ActivityNotificationTemplateResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTrigger" + } + } + }, + "required": [ + "name", + "triggers" + ] + }, + "ActivityNotificationExecutionDetailResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_jobId": { + "type": "string" + }, + "status": { + "enum": [ + "Success", + "Warning", + "Failed", + "Pending", + "Queued", + "ReadConfirmation" + ], + "type": "string" + }, + "detail": { + "type": "string" + }, + "isRetry": { + "type": "boolean" + }, + "isTest": { + "type": "boolean" + }, + "providerId": { + "type": "object" + }, + "raw": { + "type": "string" + }, + "source": { + "enum": [ + "Credentials", + "Internal", + "Payload", + "Webhook" + ], + "type": "string" + } + }, + "required": [ + "_id", + "_jobId", + "status", + "detail", + "isRetry", + "isTest", + "providerId", + "source" + ] + }, + "MessageTemplateDto": { + "type": "object", + "properties": {} + }, + "ActivityNotificationStepResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "filters": { + "$ref": "#/components/schemas/StepFilter" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplateDto" + } + }, + "required": [ + "_id", + "active", + "filters" + ] + }, + "ActivityNotificationJobResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "digest": { + "type": "object" + }, + "executionDetails": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationExecutionDetailResponseDto" + } + }, + "step": { + "$ref": "#/components/schemas/ActivityNotificationStepResponseDto" + }, + "payload": { + "type": "object" + }, + "providerId": { + "type": "object" + }, + "status": { + "type": "string" + } + }, + "required": [ + "_id", + "type", + "executionDetails", + "step", + "providerId", + "status" + ] + }, + "ActivityNotificationResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "transactionId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "channels": { + "type": "string", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "subscriber": { + "$ref": "#/components/schemas/ActivityNotificationSubscriberResponseDto" + }, + "template": { + "$ref": "#/components/schemas/ActivityNotificationTemplateResponseDto" + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationJobResponseDto" + } + } + }, + "required": [ + "_environmentId", + "_organizationId", + "transactionId" + ] + }, + "ActivitiesResponseDto": { + "type": "object", + "properties": { + "hasMore": { + "type": "boolean" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "hasMore", + "data", + "pageSize", + "page" + ] + }, + "ActivityStatsResponseDto": { + "type": "object", + "properties": { + "weeklySent": { + "type": "number" + }, + "monthlySent": { + "type": "number" + } + }, + "required": [ + "weeklySent", + "monthlySent" + ] + }, + "ActivityGraphStatesResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "count": { + "type": "number" + }, + "templates": { + "type": "array", + "items": { + "type": "string" + } + }, + "channels": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ] + } + } + }, + "required": [ + "_id", + "count", + "templates", + "channels" + ] + }, + "FeedResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + } + }, + "required": [ + "name", + "identifier", + "_environmentId", + "_organizationId" + ] + }, + "CreateFeedRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "DeleteMessageResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "IGroupedBlueprint": { + "type": "object", + "properties": {} + }, + "GroupedBlueprintResponse": { + "type": "object", + "properties": { + "general": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IGroupedBlueprint" + } + }, + "popular": { + "$ref": "#/components/schemas/IGroupedBlueprint" + } + }, + "required": [ + "general", + "popular" + ] + }, + "NotificationStepDto": { + "type": "object", + "properties": {} + }, + "GetBlueprintResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean" + }, + "preferenceSettings": { + "type": "object" + }, + "critical": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStepDto" + } + }, + "_organizationId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "type": "object" + } + }, + "_notificationGroupId": { + "type": "string" + }, + "_parentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "notificationGroup": { + "type": "object" + }, + "isBlueprint": { + "type": "boolean" + }, + "blueprintId": { + "type": "string" + } + }, + "required": [ + "_id", + "name", + "description", + "active", + "draft", + "preferenceSettings", + "critical", + "tags", + "steps", + "_organizationId", + "_creatorId", + "_environmentId", + "triggers", + "_notificationGroupId", + "deleted", + "deletedAt", + "deletedBy", + "isBlueprint" + ] + } + } + } +} \ No newline at end of file diff --git a/specs/openapi-0.19.0.json b/specs/openapi-0.19.0.json new file mode 100644 index 0000000..99c50c0 --- /dev/null +++ b/specs/openapi-0.19.0.json @@ -0,0 +1,6792 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/inbound-parse/mx/status": { + "get": { + "operationId": "InboundParseController_getMxRecordStatus", + "summary": "Validate the mx record setup for the inbound parse functionality", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetMxRecordResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Inbound Parse" + ] + } + }, + "/v1/environments/me": { + "get": { + "operationId": "EnvironmentsController_getCurrentEnvironment", + "summary": "Get current environment", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments": { + "post": { + "operationId": "EnvironmentsController_createEnvironment", + "summary": "Create environment", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEnvironmentRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + }, + "get": { + "operationId": "EnvironmentsController_getMyEnvironments", + "summary": "Get environments", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/{environmentId}": { + "put": { + "operationId": "EnvironmentsController_updateMyEnvironment", + "summary": "Update env by id", + "parameters": [ + { + "name": "environmentId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEnvironmentRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/api-keys": { + "get": { + "operationId": "EnvironmentsController_getOrganizationApiKeys", + "summary": "Get api keys", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/api-keys/regenerate": { + "post": { + "operationId": "EnvironmentsController_regenerateOrganizationApiKeys", + "summary": "Regenerate api keys", + "parameters": [], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + } + } + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/notification-groups": { + "post": { + "operationId": "NotificationGroupsController_createNotificationGroup", + "summary": "Create workflow group", + "description": "workflow group was previously named notification group", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationGroupRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "get": { + "operationId": "NotificationGroupsController_getNotificationGroups", + "summary": "Get workflow groups", + "description": "workflow group was previously named notification group", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + } + }, + "/v1/notification-groups/{id}": { + "get": { + "operationId": "NotificationGroupsController_getNotificationGroup", + "summary": "Get workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "patch": { + "operationId": "NotificationGroupsController_updateNotificationGroup", + "summary": "Update workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationGroupRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "delete": { + "operationId": "NotificationGroupsController_deleteNotificationGroup", + "summary": "Delete workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteNotificationGroupResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + } + }, + "/v1/changes": { + "get": { + "operationId": "ChangesController_getChanges", + "summary": "Get changes", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + }, + { + "name": "promoted", + "required": true, + "in": "query", + "schema": { + "default": "false", + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangesResponseDto" + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/count": { + "get": { + "operationId": "ChangesController_getChangesCount", + "summary": "Get changes count", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataNumberDto" + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/bulk/apply": { + "post": { + "operationId": "ChangesController_bulkApplyDiff", + "summary": "Apply changes", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkApplyChangeDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/{changeId}/apply": { + "post": { + "operationId": "ChangesController_applyDiff", + "summary": "Apply change", + "parameters": [ + { + "name": "changeId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/layouts": { + "post": { + "operationId": "LayoutsController_createLayout", + "summary": "Layout creation", + "description": "Create a layout", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateLayoutRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateLayoutResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Layouts" + ] + }, + "get": { + "operationId": "LayoutsController_filterLayouts", + "summary": "Filter layouts", + "description": "Returns a list of layouts that can be paginated using the `page` query parameter and filtered by the environment where it is executed from the organization the user belongs to.", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "Number of page for the pagination", + "schema": { + "minimum": 0, + "type": "number" + } + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "description": "Size of page for the pagination", + "schema": { + "minimum": 0, + "type": "number" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "Sort field. Currently only supported `createdAt`", + "schema": { + "type": "string" + } + }, + { + "name": "orderBy", + "required": false, + "in": "query", + "description": "Direction of the sorting query param. Either ascending (1) or descending (-1)", + "schema": { + "enum": [ + 1, + -1 + ], + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "The list of layouts that match the criteria of the query params are successfully returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterLayoutsResponseDto" + } + } + } + }, + "400": { + "description": "Page size can not be larger than the page size limit." + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/layouts/{layoutId}": { + "get": { + "operationId": "LayoutsController_getLayout", + "summary": "Get layout", + "description": "Get a layout by its ID", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetLayoutResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database." + } + }, + "tags": [ + "Layouts" + ] + }, + "delete": { + "operationId": "LayoutsController_deleteLayout", + "summary": "Delete layout", + "description": "Execute a soft delete of a layout given a certain ID.", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The layout has been deleted correctly" + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be deleted." + }, + "409": { + "description": "Either you are trying to delete a layout that is being used or a layout that is the default in the environment." + } + }, + "tags": [ + "Layouts" + ] + }, + "patch": { + "operationId": "LayoutsController_updateLayout", + "summary": "Update a layout", + "description": "Update the name, content and variables of a layout. Also change it to be default or no.", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateLayoutRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateLayoutResponseDto" + } + } + } + } + } + }, + "400": { + "description": "The payload provided or the URL param are not right." + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be updated." + }, + "409": { + "description": "One default layout is needed. If you are trying to turn a default layout as not default, you should turn a different layout as default first and automatically it will be done by the system." + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/layouts/{layoutId}/default": { + "post": { + "operationId": "LayoutsController_setDefaultLayout", + "summary": "Set default layout", + "description": "Sets the default layout for the environment and updates to non default to the existing default layout (if any).", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The selected layout has been set as the default for the environment." + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be set as the default for the environment." + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/integrations": { + "get": { + "operationId": "IntegrationsController_getIntegrations", + "summary": "Get integrations", + "description": "Return all the integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change", + "parameters": [], + "responses": { + "200": { + "description": "The list of integrations belonging to the organization that are successfully returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + }, + "tags": [ + "Integrations" + ] + }, + "post": { + "operationId": "IntegrationsController_createIntegration", + "summary": "Create integration", + "description": "Create an integration for the current environment the user is based on the API key provided", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIntegrationRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/active": { + "get": { + "operationId": "IntegrationsController_getActiveIntegrations", + "summary": "Get active integrations", + "description": "Return all the active integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change", + "parameters": [], + "responses": { + "200": { + "description": "The list of active integrations belonging to the organization that are successfully returned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/webhook/provider/{providerId}/status": { + "get": { + "operationId": "IntegrationsController_getWebhookSupportStatus", + "summary": "Get webhook support status for provider", + "description": "Return the status of the webhook for this provider, if it is supported or if it is not based on a boolean value", + "parameters": [ + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The status of the webhook for the provider requested", + "content": { + "application/json": { + "schema": { + "type": "boolean" + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{integrationId}": { + "put": { + "operationId": "IntegrationsController_updateIntegrationById", + "summary": "Update integration", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegrationRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The integration with the integrationId provided does not exist in the database." + } + }, + "tags": [ + "Integrations" + ] + }, + "delete": { + "operationId": "IntegrationsController_removeIntegration", + "summary": "Delete integration", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{integrationId}/set-primary": { + "post": { + "operationId": "IntegrationsController_setIntegrationAsPrimary", + "summary": "Set integration as primary", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + }, + "404": { + "description": "The integration with the integrationId provided does not exist in the database." + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{channelType}/limit": { + "get": { + "operationId": "IntegrationsController_getProviderLimit", + "parameters": [ + { + "name": "channelType", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ChannelTypeLimitDto" + } + } + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/in-app/status": { + "get": { + "operationId": "IntegrationsController_getInAppActivated", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/execution-details": { + "get": { + "operationId": "ExecutionDetailsController_getExecutionDetailsForNotification", + "summary": "Get execution details", + "parameters": [ + { + "name": "notificationId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExecutionDetailsResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Execution Details" + ] + } + }, + "/v1/notification-templates": { + "get": { + "operationId": "NotificationTemplateController_getNotificationTemplates", + "summary": "Get Notification templates", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "post": { + "operationId": "NotificationTemplateController_createNotificationTemplates", + "summary": "Create Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{templateId}": { + "put": { + "operationId": "NotificationTemplateController_updateTemplateById", + "summary": "Update Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "delete": { + "operationId": "NotificationTemplateController_deleteTemplateById", + "summary": "Delete Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "get": { + "operationId": "NotificationTemplateController_getNotificationTemplateById", + "summary": "Get Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{templateId}/status": { + "put": { + "operationId": "NotificationTemplateController_changeActiveStatus", + "summary": "Update Notification template status", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeWorkflowStatusRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/workflows": { + "get": { + "operationId": "WorkflowController_getWorkflows", + "summary": "Get workflows", + "description": "Workflows were previously named notification templates", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "post": { + "operationId": "WorkflowController_createWorkflows", + "summary": "Create workflow", + "description": "Workflow was previously named notification template", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowId}": { + "put": { + "operationId": "WorkflowController_updateWorkflowById", + "summary": "Update workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "delete": { + "operationId": "WorkflowController_deleteWorkflowById", + "summary": "Delete workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "get": { + "operationId": "WorkflowController_getWorkflowById", + "summary": "Get workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowId}/status": { + "put": { + "operationId": "WorkflowController_changeActiveStatus", + "summary": "Update workflow status", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeWorkflowStatusRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/events/trigger": { + "post": { + "operationId": "EventsController_trackEvent", + "summary": "Trigger event", + "description": "\n Trigger event is the main (and only) way to send notifications to subscribers. \n The trigger identifier is used to match the particular workflow associated with it. \n Additional information can be passed according the body interface below.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/bulk": { + "post": { + "operationId": "EventsController_triggerBulkEvents", + "summary": "Bulk trigger event", + "description": "\n Using this endpoint you can trigger multiple events at once, to avoid multiple calls to the API.\n The bulk API is limited to 100 events per request.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkTriggerEventDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/broadcast": { + "post": { + "operationId": "EventsController_trackEventToAll", + "summary": "Broadcast event to all", + "description": "Trigger a broadcast event to all existing subscribers, could be used to send announcements, etc.\n In the future could be used to trigger events to a subset of subscribers based on defined filters.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventToAllRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/{transactionId}": { + "delete": { + "operationId": "EventsController_cancelDelayed", + "summary": "Cancel triggered event", + "description": "\n Using a previously generated transactionId during the event trigger,\n will cancel any active or pending workflows. This is useful to cancel active digests, delays etc...\n ", + "parameters": [ + { + "name": "transactionId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/subscribers": { + "get": { + "operationId": "SubscribersController_getSubscribers", + "summary": "Get subscribers", + "description": "Returns a list of subscribers, could paginated using the `page` and `limit` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + ] + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "post": { + "operationId": "SubscribersController_createSubscriber", + "summary": "Create subscriber", + "description": "Creates a subscriber entity, in the Novu platform. The subscriber will be later used to receive notifications, and access notification feeds. Communication credentials such as email, phone number, and 3 rd party credentials i.e slack tokens could be later associated to this entity.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSubscriberRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}": { + "get": { + "operationId": "SubscribersController_getSubscriber", + "summary": "Get subscriber", + "description": "Get subscriber by your internal id used to identify the subscriber", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "put": { + "operationId": "SubscribersController_updateSubscriber", + "summary": "Update subscriber", + "description": "Used to update the subscriber entity with new information", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "delete": { + "operationId": "SubscribersController_removeSubscriber", + "summary": "Delete subscriber", + "description": "Deletes a subscriber entity from the Novu platform", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteSubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/bulk": { + "post": { + "operationId": "SubscribersController_bulkCreateSubscribers", + "summary": "Bulk create subscribers", + "description": "\n Using this endpoint you can create multiple subscribers at once, to avoid multiple calls to the API.\n The bulk API is limited to 500 subscribers per request.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkSubscriberCreateDto" + } + } + } + }, + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials": { + "put": { + "operationId": "SubscribersController_updateSubscriberChannel", + "summary": "Update subscriber credentials", + "description": "Subscriber credentials associated to the delivery methods such as slack and push tokens.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberChannelRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}": { + "delete": { + "operationId": "SubscribersController_deleteSubscriberCredentials", + "summary": "Delete subscriber credentials by providerId", + "description": "Delete subscriber credentials such as slack and expo tokens.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "" + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/online-status": { + "patch": { + "operationId": "SubscribersController_updateSubscriberOnlineFlag", + "summary": "Update subscriber online status", + "description": "Used to update the subscriber isOnline flag.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberOnlineFlagRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences": { + "get": { + "operationId": "SubscribersController_getSubscriberPreference", + "summary": "Get subscriber preferences", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences/{templateId}": { + "patch": { + "operationId": "SubscribersController_updateSubscriberPreference", + "summary": "Update subscriber preference", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/notifications/feed": { + "get": { + "operationId": "SubscribersController_getNotificationsFeed", + "summary": "Get in-app notification feed for a particular subscriber", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + }, + { + "name": "read", + "required": false, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "seen", + "required": false, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "payload", + "required": false, + "in": "query", + "description": "Base64 encoded string of the partial payload JSON object", + "example": "btoa(JSON.stringify({ foo: 123 })) results in base64 encoded string like eyJmb28iOjEyM30=", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + ] + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/notifications/unseen": { + "get": { + "operationId": "SubscribersController_getUnseenCount", + "summary": "Get the unseen in-app notifications count for subscribers feed", + "parameters": [ + { + "name": "seen", + "required": true, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "required": true, + "in": "query", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UnseenCountResponse" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/markAs": { + "post": { + "operationId": "SubscribersController_markMessageAs", + "summary": "Mark a subscriber feed message as seen", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkMessageAsRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/mark-all": { + "post": { + "operationId": "SubscribersController_markAllUnreadAsRead", + "summary": "Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkAllMessageAsRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "number" + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}": { + "post": { + "operationId": "SubscribersController_markActionAsSeen", + "summary": "Mark message action as seen", + "parameters": [ + { + "name": "messageId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "type", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkMessageActionAsSeenDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback": { + "get": { + "operationId": "SubscribersController_chatOauthCallback", + "summary": "Handle providers oauth redirect", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "code", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "hmacHash", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "integrationIdentifier", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth": { + "get": { + "operationId": "SubscribersController_chatAccessOauth", + "summary": "Handle chat oauth", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "hmacHash", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "integrationIdentifier", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/topics": { + "post": { + "operationId": "TopicsController_createTopic", + "summary": "Topic creation", + "description": "Create a topic", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTopicRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateTopicResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "get": { + "operationId": "TopicsController_filterTopics", + "summary": "Filter topics", + "description": "Returns a list of topics that can be paginated using the `page` query parameter and filtered by the topic key with the `key` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "Number of page for the pagination", + "schema": { + "minimum": 0, + "default": 0, + "type": "number" + } + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "description": "Size of page for the pagination", + "schema": { + "minimum": 0, + "default": 10, + "type": "number" + } + }, + { + "name": "key", + "required": false, + "in": "query", + "description": "Topic key", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterTopicsResponseDto" + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers": { + "post": { + "operationId": "TopicsController_addSubscribers", + "summary": "Subscribers addition", + "description": "Add subscribers to a topic by key", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSubscribersRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "" + }, + "204": { + "description": "" + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers/{externalSubscriberId}": { + "get": { + "operationId": "TopicsController_getTopicSubscriber", + "summary": "Check topic subscriber", + "description": "Check if a subscriber belongs to a certain topic", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "externalSubscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TopicSubscriberDto" + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers/removal": { + "post": { + "operationId": "TopicsController_removeSubscribers", + "summary": "Subscribers removal", + "description": "Remove subscribers from a topic", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveSubscribersRequestDto" + } + } + } + }, + "responses": { + "204": { + "description": "" + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}": { + "delete": { + "operationId": "TopicsController_deleteTopic", + "summary": "Delete topic", + "description": "Delete a topic by its topic key if it has no subscribers", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The topic has been deleted correctly" + }, + "404": { + "description": "The topic with the key provided does not exist in the database so it can not be deleted." + }, + "409": { + "description": "The topic you are trying to delete has subscribers assigned to it. Delete the subscribers before deleting the topic." + } + }, + "tags": [ + "Topics" + ] + }, + "get": { + "operationId": "TopicsController_getTopic", + "summary": "Get topic", + "description": "Get a topic by its topic key", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetTopicResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "patch": { + "operationId": "TopicsController_renameTopic", + "summary": "Rename a topic", + "description": "Rename a topic by providing a new name", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RenameTopicRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/RenameTopicResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/notifications": { + "get": { + "operationId": "NotificationsController_getNotifications", + "summary": "Get notifications", + "parameters": [ + { + "name": "channels", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ] + } + } + }, + { + "name": "templates", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "emails", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "search", + "required": true, + "in": "query", + "deprecated": true, + "schema": { + "type": "string" + } + }, + { + "name": "subscriberIds", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 0, + "type": "number" + } + }, + { + "name": "transactionId", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivitiesResponseDto" + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/stats": { + "get": { + "operationId": "NotificationsController_getActivityStats", + "summary": "Get notification statistics", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ActivityStatsResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/graph/stats": { + "get": { + "operationId": "NotificationsController_getActivityGraphStats", + "summary": "Get notification graph statistics", + "parameters": [ + { + "name": "days", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityGraphStatesResponse" + } + } + } + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/{notificationId}": { + "get": { + "operationId": "NotificationsController_getActivity", + "summary": "Get notification", + "parameters": [ + { + "name": "notificationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ActivityNotificationResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/feeds": { + "post": { + "operationId": "FeedsController_createFeed", + "summary": "Create feed", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateFeedRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Feeds" + ] + }, + "get": { + "operationId": "FeedsController_getFeeds", + "summary": "Get feeds", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Feeds" + ] + } + }, + "/v1/feeds/{feedId}": { + "delete": { + "operationId": "FeedsController_deleteFeedById", + "summary": "Delete feed", + "parameters": [ + { + "name": "feedId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + } + }, + "tags": [ + "Feeds" + ] + } + }, + "/v1/messages": { + "get": { + "operationId": "MessagesController_getMessages", + "summary": "Get messages", + "description": "Returns a list of messages, could paginate using the `page` query parameter", + "parameters": [ + { + "name": "channel", + "required": false, + "in": "query", + "schema": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + } + }, + { + "name": "subscriberId", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "transactionId", + "required": false, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 0, + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivitiesResponseDto" + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/messages/{messageId}": { + "delete": { + "operationId": "MessagesController_deleteMessage", + "summary": "Delete message", + "description": "Deletes a message entity from the Novu platform", + "parameters": [ + { + "name": "messageId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteMessageResponseDto" + } + } + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/blueprints/group-by-category": { + "get": { + "operationId": "BlueprintController_getGroupedBlueprints", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupedBlueprintResponse" + } + } + } + } + } + } + }, + "/v1/blueprints/{templateId}": { + "get": { + "operationId": "BlueprintController_getBlueprintById", + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetBlueprintResponse" + } + } + } + } + } + } + } + }, + "info": { + "title": "Novu API", + "description": "The Novu API description", + "version": "1.0", + "contact": {} + }, + "tags": [ + { + "name": "Events", + "description": "" + }, + { + "name": "Subscribers", + "description": "" + }, + { + "name": "Topics", + "description": "" + }, + { + "name": "Notification", + "description": "" + }, + { + "name": "Integrations", + "description": "" + }, + { + "name": "Layouts", + "description": "" + }, + { + "name": "Workflows", + "description": "" + }, + { + "name": "Notification Templates", + "description": "" + }, + { + "name": "Workflow groups", + "description": "" + }, + { + "name": "Changes", + "description": "" + }, + { + "name": "Environments", + "description": "" + }, + { + "name": "Inbound Parse", + "description": "" + }, + { + "name": "Feeds", + "description": "" + }, + { + "name": "Tenants", + "description": "" + }, + { + "name": "Messages", + "description": "" + }, + { + "name": "Execution Details", + "description": "" + } + ], + "servers": [], + "components": { + "schemas": { + "DataWrapperDto": { + "type": "object", + "properties": { + "data": { + "type": "object" + } + }, + "required": [ + "data" + ] + }, + "GetMxRecordResponseDto": { + "type": "object", + "properties": { + "mxRecordConfigured": { + "type": "boolean" + } + }, + "required": [ + "mxRecordConfigured" + ] + }, + "ApiKey": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "_userId": { + "type": "string" + } + }, + "required": [ + "key", + "_userId" + ] + }, + "EnvironmentResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "apiKeys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_organizationId", + "identifier", + "apiKeys", + "_parentId" + ] + }, + "CreateEnvironmentRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "parentId": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "InBoundParseDomainDto": { + "type": "object", + "properties": { + "inboundParseDomain": { + "type": "string" + } + } + }, + "UpdateEnvironmentRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "parentId": { + "type": "string" + }, + "dns": { + "$ref": "#/components/schemas/InBoundParseDomainDto" + } + } + }, + "NotificationGroupResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_environmentId", + "_organizationId" + ] + }, + "CreateNotificationGroupRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "DeleteNotificationGroupResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "ChangeResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_entityId": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "type": { + "enum": [ + "Feed", + "MessageTemplate", + "Layout", + "DefaultLayout", + "NotificationTemplate", + "NotificationGroup" + ], + "type": "string" + }, + "change": { + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_creatorId", + "_environmentId", + "_organizationId", + "_entityId", + "enabled", + "type", + "change", + "createdAt" + ] + }, + "ChangesResponseDto": { + "type": "object", + "properties": { + "totalCount": { + "type": "number" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "totalCount", + "data", + "pageSize", + "page" + ] + }, + "DataNumberDto": { + "type": "object", + "properties": { + "data": { + "type": "number" + } + }, + "required": [ + "data" + ] + }, + "BulkApplyChangeDto": { + "type": "object", + "properties": { + "changeIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "changeIds" + ] + }, + "CreateLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + } + }, + "required": [ + "_id" + ] + }, + "CreateLayoutRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Layout created." + }, + "identifier": { + "type": "string", + "description": "User defined custom key that will be a unique identifier for the Layout created." + }, + "description": { + "type": "string", + "description": "User description of the layout" + }, + "content": { + "type": "string", + "description": "User defined content for the layout." + }, + "variables": { + "description": "User defined variables to render in the layout placeholders.", + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean", + "description": "Variable that defines if the layout is chosen as default when creating a layout." + } + }, + "required": [ + "name", + "identifier", + "content" + ] + }, + "LayoutDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "identifier", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "FilterLayoutsResponseDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LayoutDto" + } + }, + "page": { + "type": "number" + }, + "pageSize": { + "type": "number" + }, + "totalCount": { + "type": "number" + } + }, + "required": [ + "data", + "page", + "pageSize", + "totalCount" + ] + }, + "GetLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "identifier", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "UpdateLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "identifier", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "UpdateLayoutRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Layout updated." + }, + "identifier": { + "type": "string", + "description": "User defined custom key that will be a unique identifier for the Layout updated." + }, + "description": { + "type": "string", + "description": "User defined description of the layout" + }, + "content": { + "type": "string", + "description": "User defined content for the layout." + }, + "variables": { + "description": "User defined variables to render in the layout placeholders.", + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean", + "description": "Variable that defines if the layout is chosen as default when creating a layout." + } + }, + "required": [ + "identifier" + ] + }, + "CredentialsDto": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + }, + "user": { + "type": "string" + }, + "secretKey": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "password": { + "type": "string" + }, + "host": { + "type": "string" + }, + "port": { + "type": "string" + }, + "secure": { + "type": "boolean" + }, + "region": { + "type": "string" + }, + "accountSid": { + "type": "string" + }, + "messageProfileId": { + "type": "string" + }, + "token": { + "type": "string" + }, + "from": { + "type": "string" + }, + "senderName": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "applicationId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "requireTls": { + "type": "boolean" + }, + "ignoreTls": { + "type": "boolean" + }, + "tlsOptions": { + "type": "object" + }, + "baseUrl": { + "type": "string" + }, + "webhookUrl": { + "type": "string" + }, + "redirectUrl": { + "type": "string" + }, + "hmac": { + "type": "boolean" + }, + "serviceAccount": { + "type": "string" + }, + "ipPoolName": { + "type": "string" + } + } + }, + "IntegrationResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "active": { + "type": "boolean" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "primary": { + "type": "boolean" + } + }, + "required": [ + "_environmentId", + "_organizationId", + "name", + "identifier", + "providerId", + "channel", + "credentials", + "active", + "deleted", + "deletedAt", + "deletedBy", + "primary" + ] + }, + "CreateIntegrationRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "active": { + "type": "boolean", + "description": "If the integration is active the validation on the credentials field will run" + }, + "check": { + "type": "boolean" + } + }, + "required": [ + "providerId", + "channel" + ] + }, + "UpdateIntegrationRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "active": { + "type": "boolean", + "description": "If the integration is active the validation on the credentials field will run" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "check": { + "type": "boolean" + } + } + }, + "ChannelTypeLimitDto": { + "type": "object", + "properties": { + "limit": { + "type": "number" + }, + "count": { + "type": "number" + } + }, + "required": [ + "limit", + "count" + ] + }, + "ExecutionDetailsResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_jobId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_notificationId": { + "type": "string" + }, + "_notificationTemplateId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "_messageId": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "transactionId": { + "type": "string" + }, + "channel": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "detail": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "Credentials", + "Internal", + "Payload", + "Webhook" + ] + }, + "status": { + "type": "string", + "enum": [ + "Success", + "Warning", + "Failed", + "Pending", + "Queued", + "ReadConfirmation" + ] + }, + "isTest": { + "type": "boolean" + }, + "isRetry": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_jobId", + "_environmentId", + "_notificationId", + "_notificationTemplateId", + "_subscriberId", + "transactionId", + "channel", + "detail", + "source", + "status", + "isTest", + "isRetry" + ] + }, + "NotificationGroup": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_environmentId", + "_organizationId" + ] + }, + "PreferenceChannels": { + "type": "object", + "properties": { + "email": { + "type": "boolean" + }, + "sms": { + "type": "boolean" + }, + "in_app": { + "type": "boolean" + }, + "chat": { + "type": "boolean" + }, + "push": { + "type": "boolean" + } + } + }, + "DigestRegularMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "digestKey": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "regular", + "backoff" + ] + }, + "backoff": { + "type": "boolean" + }, + "backoffAmount": { + "type": "number" + }, + "backoffUnit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "updateMode": { + "type": "boolean" + } + }, + "required": [ + "type" + ] + }, + "TimedConfig": { + "type": "object", + "properties": { + "atTime": { + "type": "string" + }, + "weekDays": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday" + ] + } + }, + "monthDays": { + "type": "array", + "items": { + "type": "string" + } + }, + "ordinal": { + "type": "string", + "enum": [ + "1", + "2", + "3", + "4", + "5", + "last" + ] + }, + "ordinalValue": { + "type": "string", + "enum": [ + "day", + "weekday", + "weekend", + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday" + ] + }, + "monthlyType": { + "type": "string", + "enum": [ + "each", + "on" + ] + } + } + }, + "DigestTimedMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "digestKey": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "timed" + ] + }, + "timed": { + "$ref": "#/components/schemas/TimedConfig" + } + }, + "required": [ + "type" + ] + }, + "DelayRegularMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "type": { + "type": "string", + "enum": [ + "regular" + ] + } + }, + "required": [ + "type" + ] + }, + "DelayScheduledMetadata": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "scheduled" + ] + }, + "delayPath": { + "type": "string" + } + }, + "required": [ + "type", + "delayPath" + ] + }, + "MessageTemplate": { + "type": "object", + "properties": {} + }, + "FieldFilterPart": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + }, + "operator": { + "type": "string", + "enum": [ + "LARGER", + "SMALLER", + "LARGER_EQUAL", + "SMALLER_EQUAL", + "EQUAL", + "NOT_EQUAL", + "ALL_IN", + "ANY_IN", + "NOT_IN", + "BETWEEN", + "NOT_BETWEEN", + "LIKE", + "NOT_LIKE", + "IN" + ] + }, + "on": { + "type": "string", + "enum": [ + "subscriber", + "payload" + ] + } + }, + "required": [ + "field", + "value", + "operator", + "on" + ] + }, + "StepFilter": { + "type": "object", + "properties": { + "isNegated": { + "type": "boolean" + }, + "type": { + "type": "string", + "enum": [ + "BOOLEAN", + "TEXT", + "DATE", + "NUMBER", + "STATEMENT", + "LIST", + "MULTI_LIST", + "GROUP" + ] + }, + "value": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "children": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FieldFilterPart" + } + } + }, + "required": [ + "isNegated", + "type", + "value", + "children" + ] + }, + "NotificationStep": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "shouldStopOnFail": { + "type": "boolean" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplate" + }, + "filters": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + }, + "_parentId": { + "type": "object" + }, + "metadata": { + "oneOf": [ + { + "$ref": "#/components/schemas/DigestRegularMetadata" + }, + { + "$ref": "#/components/schemas/DigestTimedMetadata" + }, + { + "$ref": "#/components/schemas/DelayRegularMetadata" + }, + { + "$ref": "#/components/schemas/DelayScheduledMetadata" + } + ] + }, + "replyCallback": { + "type": "object" + } + } + }, + "NotificationTriggerVariable": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "NotificationTrigger": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTriggerVariable" + } + }, + "subscriberVariables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTriggerVariable" + } + } + }, + "required": [ + "type", + "identifier", + "variables" + ] + }, + "WorkflowResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "critical": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "_organizationId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTrigger" + } + }, + "_notificationGroupId": { + "type": "string" + }, + "_parentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "notificationGroup": { + "$ref": "#/components/schemas/NotificationGroup" + }, + "data": { + "type": "object" + }, + "workflowIntegrationStatus": { + "type": "object" + } + }, + "required": [ + "name", + "description", + "active", + "draft", + "preferenceSettings", + "critical", + "tags", + "steps", + "_organizationId", + "_creatorId", + "_environmentId", + "triggers", + "_notificationGroupId", + "deleted", + "deletedAt", + "deletedBy" + ] + }, + "UpdateWorkflowRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "maxLength": 300 + }, + "identifier": { + "type": "string" + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "notificationGroupId": { + "type": "string" + }, + "critical": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "notificationGroupId" + ] + }, + "DataBooleanDto": { + "type": "object", + "properties": { + "data": { + "type": "boolean" + } + }, + "required": [ + "data" + ] + }, + "CreateWorkflowRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "notificationGroupId": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean", + "deprecated": true + }, + "critical": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "blueprintId": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "notificationGroupId", + "steps" + ] + }, + "ChangeWorkflowStatusRequestDto": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + } + }, + "required": [ + "active" + ] + }, + "TriggerEventResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "If trigger was acknowledged or not" + }, + "status": { + "type": "string", + "description": "Status for trigger", + "enum": [ + "processed", + "trigger_not_active", + "subscriber_id_missing", + "error" + ] + }, + "error": { + "description": "In case of an error, this field will contain the error message", + "type": "array", + "items": { + "type": "string" + } + }, + "transactionId": { + "type": "string", + "description": "Transaction id for trigger" + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "TopicPayloadDto": { + "type": "object", + "properties": { + "topicKey": { + "type": "string" + }, + "type": { + "enum": [ + "Subscriber", + "Topic" + ], + "type": "string", + "example": "Topic" + } + }, + "required": [ + "topicKey", + "type" + ] + }, + "TenantPayloadDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + } + } + }, + "SubscriberPayloadDto": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string", + "description": "An http url to the profile image of your subscriber" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "subscriberId" + ] + }, + "TriggerEventRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The trigger identifier of the workflow you wish to send. This identifier can be found on the workflow page." + }, + "payload": { + "type": "object", + "description": "The payload object is used to pass additional custom information that could be used to render the workflow, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.", + "example": { + "comment_id": "string", + "post": { + "text": "string" + } + } + }, + "overrides": { + "type": "object", + "description": "This could be used to override provider specific configurations", + "example": { + "fcm": { + "data": { + "key": "value" + } + } + } + }, + "to": { + "description": "The recipients list of people who will receive the notification.", + "oneOf": [ + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + }, + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems", + "example": "SUBSCRIBER_ID" + }, + { + "$ref": "#/components/schemas/TopicPayloadDto" + } + ], + "items": { + "type": "array" + } + }, + "transactionId": { + "type": "string", + "description": "A unique identifier for this transaction, we will generated a UUID if not provided." + }, + "actor": { + "description": "It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems" + }, + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + } + ] + }, + "tenant": { + "description": "It is used to specify a tenant context during trigger event.\n If a new tenant object is provided, we will create a new tenant.\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a tenant in your system" + }, + { + "$ref": "#/components/schemas/TenantPayloadDto" + } + ] + } + }, + "required": [ + "name", + "to" + ] + }, + "BulkTriggerEventDto": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TriggerEventRequestDto" + } + } + }, + "required": [ + "events" + ] + }, + "TriggerEventToAllRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The trigger identifier associated for the template you wish to send. This identifier can be found on the template page." + }, + "payload": { + "type": "object", + "description": "The payload object is used to pass additional custom information that could be used to render the template, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.", + "example": { + "comment_id": "string", + "post": { + "text": "string" + } + } + }, + "overrides": { + "type": "object", + "description": "This could be used to override provider specific configurations", + "example": { + "fcm": { + "data": { + "key": "value" + } + } + } + }, + "transactionId": { + "type": "string", + "description": "A unique identifier for this transaction, we will generated a UUID if not provided." + }, + "actor": { + "description": "It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems" + }, + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + } + ] + }, + "tenant": { + "description": "It is used to specify a tenant context during trigger event.\n If a new tenant object is provided, we will create a new tenant.\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a tenant in your system" + }, + { + "$ref": "#/components/schemas/TenantPayloadDto" + } + ] + } + }, + "required": [ + "name", + "payload" + ] + }, + "PaginatedResponseDto": { + "type": "object", + "properties": { + "page": { + "type": "number", + "description": "The current page of the paginated response" + }, + "hasMore": { + "type": "boolean", + "description": "Does the list have more items to fetch" + }, + "pageSize": { + "type": "number", + "description": "Number of items on each page" + }, + "data": { + "description": "The list of items matching the query", + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "page", + "hasMore", + "pageSize", + "data" + ] + }, + "ChannelCredentials": { + "type": "object", + "properties": { + "webhookUrl": { + "type": "string", + "description": "Webhook url used by chat app integrations. The webhook should be obtained from the chat app provider." + }, + "channel": { + "type": "string", + "description": "Channel specification for Mattermost chat notifications" + }, + "deviceTokens": { + "description": "Contains an array of the subscriber device tokens for a given provider. Used on Push integrations", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "webhookUrl" + ] + }, + "ChannelSettings": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "enum": [ + "slack", + "discord", + "msteams", + "mattermost", + "fcm", + "apns", + "expo", + "one-signal", + "push-webhook" + ], + "description": "The provider identifier for the credentials" + }, + "integrationIdentifier": { + "type": "string", + "description": "The integration identifier" + }, + "credentials": { + "description": "Credentials payload for the specified provider", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelCredentials" + } + ] + }, + "_integrationId": { + "type": "string", + "description": "Id of the integration that is used for this channel" + } + }, + "required": [ + "providerId", + "credentials", + "_integrationId" + ] + }, + "SubscriberResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "description": "The internal id novu generated for your subscriber, this is not the subscriberId matching your query. See `subscriberId` for that" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "channels": { + "description": "Channels settings for subscriber", + "type": "array", + "items": { + "$ref": "#/components/schemas/ChannelSettings" + } + }, + "isOnline": { + "type": "boolean" + }, + "lastOnlineAt": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "__v": { + "type": "number" + } + }, + "required": [ + "subscriberId", + "_organizationId", + "_environmentId", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "CreateSubscriberRequestDto": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string", + "description": "An http url to the profile image of your subscriber" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "subscriberId" + ] + }, + "BulkSubscriberCreateDto": { + "type": "object", + "properties": { + "subscribers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateSubscriberRequestDto" + } + } + }, + "required": [ + "subscribers" + ] + }, + "UpdateSubscriberRequestDto": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + } + }, + "UpdateSubscriberChannelRequestDto": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "enum": [ + "slack", + "discord", + "msteams", + "mattermost", + "fcm", + "apns", + "expo", + "one-signal", + "push-webhook" + ], + "description": "The provider identifier for the credentials" + }, + "integrationIdentifier": { + "type": "string", + "description": "The integration identifier" + }, + "credentials": { + "description": "Credentials payload for the specified provider", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelCredentials" + } + ] + } + }, + "required": [ + "providerId", + "credentials" + ] + }, + "UpdateSubscriberOnlineFlagRequestDto": { + "type": "object", + "properties": { + "isOnline": { + "type": "boolean" + } + }, + "required": [ + "isOnline" + ] + }, + "DeleteSubscriberResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "TemplateResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "description": "Unique identifier of the workflow" + }, + "name": { + "type": "string", + "description": "Name of the workflow" + }, + "critical": { + "type": "boolean", + "description": "Critical templates will always be delivered to the end user and should be hidden from the subscriber preferences screen" + } + }, + "required": [ + "_id", + "name", + "critical" + ] + }, + "Preference": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Sets if the workflow is fully enabled for all channels or not for the subscriber." + }, + "channels": { + "description": "Subscriber preferences for the different channels regarding this workflow", + "allOf": [ + { + "$ref": "#/components/schemas/PreferenceChannels" + } + ] + } + }, + "required": [ + "enabled", + "channels" + ] + }, + "UpdateSubscriberPreferenceResponseDto": { + "type": "object", + "properties": { + "template": { + "description": "The workflow information and if it is critical or not", + "allOf": [ + { + "$ref": "#/components/schemas/TemplateResponse" + } + ] + }, + "preference": { + "description": "The preferences of the subscriber regarding the related workflow", + "allOf": [ + { + "$ref": "#/components/schemas/Preference" + } + ] + } + }, + "required": [ + "template", + "preference" + ] + }, + "ChannelPreference": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "description": "The type of channel that is enabled or not" + }, + "enabled": { + "type": "boolean", + "description": "If channel is enabled or not" + } + }, + "required": [ + "type", + "enabled" + ] + }, + "UpdateSubscriberPreferenceRequestDto": { + "type": "object", + "properties": { + "channel": { + "description": "The subscriber preferences for every ChannelTypeEnum for the workflow assigned.", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelPreference" + } + ] + }, + "enabled": { + "type": "boolean", + "description": "Sets if the workflow is fully enabled for all channels or not for the subscriber." + } + } + }, + "EmailBlockStyles": { + "type": "object", + "properties": { + "textAlign": { + "enum": [ + "left", + "right", + "center" + ], + "type": "string" + } + } + }, + "EmailBlock": { + "type": "object", + "properties": { + "type": { + "enum": [ + "text", + "button" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "url": { + "type": "string" + }, + "styles": { + "$ref": "#/components/schemas/EmailBlockStyles" + } + }, + "required": [ + "type", + "content" + ] + }, + "MessageCTAData": { + "type": "object", + "properties": { + "url": { + "type": "string" + } + } + }, + "MessageButton": { + "type": "object", + "properties": { + "type": { + "enum": [ + "primary", + "secondary", + "clicked" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "resultContent": { + "type": "string" + } + }, + "required": [ + "type", + "content" + ] + }, + "MessageActionResult": { + "type": "object", + "properties": { + "payload": { + "type": "object" + }, + "type": { + "enum": [ + "primary", + "secondary", + "clicked" + ], + "type": "string" + } + } + }, + "MessageAction": { + "type": "object", + "properties": { + "status": { + "enum": [ + "pending", + "done" + ], + "type": "string" + }, + "buttons": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageButton" + } + }, + "result": { + "$ref": "#/components/schemas/MessageActionResult" + } + } + }, + "MessageCTA": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "redirect" + ] + }, + "data": { + "$ref": "#/components/schemas/MessageCTAData" + }, + "action": { + "$ref": "#/components/schemas/MessageAction" + } + }, + "required": [ + "data" + ] + }, + "MessageResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_messageTemplateId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_notificationId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "subscriber": { + "$ref": "#/components/schemas/SubscriberResponseDto" + }, + "template": { + "$ref": "#/components/schemas/WorkflowResponse" + }, + "templateIdentifier": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "content": { + "oneOf": [ + { + "$ref": "#/components/schemas/EmailBlock" + }, + { + "type": "string" + } + ] + }, + "transactionId": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "seen": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "directWebhookUrl": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "deviceTokens": { + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "type": "string" + }, + "lastSeenDate": { + "type": "string" + }, + "cta": { + "$ref": "#/components/schemas/MessageCTA" + }, + "_feedId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "sent", + "error", + "warning" + ] + }, + "errorId": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "payload": { + "type": "object", + "description": "The payload that was used to send the notification trigger" + }, + "overrides": { + "type": "object", + "description": "Provider specific overrides used when triggering the notification" + } + }, + "required": [ + "_templateId", + "_environmentId", + "_messageTemplateId", + "_organizationId", + "_notificationId", + "_subscriberId", + "content", + "transactionId", + "channel", + "seen", + "lastSeenDate", + "cta", + "status", + "errorId", + "errorText", + "payload", + "overrides" + ] + }, + "UnseenCountResponse": { + "type": "object", + "properties": { + "count": { + "type": "number" + } + }, + "required": [ + "count" + ] + }, + "MarkMessageFields": { + "type": "object", + "properties": { + "seen": { + "type": "boolean" + }, + "read": { + "type": "boolean" + } + } + }, + "MarkMessageAsRequestDto": { + "type": "object", + "properties": { + "messageId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "mark": { + "$ref": "#/components/schemas/MarkMessageFields" + } + }, + "required": [ + "messageId", + "mark" + ] + }, + "MarkAllMessageAsRequestDto": { + "type": "object", + "properties": { + "feedIdentifier": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Optional feed identifier or array of feed identifiers" + }, + "markAs": { + "enum": [ + "read", + "seen", + "unread", + "unseen" + ], + "type": "string", + "description": "Mark all subscriber messages as read, unread, seen or unseen" + } + }, + "required": [ + "markAs" + ] + }, + "MarkMessageActionAsSeenDto": { + "type": "object", + "properties": { + "status": { + "enum": [ + "pending", + "done" + ], + "type": "string", + "description": "Message action status" + }, + "payload": { + "type": "object", + "description": "Message action payload" + } + }, + "required": [ + "status" + ] + }, + "CreateTopicResponseDto": { + "type": "object", + "properties": {} + }, + "CreateTopicRequestDto": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "User defined custom key and provided by the user that will be an unique identifier for the Topic created." + }, + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Topic created." + } + }, + "required": [ + "key", + "name" + ] + }, + "AddSubscribersRequestDto": { + "type": "object", + "properties": { + "subscribers": { + "description": "List of subscriber identifiers that will be associated to the topic", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "subscribers" + ] + }, + "TopicSubscriberDto": { + "type": "object", + "properties": { + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "_topicId": { + "type": "string" + }, + "topicKey": { + "type": "string" + }, + "externalSubscriberId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_subscriberId", + "_topicId", + "topicKey", + "externalSubscriberId" + ] + }, + "RemoveSubscribersRequestDto": { + "type": "object", + "properties": { + "subscribers": { + "description": "List of subscriber identifiers that will be removed to the topic", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "subscribers" + ] + }, + "TopicDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "FilterTopicsResponseDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TopicDto" + } + }, + "page": { + "type": "number" + }, + "pageSize": { + "type": "number" + }, + "totalCount": { + "type": "number" + } + }, + "required": [ + "data", + "page", + "pageSize", + "totalCount" + ] + }, + "GetTopicResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "RenameTopicResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "RenameTopicRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user to rename the topic." + } + }, + "required": [ + "name" + ] + }, + "ActivityNotificationSubscriberResponseDto": { + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "_id": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + } + }, + "required": [ + "_id" + ] + }, + "ActivityNotificationTemplateResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTrigger" + } + } + }, + "required": [ + "name", + "triggers" + ] + }, + "ActivityNotificationExecutionDetailResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_jobId": { + "type": "string" + }, + "status": { + "enum": [ + "Success", + "Warning", + "Failed", + "Pending", + "Queued", + "ReadConfirmation" + ], + "type": "string" + }, + "detail": { + "type": "string" + }, + "isRetry": { + "type": "boolean" + }, + "isTest": { + "type": "boolean" + }, + "providerId": { + "type": "object" + }, + "raw": { + "type": "string" + }, + "source": { + "enum": [ + "Credentials", + "Internal", + "Payload", + "Webhook" + ], + "type": "string" + } + }, + "required": [ + "_id", + "_jobId", + "status", + "detail", + "isRetry", + "isTest", + "providerId", + "source" + ] + }, + "MessageTemplateDto": { + "type": "object", + "properties": {} + }, + "ActivityNotificationStepResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "filters": { + "$ref": "#/components/schemas/StepFilter" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplateDto" + } + }, + "required": [ + "_id", + "active", + "filters" + ] + }, + "ActivityNotificationJobResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "digest": { + "type": "object" + }, + "executionDetails": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationExecutionDetailResponseDto" + } + }, + "step": { + "$ref": "#/components/schemas/ActivityNotificationStepResponseDto" + }, + "payload": { + "type": "object" + }, + "providerId": { + "type": "object" + }, + "status": { + "type": "string" + } + }, + "required": [ + "_id", + "type", + "executionDetails", + "step", + "providerId", + "status" + ] + }, + "ActivityNotificationResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "transactionId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "channels": { + "type": "string", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "subscriber": { + "$ref": "#/components/schemas/ActivityNotificationSubscriberResponseDto" + }, + "template": { + "$ref": "#/components/schemas/ActivityNotificationTemplateResponseDto" + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationJobResponseDto" + } + } + }, + "required": [ + "_environmentId", + "_organizationId", + "transactionId" + ] + }, + "ActivitiesResponseDto": { + "type": "object", + "properties": { + "hasMore": { + "type": "boolean" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "hasMore", + "data", + "pageSize", + "page" + ] + }, + "ActivityStatsResponseDto": { + "type": "object", + "properties": { + "weeklySent": { + "type": "number" + }, + "monthlySent": { + "type": "number" + } + }, + "required": [ + "weeklySent", + "monthlySent" + ] + }, + "ActivityGraphStatesResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "count": { + "type": "number" + }, + "templates": { + "type": "array", + "items": { + "type": "string" + } + }, + "channels": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ] + } + } + }, + "required": [ + "_id", + "count", + "templates", + "channels" + ] + }, + "FeedResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + } + }, + "required": [ + "name", + "identifier", + "_environmentId", + "_organizationId" + ] + }, + "CreateFeedRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "DeleteMessageResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "IGroupedBlueprint": { + "type": "object", + "properties": {} + }, + "GroupedBlueprintResponse": { + "type": "object", + "properties": { + "general": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IGroupedBlueprint" + } + }, + "popular": { + "$ref": "#/components/schemas/IGroupedBlueprint" + } + }, + "required": [ + "general", + "popular" + ] + }, + "NotificationStepDto": { + "type": "object", + "properties": {} + }, + "GetBlueprintResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean" + }, + "preferenceSettings": { + "type": "object" + }, + "critical": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStepDto" + } + }, + "_organizationId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "type": "object" + } + }, + "_notificationGroupId": { + "type": "string" + }, + "_parentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "notificationGroup": { + "type": "object" + }, + "isBlueprint": { + "type": "boolean" + }, + "blueprintId": { + "type": "string" + } + }, + "required": [ + "_id", + "name", + "description", + "active", + "draft", + "preferenceSettings", + "critical", + "tags", + "steps", + "_organizationId", + "_creatorId", + "_environmentId", + "triggers", + "_notificationGroupId", + "deleted", + "deletedAt", + "deletedBy", + "isBlueprint" + ] + } + } + } +} \ No newline at end of file diff --git a/specs/openapi-0.24.0.json b/specs/openapi-0.24.0.json new file mode 100644 index 0000000..7ce031b --- /dev/null +++ b/specs/openapi-0.24.0.json @@ -0,0 +1,23015 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/inbound-parse/mx/status": { + "get": { + "operationId": "InboundParseController_getMxRecordStatus", + "summary": "Validate the mx record setup for the inbound parse functionality", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetMxRecordResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Inbound Parse" + ] + } + }, + "/v1/organizations": { + "post": { + "operationId": "OrganizationController_createOrganization", + "summary": "Create an organization", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOrganizationDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/OrganizationResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + }, + "get": { + "operationId": "OrganizationController_getOrganizations", + "summary": "Fetch all organizations", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrganizationResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + }, + "patch": { + "operationId": "OrganizationController_renameOrganization", + "summary": "Rename organization name", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RenameOrganizationDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/RenameOrganizationDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + } + }, + "/v1/organizations/me": { + "get": { + "operationId": "OrganizationController_getMyOrganization", + "summary": "Fetch current organization details", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/OrganizationResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + } + }, + "/v1/organizations/members/{memberId}": { + "delete": { + "operationId": "OrganizationController_removeMember", + "summary": "Remove a member from organization using memberId", + "parameters": [ + { + "name": "memberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/MemberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + } + }, + "/v1/organizations/members": { + "get": { + "operationId": "OrganizationController_getMember", + "summary": "Fetch all members of current organizations", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MemberResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + } + }, + "/v1/organizations/branding": { + "put": { + "operationId": "OrganizationController_updateBrandingDetails", + "summary": "Update organization branding details", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateBrandingDetailsDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/OrganizationBrandingResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Organizations" + ] + } + }, + "/v1/environments/me": { + "get": { + "operationId": "EnvironmentsController_getCurrentEnvironment", + "summary": "Get current environment", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments": { + "get": { + "operationId": "EnvironmentsController_getMyEnvironments", + "summary": "Get environments", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EnvironmentResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/api-keys": { + "get": { + "operationId": "EnvironmentsController_getOrganizationApiKeys", + "summary": "Get api keys", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/environments/api-keys/regenerate": { + "post": { + "operationId": "EnvironmentsController_regenerateOrganizationApiKeys", + "summary": "Regenerate api keys", + "parameters": [], + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApiKey" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Environments" + ] + } + }, + "/v1/notification-groups": { + "post": { + "operationId": "NotificationGroupsController_createNotificationGroup", + "summary": "Create workflow group", + "description": "workflow group was previously named notification group", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationGroupRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "get": { + "operationId": "NotificationGroupsController_getNotificationGroups", + "summary": "Get workflow groups", + "description": "workflow group was previously named notification group", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + } + }, + "/v1/notification-groups/{id}": { + "get": { + "operationId": "NotificationGroupsController_getNotificationGroup", + "summary": "Get workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "patch": { + "operationId": "NotificationGroupsController_updateNotificationGroup", + "summary": "Update workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateNotificationGroupRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/NotificationGroupResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + }, + "delete": { + "operationId": "NotificationGroupsController_deleteNotificationGroup", + "summary": "Delete workflow group", + "description": "workflow group was previously named notification group", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteNotificationGroupResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflow groups" + ] + } + }, + "/v1/changes": { + "get": { + "operationId": "ChangesController_getChanges", + "summary": "Get changes", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + }, + { + "name": "promoted", + "required": true, + "in": "query", + "schema": { + "default": "false", + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangesResponseDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/count": { + "get": { + "operationId": "ChangesController_getChangesCount", + "summary": "Get changes count", + "parameters": [], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataNumberDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/bulk/apply": { + "post": { + "operationId": "ChangesController_bulkApplyDiff", + "summary": "Apply changes", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkApplyChangeDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/changes/{changeId}/apply": { + "post": { + "operationId": "ChangesController_applyDiff", + "summary": "Apply change", + "parameters": [ + { + "name": "changeId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Changes" + ] + } + }, + "/v1/layouts": { + "post": { + "operationId": "LayoutsController_PropertyDescriptor", + "summary": "Layout creation", + "description": "Create a layout", + "parameters": [], + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateLayoutResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Layouts" + ] + }, + "get": { + "operationId": "LayoutsController_filterLayouts", + "summary": "Filter layouts", + "description": "Returns a list of layouts that can be paginated using the `page` query parameter and filtered by the environment where it is executed from the organization the user belongs to.", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "Number of page for the pagination", + "schema": { + "minimum": 0, + "type": "number" + } + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "description": "Size of page for the pagination", + "schema": { + "minimum": 0, + "type": "number" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "Sort field. Currently only supported `createdAt`", + "schema": { + "type": "string" + } + }, + { + "name": "orderBy", + "required": false, + "in": "query", + "description": "Direction of the sorting query param. Either ascending (1) or descending (-1)", + "schema": { + "enum": [ + 1, + -1 + ], + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "The list of layouts that match the criteria of the query params are successfully returned.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterLayoutsResponseDto" + } + } + } + }, + "400": { + "description": "Page size can not be larger than the page size limit.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/layouts/{layoutId}": { + "get": { + "operationId": "LayoutsController_getLayout", + "summary": "Get layout", + "description": "Get a layout by its ID", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetLayoutResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Layouts" + ] + }, + "delete": { + "operationId": "LayoutsController_deleteLayout", + "summary": "Delete layout", + "description": "Execute a soft delete of a layout given a certain ID.", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The layout has been deleted correctly", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be deleted.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "Either you are trying to delete a layout that is being used or a layout that is the default in the environment.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Layouts" + ] + }, + "patch": { + "operationId": "LayoutsController_updateLayout", + "summary": "Update a layout", + "description": "Update the name, content and variables of a layout. Also change it to be default or no.", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateLayoutRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateLayoutResponseDto" + } + } + } + } + } + }, + "400": { + "description": "The payload provided or the URL param are not right.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be updated.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "One default layout is needed. If you are trying to turn a default layout as not default, you should turn a different layout as default first and automatically it will be done by the system.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "example": "One default layout is required" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/layouts/{layoutId}/default": { + "post": { + "operationId": "LayoutsController_setDefaultLayout", + "summary": "Set default layout", + "description": "Sets the default layout for the environment and updates to non default to the existing default layout (if any).", + "parameters": [ + { + "name": "layoutId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The selected layout has been set as the default for the environment.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "404": { + "description": "The layout with the layoutId provided does not exist in the database so it can not be set as the default for the environment.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Layouts" + ] + } + }, + "/v1/integrations": { + "get": { + "operationId": "IntegrationsController_getIntegrations", + "summary": "Get integrations", + "description": "Return all the integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change", + "parameters": [], + "responses": { + "200": { + "description": "The list of integrations belonging to the organization that are successfully returned.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + }, + "post": { + "operationId": "IntegrationsController_createIntegration", + "summary": "Create integration", + "description": "Create an integration for the current environment the user is based on the API key provided", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIntegrationRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/active": { + "get": { + "operationId": "IntegrationsController_getActiveIntegrations", + "summary": "Get active integrations", + "description": "Return all the active integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change", + "parameters": [], + "responses": { + "200": { + "description": "The list of active integrations belonging to the organization that are successfully returned.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/webhook/provider/{providerOrIntegrationId}/status": { + "get": { + "operationId": "IntegrationsController_getWebhookSupportStatus", + "summary": "Get webhook support status for provider", + "description": "Return the status of the webhook for this provider, if it is supported or if it is not based on a boolean value", + "parameters": [ + { + "name": "providerOrIntegrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The status of the webhook for the provider requested", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "type": "boolean" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{integrationId}": { + "put": { + "operationId": "IntegrationsController_updateIntegrationById", + "summary": "Update integration", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIntegrationRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The integration with the integrationId provided does not exist in the database.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + }, + "delete": { + "operationId": "IntegrationsController_removeIntegration", + "summary": "Delete integration", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/integrations/{integrationId}/set-primary": { + "post": { + "operationId": "IntegrationsController_setIntegrationAsPrimary", + "summary": "Set integration as primary", + "parameters": [ + { + "name": "integrationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrationResponseDto" + } + } + } + }, + "404": { + "description": "The integration with the integrationId provided does not exist in the database.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Integrations" + ] + } + }, + "/v1/execution-details": { + "get": { + "operationId": "ExecutionDetailsController_getExecutionDetailsForNotification", + "summary": "Get execution details", + "parameters": [ + { + "name": "notificationId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExecutionDetailsResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Execution Details" + ] + } + }, + "/v1/notification-templates": { + "get": { + "operationId": "NotificationTemplateController_getNotificationTemplates", + "summary": "Get Notification templates", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "post": { + "operationId": "NotificationTemplateController_createNotificationTemplates", + "summary": "Create Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{templateId}": { + "put": { + "operationId": "NotificationTemplateController_updateTemplateById", + "summary": "Update Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + }, + "delete": { + "operationId": "NotificationTemplateController_deleteTemplateById", + "summary": "Delete Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{workflowIdOrIdentifier}": { + "get": { + "operationId": "NotificationTemplateController_getNotificationTemplateById", + "summary": "Get Notification template", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "workflowIdOrIdentifier", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/notification-templates/{templateId}/status": { + "put": { + "operationId": "NotificationTemplateController_changeActiveStatus", + "summary": "Update Notification template status", + "description": "Notification templates have been renamed to Workflows, Please use the new workflows controller", + "deprecated": true, + "parameters": [ + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeWorkflowStatusRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification Templates" + ] + } + }, + "/v1/workflows": { + "get": { + "operationId": "WorkflowController_getWorkflows", + "summary": "Get workflows", + "description": "Workflows were previously named notification templates", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowsResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "post": { + "operationId": "WorkflowController_createWorkflows", + "summary": "Create workflow", + "description": "Workflow was previously named notification template", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowId}": { + "put": { + "operationId": "WorkflowController_updateWorkflowById", + "summary": "Update workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + }, + "delete": { + "operationId": "WorkflowController_deleteWorkflowById", + "summary": "Delete workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/variables": { + "get": { + "operationId": "WorkflowController_getWorkflowVariables", + "summary": "Get available variables", + "description": "Get the variables that can be used in the workflow", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/VariablesResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowIdOrIdentifier}": { + "get": { + "operationId": "WorkflowController_getWorkflowById", + "summary": "Get workflow", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowIdOrIdentifier", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/workflows/{workflowId}/status": { + "put": { + "operationId": "WorkflowController_changeActiveStatus", + "summary": "Update workflow status", + "description": "Workflow was previously named notification template", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangeWorkflowStatusRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/WorkflowResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows" + ] + } + }, + "/v1/events/trigger": { + "post": { + "operationId": "EventsController_trackEvent", + "summary": "Trigger event", + "description": "\n Trigger event is the main (and only) way to send notifications to subscribers. \n The trigger identifier is used to match the particular workflow associated with it. \n Additional information can be passed according the body interface below.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/bulk": { + "post": { + "operationId": "EventsController_triggerBulkEvents", + "summary": "Bulk trigger event", + "description": "\n Using this endpoint you can trigger multiple events at once, to avoid multiple calls to the API.\n The bulk API is limited to 100 events per request.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkTriggerEventDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/broadcast": { + "post": { + "operationId": "EventsController_trackEventToAll", + "summary": "Broadcast event to all", + "description": "Trigger a broadcast event to all existing subscribers, could be used to send announcements, etc.\n In the future could be used to trigger events to a subset of subscribers based on defined filters.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventToAllRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TriggerEventResponseDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/events/trigger/{transactionId}": { + "delete": { + "operationId": "EventsController_cancelDelayed", + "summary": "Cancel triggered event", + "description": "\n Using a previously generated transactionId during the event trigger,\n will cancel any active or pending workflows. This is useful to cancel active digests, delays etc...\n ", + "parameters": [ + { + "name": "transactionId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Events" + ] + } + }, + "/v1/subscribers": { + "get": { + "operationId": "SubscribersController_getSubscribers", + "summary": "Get subscribers", + "description": "Returns a list of subscribers, could paginated using the `page` and `limit` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + ] + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "post": { + "operationId": "SubscribersController_createSubscriber", + "summary": "Create subscriber", + "description": "Creates a subscriber entity, in the Novu platform. The subscriber will be later used to receive notifications, and access notification feeds. Communication credentials such as email, phone number, and 3 rd party credentials i.e slack tokens could be later associated to this entity.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSubscriberRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}": { + "get": { + "operationId": "SubscribersController_getSubscriber", + "summary": "Get subscriber", + "description": "Get subscriber by your internal id used to identify the subscriber", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "put": { + "operationId": "SubscribersController_updateSubscriber", + "summary": "Update subscriber", + "description": "Used to update the subscriber entity with new information", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "delete": { + "operationId": "SubscribersController_removeSubscriber", + "summary": "Delete subscriber", + "description": "Deletes a subscriber entity from the Novu platform", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteSubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/bulk": { + "post": { + "operationId": "SubscribersController_bulkCreateSubscribers", + "summary": "Bulk create subscribers", + "description": "\n Using this endpoint you can create multiple subscribers at once, to avoid multiple calls to the API.\n The bulk API is limited to 500 subscribers per request.\n ", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkSubscriberCreateDto" + } + } + } + }, + "responses": { + "201": { + "description": "" + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials": { + "put": { + "operationId": "SubscribersController_updateSubscriberChannel", + "summary": "Update subscriber credentials", + "description": "Subscriber credentials associated to the delivery methods such as slack and push tokens.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberChannelRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "patch": { + "operationId": "SubscribersController_modifySubscriberChannel", + "summary": "Modify subscriber credentials", + "description": "Subscriber credentials associated to the delivery methods such as slack and push tokens.\n This endpoint appends provided credentials and deviceTokens to the existing ones.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberChannelRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}": { + "delete": { + "operationId": "SubscribersController_deleteSubscriberCredentials", + "summary": "Delete subscriber credentials by providerId", + "description": "Delete subscriber credentials such as slack and expo tokens.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "" + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/online-status": { + "patch": { + "operationId": "SubscribersController_updateSubscriberOnlineFlag", + "summary": "Update subscriber online status", + "description": "Used to update the subscriber isOnline flag.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberOnlineFlagRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/SubscriberResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences": { + "get": { + "operationId": "SubscribersController_getSubscriberPreference", + "summary": "Get subscriber preferences", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + }, + "patch": { + "operationId": "SubscribersController_updateSubscriberGlobalPreferences", + "summary": "Update subscriber global preferences", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberGlobalPreferencesRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences/{level}": { + "get": { + "operationId": "SubscribersController_getSubscriberPreferenceByLevel", + "summary": "Get subscriber preferences by level", + "parameters": [ + { + "name": "level", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GetSubscriberPreferencesResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/preferences/{templateId}": { + "patch": { + "operationId": "SubscribersController_updateSubscriberPreference", + "summary": "Update subscriber preference", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "templateId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateSubscriberPreferenceResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/notifications/feed": { + "get": { + "operationId": "SubscribersController_getNotificationsFeed", + "summary": "Get in-app notification feed for a particular subscriber", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + }, + { + "name": "read", + "required": false, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "seen", + "required": false, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "payload", + "required": false, + "in": "query", + "description": "Base64 encoded string of the partial payload JSON object", + "example": "btoa(JSON.stringify({ foo: 123 })) results in base64 encoded string like eyJmb28iOjEyM30=", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + ] + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/notifications/unseen": { + "get": { + "operationId": "SubscribersController_getUnseenCount", + "summary": "Get the unseen in-app notifications count for subscribers feed", + "parameters": [ + { + "name": "seen", + "required": true, + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "required": true, + "in": "query", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UnseenCountResponse" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/markAs": { + "post": { + "operationId": "SubscribersController_markMessageAs", + "summary": "Mark a subscriber feed message as seen", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkMessageAsRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/mark-all": { + "post": { + "operationId": "SubscribersController_markAllUnreadAsRead", + "summary": "Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed.", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkAllMessageAsRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "number" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}": { + "post": { + "operationId": "SubscribersController_markActionAsSeen", + "summary": "Mark message action as seen", + "parameters": [ + { + "name": "messageId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "type", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MarkMessageActionAsSeenDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/MessageResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback": { + "get": { + "operationId": "SubscribersController_chatOauthCallback", + "summary": "Handle providers oauth redirect", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "code", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "hmacHash", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "integrationIdentifier", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth": { + "get": { + "operationId": "SubscribersController_chatAccessOauth", + "summary": "Handle chat oauth", + "parameters": [ + { + "name": "subscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "hmacHash", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "environmentId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "integrationIdentifier", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Subscribers" + ] + } + }, + "/v1/topics": { + "post": { + "operationId": "TopicsController_createTopic", + "summary": "Topic creation", + "description": "Create a topic", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTopicRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateTopicResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "get": { + "operationId": "TopicsController_filterTopics", + "summary": "Filter topics", + "description": "Returns a list of topics that can be paginated using the `page` query parameter and filtered by the topic key with the `key` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "description": "Number of page for the pagination", + "schema": { + "minimum": 0, + "default": 0, + "type": "number" + } + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "description": "Size of page for the pagination", + "schema": { + "minimum": 0, + "default": 10, + "type": "number" + } + }, + { + "name": "key", + "required": false, + "in": "query", + "description": "Topic key", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FilterTopicsResponseDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers": { + "post": { + "operationId": "TopicsController_addSubscribers", + "summary": "Subscribers addition", + "description": "Add subscribers to a topic by key", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddSubscribersRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "" + }, + "204": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "" + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers/{externalSubscriberId}": { + "get": { + "operationId": "TopicsController_getTopicSubscriber", + "summary": "Check topic subscriber", + "description": "Check if a subscriber belongs to a certain topic", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "externalSubscriberId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TopicSubscriberDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}/subscribers/removal": { + "post": { + "operationId": "TopicsController_removeSubscribers", + "summary": "Subscribers removal", + "description": "Remove subscribers from a topic", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveSubscribersRequestDto" + } + } + } + }, + "responses": { + "204": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "" + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/topics/{topicKey}": { + "delete": { + "operationId": "TopicsController_deleteTopic", + "summary": "Delete topic", + "description": "Delete a topic by its topic key if it has no subscribers", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The topic has been deleted correctly", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "404": { + "description": "The topic with the key provided does not exist in the database so it can not be deleted.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The topic you are trying to delete has subscribers assigned to it. Delete the subscribers before deleting the topic.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "get": { + "operationId": "TopicsController_getTopic", + "summary": "Get topic", + "description": "Get a topic by its topic key", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetTopicResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + }, + "patch": { + "operationId": "TopicsController_renameTopic", + "summary": "Rename a topic", + "description": "Rename a topic by providing a new name", + "parameters": [ + { + "name": "topicKey", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RenameTopicRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/RenameTopicResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Topics" + ] + } + }, + "/v1/tenants": { + "get": { + "operationId": "TenantController_getTenants", + "summary": "Get tenants", + "description": "Returns a list of tenants, could paginated using the `page` and `limit` query parameter", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponseDto" + }, + { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GetTenantResponseDto" + } + } + } + } + ] + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Tenants" + ] + }, + "post": { + "operationId": "TenantController_createTenant", + "summary": "Create tenant", + "description": "Create tenant under the current environment", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTenantRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateTenantResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTenantResponseDto" + } + } + } + }, + "409": { + "description": "A tenant with the same identifier is already exist.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Tenants" + ] + } + }, + "/v1/tenants/{identifier}": { + "get": { + "operationId": "TenantController_getTenantById", + "summary": "Get tenant", + "description": "Get tenant by your internal id used to identify the tenant", + "parameters": [ + { + "name": "identifier", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetTenantResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The tenant with the identifier provided does not exist in the database.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Tenants" + ] + }, + "patch": { + "operationId": "TenantController_updateTenant", + "summary": "Update tenant", + "description": "Update tenant by your internal id used to identify the tenant", + "parameters": [ + { + "name": "identifier", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTenantRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateTenantResponseDto" + } + } + } + } + } + }, + "404": { + "description": "The tenant with the identifier provided does not exist in the database.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Tenants" + ] + }, + "delete": { + "operationId": "TenantController_removeTenant", + "summary": "Delete tenant", + "description": "Deletes a tenant entity from the Novu platform", + "parameters": [ + { + "name": "identifier", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "The tenant has been deleted correctly", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "404": { + "description": "The tenant with the identifier provided does not exist in the database so it can not be deleted.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Tenants" + ] + } + }, + "/v1/notifications": { + "get": { + "operationId": "NotificationsController_getNotifications", + "summary": "Get notifications", + "parameters": [ + { + "name": "channels", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ] + } + } + }, + { + "name": "templates", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "emails", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "search", + "required": true, + "in": "query", + "deprecated": true, + "schema": { + "type": "string" + } + }, + { + "name": "subscriberIds", + "required": true, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 0, + "type": "number" + } + }, + { + "name": "transactionId", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivitiesResponseDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/stats": { + "get": { + "operationId": "NotificationsController_getActivityStats", + "summary": "Get notification statistics", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ActivityStatsResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/graph/stats": { + "get": { + "operationId": "NotificationsController_getActivityGraphStats", + "summary": "Get notification graph statistics", + "parameters": [ + { + "name": "days", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityGraphStatesResponse" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/notifications/{notificationId}": { + "get": { + "operationId": "NotificationsController_getActivity", + "summary": "Get notification", + "parameters": [ + { + "name": "notificationId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/ActivityNotificationResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Notification" + ] + } + }, + "/v1/feeds": { + "post": { + "operationId": "FeedsController_createFeed", + "summary": "Create feed", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateFeedRequestDto" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Feeds" + ] + }, + "get": { + "operationId": "FeedsController_getFeeds", + "summary": "Get feeds", + "parameters": [], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Feeds" + ] + } + }, + "/v1/feeds/{feedId}": { + "delete": { + "operationId": "FeedsController_deleteFeedById", + "summary": "Delete feed", + "parameters": [ + { + "name": "feedId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FeedResponseDto" + } + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Feeds" + ] + } + }, + "/v1/messages": { + "get": { + "operationId": "MessagesController_getMessages", + "summary": "Get messages", + "description": "Returns a list of messages, could paginate using the `page` query parameter", + "parameters": [ + { + "name": "channel", + "required": false, + "in": "query", + "schema": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + } + }, + { + "name": "subscriberId", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "transactionId", + "required": false, + "in": "query", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 0, + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ActivitiesResponseDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/messages/{messageId}": { + "delete": { + "operationId": "MessagesController_deleteMessage", + "summary": "Delete message", + "description": "Deletes a message entity from the Novu platform", + "parameters": [ + { + "name": "messageId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/DeleteMessageResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/messages/transaction/{transactionId}": { + "delete": { + "operationId": "MessagesController_deleteMessagesByTransactionId", + "summary": "Delete messages by transactionId", + "description": "Deletes messages entity from the Novu platform using TransactionId of message", + "parameters": [ + { + "name": "channel", + "required": false, + "in": "query", + "description": "The channel of the message to be deleted", + "schema": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + } + }, + { + "name": "transactionId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "" + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Messages" + ] + } + }, + "/v1/blueprints/group-by-category": { + "get": { + "operationId": "BlueprintController_getGroupedBlueprints", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GroupedBlueprintResponse" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + } + } + }, + "/v1/blueprints/{templateIdOrIdentifier}": { + "get": { + "operationId": "BlueprintController_getBlueprintById", + "parameters": [ + { + "name": "templateIdOrIdentifier", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetBlueprintResponse" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + } + } + }, + "/v1/workflow-overrides": { + "post": { + "operationId": "WorkflowOverridesController_createWorkflowOverride", + "summary": "Create workflow override", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowOverrideRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/CreateWorkflowOverrideResponseDto" + } + } + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWorkflowOverrideResponseDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + }, + "get": { + "operationId": "WorkflowOverridesController_getWorkflowOverrides", + "summary": "Get workflow overrides", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "maximum": 100, + "default": 10, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetWorkflowOverridesResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + } + }, + "/v1/workflow-overrides/{overrideId}": { + "put": { + "operationId": "WorkflowOverridesController_updateWorkflowOverrideById", + "summary": "Update workflow override by id", + "parameters": [ + { + "name": "overrideId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowOverrideRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateWorkflowOverrideResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + }, + "get": { + "operationId": "WorkflowOverridesController_getWorkflowOverrideById", + "summary": "Get workflow override by id", + "parameters": [ + { + "name": "overrideId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetWorkflowOverrideResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + }, + "delete": { + "operationId": "WorkflowOverridesController_deleteWorkflowOverride", + "summary": "Delete workflow override", + "parameters": [ + { + "name": "overrideId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataBooleanDto" + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + } + }, + "/v1/workflow-overrides/workflows/{workflowId}/tenants/{tenantId}": { + "put": { + "operationId": "WorkflowOverridesController_updateWorkflowOverride", + "summary": "Update workflow override", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "tenantId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWorkflowOverrideRequestDto" + } + } + } + }, + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/UpdateWorkflowOverrideResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + }, + "get": { + "operationId": "WorkflowOverridesController_getWorkflowOverride", + "summary": "Get workflow override", + "parameters": [ + { + "name": "workflowId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "tenantId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Ok", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "$ref": "#/components/schemas/GetWorkflowOverrideResponseDto" + } + } + } + } + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + }, + "Link": { + "$ref": "#/components/headers/Link" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second" + } + } + } + }, + "429": { + "description": "The client has sent too many requests in a given amount of time. ", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "API rate limit exceeded" + } + } + } + }, + "503": { + "description": "The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.", + "headers": { + "Content-Type": { + "$ref": "#/components/headers/Content-Type" + }, + "RateLimit-Limit": { + "$ref": "#/components/headers/RateLimit-Limit" + }, + "RateLimit-Remaining": { + "$ref": "#/components/headers/RateLimit-Remaining" + }, + "RateLimit-Reset": { + "$ref": "#/components/headers/RateLimit-Reset" + }, + "RateLimit-Policy": { + "$ref": "#/components/headers/RateLimit-Policy" + }, + "Idempotency-Key": { + "$ref": "#/components/headers/Idempotency-Key" + }, + "Idempotency-Replay": { + "$ref": "#/components/headers/Idempotency-Replay" + }, + "Retry-After": { + "$ref": "#/components/headers/Retry-After" + } + }, + "content": { + "application/json": { + "schema": { + "type": "string", + "example": "Please wait some time, then try again." + } + } + } + } + }, + "tags": [ + "Workflows-Overrides" + ] + } + } + }, + "info": { + "title": "Novu API", + "description": "Novu REST API. Please see https://docs.novu.co/api-reference for more details.", + "version": "1.0", + "contact": { + "name": "Novu Support", + "url": "https://discord.gg/novu", + "email": "support@novu.co" + }, + "termsOfService": "https://novu.co/terms", + "license": { + "name": "MIT", + "url": "https://opensource.org/license/mit" + } + }, + "tags": [ + { + "name": "Events", + "description": "Events represent a change in state of a subscriber. They are used to trigger workflows, and enable you to send notifications to subscribers based on their actions.", + "externalDocs": { + "url": "https://docs.novu.co/workflows" + } + }, + { + "name": "Subscribers", + "description": "A subscriber in Novu represents someone who should receive a message. A subscriber’s profile information contains important attributes about the subscriber that will be used in messages (name, email). The subscriber object can contain other key-value pairs that can be used to further personalize your messages.", + "externalDocs": { + "url": "https://docs.novu.co/subscribers/subscribers" + } + }, + { + "name": "Topics", + "description": "Topics are a way to group subscribers together so that they can be notified of events at once. A topic is identified by a custom key. This can be helpful for things like sending out marketing emails or notifying users of new features. Topics can also be used to send notifications to the subscribers who have been grouped together based on their interests, location, activities and much more.", + "externalDocs": { + "url": "https://docs.novu.co/subscribers/topics" + } + }, + { + "name": "Notification", + "description": "A notification conveys information from source to recipient, triggered by a workflow acting as a message blueprint. Notifications can be individual or bundled as digest for user-friendliness.", + "externalDocs": { + "url": "https://docs.novu.co/getting-started/introduction" + } + }, + { + "name": "Integrations", + "description": "With the help of the Integration Store, you can easily integrate your favorite delivery provider. During the runtime of the API, the Integrations Store is responsible for storing the configurations of all the providers.", + "externalDocs": { + "url": "https://docs.novu.co/channels-and-providers/integration-store" + } + }, + { + "name": "Layouts", + "description": "Novu allows the creation of layouts - a specific HTML design or structure to wrap content of email notifications. Layouts can be manipulated and assigned to new or existing workflows within the Novu platform, allowing users to create, manage, and assign these layouts to workflows, so they can be reused to structure the appearance of notifications sent through the platform.", + "externalDocs": { + "url": "https://docs.novu.co/content-creation-design/layouts" + } + }, + { + "name": "Workflows", + "description": "All notifications are sent via a workflow. Each workflow acts as a container for the logic and blueprint that are associated with a type of notification in your system.", + "externalDocs": { + "url": "https://docs.novu.co/workflows" + } + }, + { + "name": "Notification Templates", + "description": "Deprecated. Use Workflows (/workflows) instead, which provide the same functionality under a new name." + }, + { + "name": "Workflow groups", + "description": "Workflow groups are used to organize workflows into logical groups." + }, + { + "name": "Changes", + "description": "Changes represent a change in state of an environment. They are analagous to a pending pull request in git, enabling you to test changes before they are applied to your environment and atomically apply them when you are ready.", + "externalDocs": { + "url": "https://docs.novu.co/platform/environments#promoting-pending-changes-to-production" + } + }, + { + "name": "Environments", + "description": "Novu uses the concept of environments to ensure logical separation of your data and configuration. This means that subscribers, and preferences created in one environment are never accessible to another.", + "externalDocs": { + "url": "https://docs.novu.co/platform/environments" + } + }, + { + "name": "Inbound Parse", + "description": "Inbound Webhook is a feature that allows processing of incoming emails for a domain or subdomain. The feature parses the contents of the email and POSTs the information to a specified URL in a multipart/form-data format.", + "externalDocs": { + "url": "https://docs.novu.co/platform/inbound-parse-webhook" + } + }, + { + "name": "Feeds", + "description": "Novu provides a notification activity feed that monitors every outgoing message associated with its relevant metadata. This can be used to monitor activity and discover potential issues with a specific provider or a channel type.", + "externalDocs": { + "url": "https://docs.novu.co/activity-feed" + } + }, + { + "name": "Tenants", + "description": "A tenant represents a group of users. As a developer, when your apps have organizations, they are referred to as tenants. Tenants in Novu provides the ability to tailor specific notification experiences to users of different groups or organizations.", + "externalDocs": { + "url": "https://docs.novu.co/tenants" + } + }, + { + "name": "Messages", + "description": "A message in Novu represents a notification delivered to a recipient on a particular channel. Messages contain information about the request that triggered its delivery, a view of the data sent to the recipient, and a timeline of its lifecycle events. Learn more about messages.", + "externalDocs": { + "url": "https://docs.novu.co/workflows/messages" + } + }, + { + "name": "Organizations", + "description": "An organization serves as a separate entity within your Novu account. Each organization you create has its own separate integration store, workflows, subscribers, and API keys. This separation of resources allows you to manage multi-tenant environments and separate domains within a single account.", + "externalDocs": { + "url": "https://docs.novu.co/platform/organizations" + } + }, + { + "name": "Execution Details", + "description": "Execution details are used to track the execution of a workflow. They provided detailed information on the execution of a workflow, including the status of each step, the input and output of each step, and the overall status of the execution.", + "externalDocs": { + "url": "https://docs.novu.co/activity-feed" + } + } + ], + "servers": [ + { + "url": "http://localhost:3000" + } + ], + "components": { + "securitySchemes": { + "api_key": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "API key authentication. Allowed headers-- \"Authorization: ApiKey \u003Capi_key\u003E\"." + } + }, + "schemas": { + "DataWrapperDto": { + "type": "object", + "properties": { + "data": { + "type": "object" + } + }, + "required": [ + "data" + ] + }, + "GetMxRecordResponseDto": { + "type": "object", + "properties": { + "mxRecordConfigured": { + "type": "boolean" + } + }, + "required": [ + "mxRecordConfigured" + ] + }, + "OrganizationBrandingResponseDto": { + "type": "object", + "properties": { + "direction": { + "enum": [ + "ltr", + "trl" + ], + "type": "string" + }, + "logo": { + "type": "string" + }, + "color": { + "type": "string" + }, + "fontColor": { + "type": "string" + }, + "contentBackground": { + "type": "string" + }, + "fontFamily": { + "type": "string" + } + }, + "required": [ + "logo", + "color", + "fontColor", + "contentBackground" + ] + }, + "IPartnerConfigurationResponseDto": { + "type": "object", + "properties": { + "projectIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "accessToken": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "partnerType": { + "type": "string", + "enum": [ + "vercel" + ], + "description": "Partner Type Enum" + } + }, + "required": [ + "accessToken", + "configurationId", + "partnerType" + ] + }, + "OrganizationResponseDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "logo": { + "type": "string" + }, + "branding": { + "$ref": "#/components/schemas/OrganizationBrandingResponseDto" + }, + "partnerConfigurations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IPartnerConfigurationResponseDto" + } + } + }, + "required": [ + "name", + "branding" + ] + }, + "CreateOrganizationDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "logo": { + "type": "string" + }, + "jobTitle": { + "type": "string", + "enum": [ + "engineer", + "engineering_manager", + "architect", + "product_manager", + "designer", + "other" + ] + }, + "domain": { + "type": "string" + }, + "productUseCases": { + "type": "object" + } + }, + "required": [ + "name" + ] + }, + "MemberUserDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "_id", + "firstName", + "lastName", + "email" + ] + }, + "MemberInviteDTO": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "token": { + "type": "string" + }, + "invitationDate": { + "format": "date-time", + "type": "string" + }, + "answerDate": { + "format": "date-time", + "type": "string" + }, + "_inviterId": { + "type": "string" + } + }, + "required": [ + "email", + "token", + "invitationDate", + "_inviterId" + ] + }, + "MemberResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_userId": { + "type": "string" + }, + "user": { + "$ref": "#/components/schemas/MemberUserDto" + }, + "roles": { + "enum": [ + "admin", + "member" + ], + "type": "array", + "items": { + "type": "string", + "enum": [ + "admin", + "member" + ] + } + }, + "invite": { + "$ref": "#/components/schemas/MemberInviteDTO" + }, + "memberStatus": { + "enum": [ + "new", + "active", + "invited" + ], + "type": "string" + }, + "_organizationId": { + "type": "string" + } + }, + "required": [ + "_id", + "_userId", + "_organizationId" + ] + }, + "UpdateBrandingDetailsDto": { + "type": "object", + "properties": { + "logo": { + "type": "string" + }, + "color": { + "type": "string" + }, + "fontColor": { + "type": "string" + }, + "contentBackground": { + "type": "string" + }, + "fontFamily": { + "type": "string" + } + }, + "required": [ + "logo", + "color", + "fontColor", + "contentBackground" + ] + }, + "RenameOrganizationDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "EnvironmentResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "apiKeys": { + "type": "array", + "items": { + "type": "object" + } + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_organizationId", + "identifier", + "_parentId" + ] + }, + "ApiKey": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "_userId": { + "type": "string" + } + }, + "required": [ + "key", + "_userId" + ] + }, + "NotificationGroupResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_environmentId", + "_organizationId" + ] + }, + "CreateNotificationGroupRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "DeleteNotificationGroupResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "ChangeResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_entityId": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "type": { + "enum": [ + "Feed", + "MessageTemplate", + "Layout", + "DefaultLayout", + "NotificationTemplate", + "NotificationGroup", + "TranslationGroup", + "Translation" + ], + "type": "string" + }, + "change": { + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_creatorId", + "_environmentId", + "_organizationId", + "_entityId", + "enabled", + "type", + "change", + "createdAt" + ] + }, + "ChangesResponseDto": { + "type": "object", + "properties": { + "totalCount": { + "type": "number" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChangeResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "totalCount", + "data", + "pageSize", + "page" + ] + }, + "DataNumberDto": { + "type": "object", + "properties": { + "data": { + "type": "number" + } + }, + "required": [ + "data" + ] + }, + "BulkApplyChangeDto": { + "type": "object", + "properties": { + "changeIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "changeIds" + ] + }, + "CreateLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + } + }, + "required": [ + "_id" + ] + }, + "LayoutDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "identifier", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "FilterLayoutsResponseDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LayoutDto" + } + }, + "page": { + "type": "number" + }, + "pageSize": { + "type": "number" + }, + "totalCount": { + "type": "number" + } + }, + "required": [ + "data", + "page", + "pageSize", + "totalCount" + ] + }, + "GetLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "identifier", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "UpdateLayoutResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "description": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean" + }, + "isDeleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_creatorId", + "name", + "identifier", + "channel", + "content", + "contentType", + "isDefault", + "isDeleted" + ] + }, + "UpdateLayoutRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Layout updated." + }, + "identifier": { + "type": "string", + "description": "User defined custom key that will be a unique identifier for the Layout updated." + }, + "description": { + "type": "string", + "description": "User defined description of the layout" + }, + "content": { + "type": "string", + "description": "User defined content for the layout." + }, + "variables": { + "description": "User defined variables to render in the layout placeholders.", + "type": "array", + "items": { + "type": "object" + } + }, + "isDefault": { + "type": "boolean", + "description": "Variable that defines if the layout is chosen as default when creating a layout." + } + }, + "required": [ + "identifier" + ] + }, + "CredentialsDto": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + }, + "user": { + "type": "string" + }, + "secretKey": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "password": { + "type": "string" + }, + "host": { + "type": "string" + }, + "port": { + "type": "string" + }, + "secure": { + "type": "boolean" + }, + "region": { + "type": "string" + }, + "accountSid": { + "type": "string" + }, + "messageProfileId": { + "type": "string" + }, + "token": { + "type": "string" + }, + "from": { + "type": "string" + }, + "senderName": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "applicationId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "requireTls": { + "type": "boolean" + }, + "ignoreTls": { + "type": "boolean" + }, + "tlsOptions": { + "type": "object" + }, + "baseUrl": { + "type": "string" + }, + "webhookUrl": { + "type": "string" + }, + "redirectUrl": { + "type": "string" + }, + "hmac": { + "type": "boolean" + }, + "serviceAccount": { + "type": "string" + }, + "ipPoolName": { + "type": "string" + }, + "apiKeyRequestHeader": { + "type": "string" + }, + "secretKeyRequestHeader": { + "type": "string" + }, + "idPath": { + "type": "string" + }, + "datePath": { + "type": "string" + }, + "apiToken": { + "type": "string" + }, + "authenticateByToken": { + "type": "boolean" + }, + "authenticationTokenKey": { + "type": "string" + }, + "instanceId": { + "type": "string" + }, + "alertUid": { + "type": "string" + }, + "title": { + "type": "string" + }, + "imageUrl": { + "type": "string" + }, + "state": { + "type": "string" + }, + "externalLink": { + "type": "string" + } + } + }, + "FieldFilterPart": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + }, + "operator": { + "type": "string", + "enum": [ + "LARGER", + "SMALLER", + "LARGER_EQUAL", + "SMALLER_EQUAL", + "EQUAL", + "NOT_EQUAL", + "ALL_IN", + "ANY_IN", + "NOT_IN", + "BETWEEN", + "NOT_BETWEEN", + "LIKE", + "NOT_LIKE", + "IN" + ] + }, + "on": { + "type": "string", + "enum": [ + "subscriber", + "payload" + ] + } + }, + "required": [ + "field", + "value", + "operator", + "on" + ] + }, + "StepFilter": { + "type": "object", + "properties": { + "isNegated": { + "type": "boolean" + }, + "type": { + "type": "string", + "enum": [ + "BOOLEAN", + "TEXT", + "DATE", + "NUMBER", + "STATEMENT", + "LIST", + "MULTI_LIST", + "GROUP" + ] + }, + "value": { + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "children": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FieldFilterPart" + } + } + }, + "required": [ + "isNegated", + "type", + "value", + "children" + ] + }, + "IntegrationResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "active": { + "type": "boolean" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "primary": { + "type": "boolean" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + } + }, + "required": [ + "_environmentId", + "_organizationId", + "name", + "identifier", + "providerId", + "channel", + "credentials", + "active", + "deleted", + "deletedAt", + "deletedBy", + "primary" + ] + }, + "CreateIntegrationRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "active": { + "type": "boolean", + "description": "If the integration is active the validation on the credentials field will run" + }, + "check": { + "type": "boolean" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + } + }, + "required": [ + "providerId", + "channel" + ] + }, + "UpdateIntegrationRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "active": { + "type": "boolean", + "description": "If the integration is active the validation on the credentials field will run" + }, + "credentials": { + "$ref": "#/components/schemas/CredentialsDto" + }, + "check": { + "type": "boolean" + }, + "conditions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + } + } + }, + "ExecutionDetailsResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_jobId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_notificationId": { + "type": "string" + }, + "_notificationTemplateId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "_messageId": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "transactionId": { + "type": "string" + }, + "channel": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "detail": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "Credentials", + "Internal", + "Payload", + "Webhook" + ] + }, + "status": { + "type": "string", + "enum": [ + "Success", + "Warning", + "Failed", + "Pending", + "Queued", + "ReadConfirmation" + ] + }, + "isTest": { + "type": "boolean" + }, + "isRetry": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_jobId", + "_environmentId", + "_notificationId", + "_notificationTemplateId", + "_subscriberId", + "transactionId", + "channel", + "detail", + "source", + "status", + "isTest", + "isRetry" + ] + }, + "NotificationGroup": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_parentId": { + "type": "string" + } + }, + "required": [ + "name", + "_environmentId", + "_organizationId" + ] + }, + "PreferenceChannels": { + "type": "object", + "properties": { + "email": { + "type": "boolean" + }, + "sms": { + "type": "boolean" + }, + "in_app": { + "type": "boolean" + }, + "chat": { + "type": "boolean" + }, + "push": { + "type": "boolean" + } + } + }, + "DigestRegularMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "digestKey": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "regular", + "backoff" + ] + }, + "backoff": { + "type": "boolean" + }, + "backoffAmount": { + "type": "number" + }, + "backoffUnit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "updateMode": { + "type": "boolean" + } + }, + "required": [ + "type" + ] + }, + "TimedConfig": { + "type": "object", + "properties": { + "atTime": { + "type": "string" + }, + "weekDays": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday" + ] + } + }, + "monthDays": { + "type": "array", + "items": { + "type": "string" + } + }, + "ordinal": { + "type": "string", + "enum": [ + "1", + "2", + "3", + "4", + "5", + "last" + ] + }, + "ordinalValue": { + "type": "string", + "enum": [ + "day", + "weekday", + "weekend", + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday" + ] + }, + "monthlyType": { + "type": "string", + "enum": [ + "each", + "on" + ] + } + } + }, + "DigestTimedMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "digestKey": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "timed" + ] + }, + "timed": { + "$ref": "#/components/schemas/TimedConfig" + } + }, + "required": [ + "type" + ] + }, + "DelayRegularMetadata": { + "type": "object", + "properties": { + "amount": { + "type": "number" + }, + "unit": { + "type": "string", + "enum": [ + "seconds", + "minutes", + "hours", + "days", + "weeks", + "months" + ] + }, + "type": { + "type": "string", + "enum": [ + "regular" + ] + } + }, + "required": [ + "type" + ] + }, + "DelayScheduledMetadata": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "scheduled" + ] + }, + "delayPath": { + "type": "string" + } + }, + "required": [ + "type", + "delayPath" + ] + }, + "MessageTemplate": { + "type": "object", + "properties": {} + }, + "NotificationStepVariant": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "shouldStopOnFail": { + "type": "boolean" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplate" + }, + "filters": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + }, + "_parentId": { + "type": "object" + }, + "metadata": { + "oneOf": [ + { + "$ref": "#/components/schemas/DigestRegularMetadata" + }, + { + "$ref": "#/components/schemas/DigestTimedMetadata" + }, + { + "$ref": "#/components/schemas/DelayRegularMetadata" + }, + { + "$ref": "#/components/schemas/DelayScheduledMetadata" + } + ] + }, + "replyCallback": { + "type": "object" + } + } + }, + "NotificationStep": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "shouldStopOnFail": { + "type": "boolean" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplate" + }, + "filters": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StepFilter" + } + }, + "_parentId": { + "type": "object" + }, + "metadata": { + "oneOf": [ + { + "$ref": "#/components/schemas/DigestRegularMetadata" + }, + { + "$ref": "#/components/schemas/DigestTimedMetadata" + }, + { + "$ref": "#/components/schemas/DelayRegularMetadata" + }, + { + "$ref": "#/components/schemas/DelayScheduledMetadata" + } + ] + }, + "replyCallback": { + "type": "object" + }, + "variants": { + "$ref": "#/components/schemas/NotificationStepVariant" + } + } + }, + "NotificationTriggerVariable": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "NotificationTrigger": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "event" + ] + }, + "identifier": { + "type": "string" + }, + "variables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTriggerVariable" + } + }, + "subscriberVariables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTriggerVariable" + } + } + }, + "required": [ + "type", + "identifier", + "variables" + ] + }, + "WorkflowResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "critical": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "_organizationId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTrigger" + } + }, + "_notificationGroupId": { + "type": "string" + }, + "_parentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "notificationGroup": { + "$ref": "#/components/schemas/NotificationGroup" + }, + "data": { + "type": "object" + }, + "workflowIntegrationStatus": { + "type": "object" + } + }, + "required": [ + "name", + "description", + "active", + "draft", + "preferenceSettings", + "critical", + "tags", + "steps", + "_organizationId", + "_creatorId", + "_environmentId", + "triggers", + "_notificationGroupId", + "deleted", + "deletedAt", + "deletedBy" + ] + }, + "UpdateWorkflowRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "maxLength": 300 + }, + "identifier": { + "type": "string" + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "notificationGroupId": { + "type": "string" + }, + "critical": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "notificationGroupId" + ] + }, + "DataBooleanDto": { + "type": "object", + "properties": { + "data": { + "type": "boolean" + } + }, + "required": [ + "data" + ] + }, + "CreateWorkflowRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "notificationGroupId": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "maxLength": 1000 + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStep" + } + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean", + "deprecated": true + }, + "critical": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "blueprintId": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "name", + "notificationGroupId", + "steps" + ] + }, + "ChangeWorkflowStatusRequestDto": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + } + }, + "required": [ + "active" + ] + }, + "WorkflowsResponseDto": { + "type": "object", + "properties": { + "totalCount": { + "type": "number" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowResponse" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "totalCount", + "data", + "pageSize", + "page" + ] + }, + "VariablesResponseDto": { + "type": "object", + "properties": { + "translations": { + "type": "object" + }, + "system": { + "type": "object" + } + }, + "required": [ + "translations", + "system" + ] + }, + "TriggerEventResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "If trigger was acknowledged or not" + }, + "status": { + "enum": [ + "error", + "trigger_not_active", + "no_workflow_active_steps_defined", + "no_workflow_steps_defined", + "processed", + "subscriber_id_missing", + "no_tenant_found" + ], + "type": "string", + "description": "Status for trigger" + }, + "error": { + "description": "In case of an error, this field will contain the error message", + "type": "array", + "items": { + "type": "string" + } + }, + "transactionId": { + "type": "string", + "description": "Transaction id for trigger" + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "TopicPayloadDto": { + "type": "object", + "properties": { + "topicKey": { + "type": "string" + }, + "type": { + "enum": [ + "Subscriber", + "Topic" + ], + "type": "string", + "example": "Topic" + } + }, + "required": [ + "topicKey", + "type" + ] + }, + "TenantPayloadDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + } + } + }, + "SubscriberPayloadDto": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string", + "description": "An http url to the profile image of your subscriber" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "subscriberId" + ] + }, + "TriggerEventRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The trigger identifier of the workflow you wish to send. This identifier can be found on the workflow page." + }, + "payload": { + "type": "object", + "description": "The payload object is used to pass additional custom information that could be used to render the workflow, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.", + "example": { + "comment_id": "string", + "post": { + "text": "string" + } + } + }, + "overrides": { + "type": "object", + "description": "This could be used to override provider specific configurations", + "example": { + "fcm": { + "data": { + "key": "value" + } + } + } + }, + "to": { + "description": "The recipients list of people who will receive the notification.", + "oneOf": [ + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + }, + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems", + "example": "SUBSCRIBER_ID" + }, + { + "$ref": "#/components/schemas/TopicPayloadDto" + } + ], + "items": { + "type": "array" + } + }, + "transactionId": { + "type": "string", + "description": "A unique identifier for this transaction, we will generated a UUID if not provided." + }, + "actor": { + "description": "It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems" + }, + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + } + ] + }, + "tenant": { + "description": "It is used to specify a tenant context during trigger event.\n If a new tenant object is provided, we will create a new tenant.\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a tenant in your system" + }, + { + "$ref": "#/components/schemas/TenantPayloadDto" + } + ] + } + }, + "required": [ + "name", + "to" + ] + }, + "BulkTriggerEventDto": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TriggerEventRequestDto" + } + } + }, + "required": [ + "events" + ] + }, + "TriggerEventToAllRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The trigger identifier associated for the template you wish to send. This identifier can be found on the template page." + }, + "payload": { + "type": "object", + "description": "The payload object is used to pass additional custom information that could be used to render the template, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.", + "example": { + "comment_id": "string", + "post": { + "text": "string" + } + } + }, + "overrides": { + "type": "object", + "description": "This could be used to override provider specific configurations", + "example": { + "fcm": { + "data": { + "key": "value" + } + } + } + }, + "transactionId": { + "type": "string", + "description": "A unique identifier for this transaction, we will generated a UUID if not provided." + }, + "actor": { + "description": "It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a subscriber in your systems" + }, + { + "$ref": "#/components/schemas/SubscriberPayloadDto" + } + ] + }, + "tenant": { + "description": "It is used to specify a tenant context during trigger event.\n If a new tenant object is provided, we will create a new tenant.\n ", + "oneOf": [ + { + "type": "string", + "description": "Unique identifier of a tenant in your system" + }, + { + "$ref": "#/components/schemas/TenantPayloadDto" + } + ] + } + }, + "required": [ + "name", + "payload" + ] + }, + "PaginatedResponseDto": { + "type": "object", + "properties": { + "page": { + "type": "number", + "description": "The current page of the paginated response" + }, + "hasMore": { + "type": "boolean", + "description": "Does the list have more items to fetch" + }, + "pageSize": { + "type": "number", + "description": "Number of items on each page" + }, + "data": { + "description": "The list of items matching the query", + "type": "array", + "items": { + "type": "object" + } + } + }, + "required": [ + "page", + "hasMore", + "pageSize", + "data" + ] + }, + "ChannelCredentials": { + "type": "object", + "properties": { + "webhookUrl": { + "type": "string", + "description": "Webhook url used by chat app integrations. The webhook should be obtained from the chat app provider." + }, + "channel": { + "type": "string", + "description": "Channel specification for Mattermost chat notifications" + }, + "deviceTokens": { + "description": "Contains an array of the subscriber device tokens for a given provider. Used on Push integrations", + "type": "array", + "items": { + "type": "string" + } + }, + "alertUid": { + "type": "string", + "description": "alert_uid for grafana on-call webhook payload" + }, + "title": { + "type": "string", + "description": "title to be used with grafana on call webhook" + }, + "imageUrl": { + "type": "string", + "description": "image_url property fo grafana on call webhook" + }, + "state": { + "type": "string", + "description": "state property fo grafana on call webhook" + }, + "externalUrl": { + "type": "string", + "description": "link_to_upstream_details property fo grafana on call webhook" + } + }, + "required": [ + "webhookUrl" + ] + }, + "ChannelSettings": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "enum": [ + "slack", + "discord", + "msteams", + "mattermost", + "ryver", + "zulip", + "grafana-on-call", + "getstream", + "rocket-chat", + "fcm", + "apns", + "expo", + "one-signal", + "pushpad", + "push-webhook", + "pusher-beams" + ], + "description": "The provider identifier for the credentials" + }, + "integrationIdentifier": { + "type": "string", + "description": "The integration identifier" + }, + "credentials": { + "description": "Credentials payload for the specified provider", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelCredentials" + } + ] + }, + "_integrationId": { + "type": "string", + "description": "Id of the integration that is used for this channel" + } + }, + "required": [ + "providerId", + "credentials", + "_integrationId" + ] + }, + "SubscriberResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "description": "The internal id novu generated for your subscriber, this is not the subscriberId matching your query. See `subscriberId` for that" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "channels": { + "description": "Channels settings for subscriber", + "type": "array", + "items": { + "$ref": "#/components/schemas/ChannelSettings" + } + }, + "isOnline": { + "type": "boolean" + }, + "lastOnlineAt": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "__v": { + "type": "number" + } + }, + "required": [ + "subscriberId", + "_organizationId", + "_environmentId", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "CreateSubscriberRequestDto": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems" + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string", + "description": "An http url to the profile image of your subscriber" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "subscriberId" + ] + }, + "BulkSubscriberCreateDto": { + "type": "object", + "properties": { + "subscribers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateSubscriberRequestDto" + } + } + }, + "required": [ + "subscribers" + ] + }, + "UpdateSubscriberRequestDto": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "locale": { + "type": "string" + }, + "data": { + "type": "object" + } + } + }, + "UpdateSubscriberChannelRequestDto": { + "type": "object", + "properties": { + "providerId": { + "type": "string", + "enum": [ + "slack", + "discord", + "msteams", + "mattermost", + "ryver", + "zulip", + "grafana-on-call", + "getstream", + "rocket-chat", + "fcm", + "apns", + "expo", + "one-signal", + "pushpad", + "push-webhook", + "pusher-beams" + ], + "description": "The provider identifier for the credentials" + }, + "integrationIdentifier": { + "type": "string", + "description": "The integration identifier" + }, + "credentials": { + "description": "Credentials payload for the specified provider", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelCredentials" + } + ] + } + }, + "required": [ + "providerId", + "credentials" + ] + }, + "UpdateSubscriberOnlineFlagRequestDto": { + "type": "object", + "properties": { + "isOnline": { + "type": "boolean" + } + }, + "required": [ + "isOnline" + ] + }, + "DeleteSubscriberResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "TemplateResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string", + "description": "Unique identifier of the workflow" + }, + "name": { + "type": "string", + "description": "Name of the workflow" + }, + "critical": { + "type": "boolean", + "description": "Critical templates will always be delivered to the end user and should be hidden from the subscriber preferences screen" + }, + "triggers": { + "description": "Triggers are the events that will trigger the workflow.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_id", + "name", + "critical", + "triggers" + ] + }, + "Preference": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Sets if the workflow is fully enabled for all channels or not for the subscriber." + }, + "channels": { + "description": "Subscriber preferences for the different channels regarding this workflow", + "allOf": [ + { + "$ref": "#/components/schemas/PreferenceChannels" + } + ] + } + }, + "required": [ + "enabled", + "channels" + ] + }, + "UpdateSubscriberPreferenceResponseDto": { + "type": "object", + "properties": { + "template": { + "description": "The workflow information and if it is critical or not", + "allOf": [ + { + "$ref": "#/components/schemas/TemplateResponse" + } + ] + }, + "preference": { + "description": "The preferences of the subscriber regarding the related workflow", + "allOf": [ + { + "$ref": "#/components/schemas/Preference" + } + ] + } + }, + "required": [ + "template", + "preference" + ] + }, + "GetSubscriberPreferencesResponseDto": { + "type": "object", + "properties": { + "template": { + "description": "The workflow information and if it is critical or not", + "allOf": [ + { + "$ref": "#/components/schemas/TemplateResponse" + } + ] + }, + "preference": { + "description": "The preferences of the subscriber regarding the related workflow", + "allOf": [ + { + "$ref": "#/components/schemas/Preference" + } + ] + } + }, + "required": [ + "preference" + ] + }, + "ChannelPreference": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "description": "The type of channel that is enabled or not" + }, + "enabled": { + "type": "boolean", + "description": "If channel is enabled or not" + } + }, + "required": [ + "type", + "enabled" + ] + }, + "UpdateSubscriberPreferenceRequestDto": { + "type": "object", + "properties": { + "channel": { + "description": "The subscriber preferences for every ChannelTypeEnum for the workflow assigned.", + "allOf": [ + { + "$ref": "#/components/schemas/ChannelPreference" + } + ] + }, + "enabled": { + "type": "boolean", + "description": "Sets if the workflow is fully enabled for all channels or not for the subscriber." + } + } + }, + "UpdateSubscriberGlobalPreferencesRequestDto": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable or disable the subscriber global preferences." + }, + "preferences": { + "description": "The subscriber global preferences for every ChannelTypeEnum.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ChannelPreference" + } + } + } + }, + "EmailBlockStyles": { + "type": "object", + "properties": { + "textAlign": { + "enum": [ + "left", + "right", + "center" + ], + "type": "string" + } + } + }, + "EmailBlock": { + "type": "object", + "properties": { + "type": { + "enum": [ + "text", + "button" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "url": { + "type": "string" + }, + "styles": { + "$ref": "#/components/schemas/EmailBlockStyles" + } + }, + "required": [ + "type", + "content" + ] + }, + "MessageCTAData": { + "type": "object", + "properties": { + "url": { + "type": "string" + } + } + }, + "MessageButton": { + "type": "object", + "properties": { + "type": { + "enum": [ + "primary", + "secondary", + "clicked" + ], + "type": "string" + }, + "content": { + "type": "string" + }, + "resultContent": { + "type": "string" + } + }, + "required": [ + "type", + "content" + ] + }, + "MessageActionResult": { + "type": "object", + "properties": { + "payload": { + "type": "object" + }, + "type": { + "enum": [ + "primary", + "secondary", + "clicked" + ], + "type": "string" + } + } + }, + "MessageAction": { + "type": "object", + "properties": { + "status": { + "enum": [ + "pending", + "done" + ], + "type": "string" + }, + "buttons": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageButton" + } + }, + "result": { + "$ref": "#/components/schemas/MessageActionResult" + } + } + }, + "MessageCTA": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "redirect" + ] + }, + "data": { + "$ref": "#/components/schemas/MessageCTAData" + }, + "action": { + "$ref": "#/components/schemas/MessageAction" + } + }, + "required": [ + "data" + ] + }, + "MessageResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_templateId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_messageTemplateId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_notificationId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "subscriber": { + "$ref": "#/components/schemas/SubscriberResponseDto" + }, + "template": { + "$ref": "#/components/schemas/WorkflowResponse" + }, + "templateIdentifier": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "content": { + "oneOf": [ + { + "$ref": "#/components/schemas/EmailBlock" + }, + { + "type": "string" + } + ] + }, + "transactionId": { + "type": "string" + }, + "subject": { + "type": "string" + }, + "channel": { + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ], + "type": "string" + }, + "seen": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "directWebhookUrl": { + "type": "string" + }, + "providerId": { + "type": "string" + }, + "deviceTokens": { + "type": "array", + "items": { + "type": "string" + } + }, + "title": { + "type": "string" + }, + "lastSeenDate": { + "type": "string" + }, + "cta": { + "$ref": "#/components/schemas/MessageCTA" + }, + "_feedId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "sent", + "error", + "warning" + ] + }, + "errorId": { + "type": "string" + }, + "errorText": { + "type": "string" + }, + "payload": { + "type": "object", + "description": "The payload that was used to send the notification trigger" + }, + "overrides": { + "type": "object", + "description": "Provider specific overrides used when triggering the notification" + } + }, + "required": [ + "_templateId", + "_environmentId", + "_messageTemplateId", + "_organizationId", + "_notificationId", + "_subscriberId", + "content", + "transactionId", + "channel", + "seen", + "lastSeenDate", + "cta", + "status", + "errorId", + "errorText", + "payload", + "overrides" + ] + }, + "UnseenCountResponse": { + "type": "object", + "properties": { + "count": { + "type": "number" + } + }, + "required": [ + "count" + ] + }, + "MarkMessageFields": { + "type": "object", + "properties": { + "seen": { + "type": "boolean" + }, + "read": { + "type": "boolean" + } + } + }, + "MarkMessageAsRequestDto": { + "type": "object", + "properties": { + "messageId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "mark": { + "$ref": "#/components/schemas/MarkMessageFields" + } + }, + "required": [ + "messageId", + "mark" + ] + }, + "MarkAllMessageAsRequestDto": { + "type": "object", + "properties": { + "feedIdentifier": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Optional feed identifier or array of feed identifiers" + }, + "markAs": { + "enum": [ + "read", + "seen", + "unread", + "unseen" + ], + "type": "string", + "description": "Mark all subscriber messages as read, unread, seen or unseen" + } + }, + "required": [ + "markAs" + ] + }, + "MarkMessageActionAsSeenDto": { + "type": "object", + "properties": { + "status": { + "enum": [ + "pending", + "done" + ], + "type": "string", + "description": "Message action status" + }, + "payload": { + "type": "object", + "description": "Message action payload" + } + }, + "required": [ + "status" + ] + }, + "CreateTopicResponseDto": { + "type": "object", + "properties": {} + }, + "CreateTopicRequestDto": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "User defined custom key and provided by the user that will be an unique identifier for the Topic created." + }, + "name": { + "type": "string", + "description": "User defined custom name and provided by the user that will name the Topic created." + } + }, + "required": [ + "key", + "name" + ] + }, + "AddSubscribersRequestDto": { + "type": "object", + "properties": { + "subscribers": { + "description": "List of subscriber identifiers that will be associated to the topic", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "subscribers" + ] + }, + "TopicSubscriberDto": { + "type": "object", + "properties": { + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_subscriberId": { + "type": "string" + }, + "_topicId": { + "type": "string" + }, + "topicKey": { + "type": "string" + }, + "externalSubscriberId": { + "type": "string" + } + }, + "required": [ + "_organizationId", + "_environmentId", + "_subscriberId", + "_topicId", + "topicKey", + "externalSubscriberId" + ] + }, + "RemoveSubscribersRequestDto": { + "type": "object", + "properties": { + "subscribers": { + "description": "List of subscriber identifiers that will be removed to the topic", + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "subscribers" + ] + }, + "TopicDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "FilterTopicsResponseDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TopicDto" + } + }, + "page": { + "type": "number" + }, + "pageSize": { + "type": "number" + }, + "totalCount": { + "type": "number" + } + }, + "required": [ + "data", + "page", + "pageSize", + "totalCount" + ] + }, + "GetTopicResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "RenameTopicResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subscribers": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "_organizationId", + "_environmentId", + "key", + "name", + "subscribers" + ] + }, + "RenameTopicRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "User defined custom name and provided by the user to rename the topic." + } + }, + "required": [ + "name" + ] + }, + "GetTenantResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + }, + "_environmentId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "identifier", + "_environmentId", + "createdAt", + "updatedAt" + ] + }, + "CreateTenantResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + }, + "_environmentId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "identifier", + "_environmentId", + "createdAt", + "updatedAt" + ] + }, + "CreateTenantRequestDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "identifier", + "name" + ] + }, + "UpdateTenantResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + }, + "_environmentId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "identifier", + "_environmentId", + "createdAt", + "updatedAt" + ] + }, + "UpdateTenantRequestDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string" + }, + "name": { + "type": "string" + }, + "data": { + "type": "object" + } + } + }, + "ActivityNotificationSubscriberResponseDto": { + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "_id": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string" + } + }, + "required": [ + "_id" + ] + }, + "ActivityNotificationTemplateResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationTrigger" + } + } + }, + "required": [ + "name", + "triggers" + ] + }, + "ActivityNotificationExecutionDetailResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_jobId": { + "type": "string" + }, + "status": { + "enum": [ + "Success", + "Warning", + "Failed", + "Pending", + "Queued", + "ReadConfirmation" + ], + "type": "string" + }, + "detail": { + "type": "string" + }, + "isRetry": { + "type": "boolean" + }, + "isTest": { + "type": "boolean" + }, + "providerId": { + "type": "object" + }, + "raw": { + "type": "string" + }, + "source": { + "enum": [ + "Credentials", + "Internal", + "Payload", + "Webhook" + ], + "type": "string" + } + }, + "required": [ + "_id", + "_jobId", + "status", + "detail", + "isRetry", + "isTest", + "providerId", + "source" + ] + }, + "MessageTemplateDto": { + "type": "object", + "properties": {} + }, + "ActivityNotificationStepResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "filters": { + "$ref": "#/components/schemas/StepFilter" + }, + "template": { + "$ref": "#/components/schemas/MessageTemplateDto" + } + }, + "required": [ + "_id", + "active", + "filters" + ] + }, + "ActivityNotificationJobResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "digest": { + "type": "object" + }, + "executionDetails": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationExecutionDetailResponseDto" + } + }, + "step": { + "$ref": "#/components/schemas/ActivityNotificationStepResponseDto" + }, + "payload": { + "type": "object" + }, + "providerId": { + "type": "object" + }, + "status": { + "type": "string" + } + }, + "required": [ + "_id", + "type", + "executionDetails", + "step", + "providerId", + "status" + ] + }, + "ActivityNotificationResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "transactionId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "channels": { + "type": "string", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push", + "digest", + "trigger", + "delay" + ] + }, + "subscriber": { + "$ref": "#/components/schemas/ActivityNotificationSubscriberResponseDto" + }, + "template": { + "$ref": "#/components/schemas/ActivityNotificationTemplateResponseDto" + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationJobResponseDto" + } + } + }, + "required": [ + "_environmentId", + "_organizationId", + "transactionId" + ] + }, + "ActivitiesResponseDto": { + "type": "object", + "properties": { + "hasMore": { + "type": "boolean" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActivityNotificationResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "hasMore", + "data", + "pageSize", + "page" + ] + }, + "ActivityStatsResponseDto": { + "type": "object", + "properties": { + "weeklySent": { + "type": "number" + }, + "monthlySent": { + "type": "number" + } + }, + "required": [ + "weeklySent", + "monthlySent" + ] + }, + "ActivityGraphStatesResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "count": { + "type": "number" + }, + "templates": { + "type": "array", + "items": { + "type": "string" + } + }, + "channels": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "in_app", + "email", + "sms", + "chat", + "push" + ] + } + } + }, + "required": [ + "_id", + "count", + "templates", + "channels" + ] + }, + "FeedResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "identifier": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_organizationId": { + "type": "string" + } + }, + "required": [ + "name", + "identifier", + "_environmentId", + "_organizationId" + ] + }, + "CreateFeedRequestDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ] + }, + "DeleteMessageResponseDto": { + "type": "object", + "properties": { + "acknowledged": { + "type": "boolean", + "description": "A boolean stating the success of the action" + }, + "status": { + "type": "string", + "description": "The status enum for the performed action", + "enum": [ + "deleted" + ] + } + }, + "required": [ + "acknowledged", + "status" + ] + }, + "IGroupedBlueprint": { + "type": "object", + "properties": {} + }, + "GroupedBlueprintResponse": { + "type": "object", + "properties": { + "general": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IGroupedBlueprint" + } + }, + "popular": { + "$ref": "#/components/schemas/IGroupedBlueprint" + } + }, + "required": [ + "general", + "popular" + ] + }, + "NotificationStepDto": { + "type": "object", + "properties": {} + }, + "GetBlueprintResponse": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "draft": { + "type": "boolean" + }, + "preferenceSettings": { + "type": "object" + }, + "critical": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "steps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NotificationStepDto" + } + }, + "_organizationId": { + "type": "string" + }, + "_creatorId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "triggers": { + "type": "array", + "items": { + "type": "object" + } + }, + "_notificationGroupId": { + "type": "string" + }, + "_parentId": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "notificationGroup": { + "type": "object" + }, + "isBlueprint": { + "type": "boolean" + }, + "blueprintId": { + "type": "string" + } + }, + "required": [ + "_id", + "name", + "description", + "active", + "draft", + "preferenceSettings", + "critical", + "tags", + "steps", + "_organizationId", + "_creatorId", + "_environmentId", + "triggers", + "_notificationGroupId", + "deleted", + "deletedAt", + "deletedBy", + "isBlueprint" + ] + }, + "CreateWorkflowOverrideResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_workflowId": { + "type": "string" + }, + "_tenantId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "_organizationId", + "_environmentId", + "_workflowId", + "_tenantId", + "active", + "preferenceSettings", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "CreateWorkflowOverrideRequestDto": { + "type": "object", + "properties": { + "workflowId": { + "type": "string" + }, + "tenantId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + } + }, + "required": [ + "workflowId", + "tenantId" + ] + }, + "UpdateWorkflowOverrideResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_workflowId": { + "type": "string" + }, + "_tenantId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "_organizationId", + "_environmentId", + "_workflowId", + "_tenantId", + "active", + "preferenceSettings", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "UpdateWorkflowOverrideRequestDto": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + } + } + }, + "GetWorkflowOverrideResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_workflowId": { + "type": "string" + }, + "_tenantId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "_organizationId", + "_environmentId", + "_workflowId", + "_tenantId", + "active", + "preferenceSettings", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "OverrideResponseDto": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_organizationId": { + "type": "string" + }, + "_environmentId": { + "type": "string" + }, + "_workflowId": { + "type": "string" + }, + "_tenantId": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "preferenceSettings": { + "$ref": "#/components/schemas/PreferenceChannels" + }, + "deleted": { + "type": "boolean" + }, + "deletedAt": { + "type": "string" + }, + "deletedBy": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "_id", + "_organizationId", + "_environmentId", + "_workflowId", + "_tenantId", + "active", + "preferenceSettings", + "deleted", + "createdAt", + "updatedAt" + ] + }, + "GetWorkflowOverridesResponseDto": { + "type": "object", + "properties": { + "hasMore": { + "type": "boolean" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OverrideResponseDto" + } + }, + "pageSize": { + "type": "number" + }, + "page": { + "type": "number" + } + }, + "required": [ + "hasMore", + "data", + "pageSize", + "page" + ] + } + }, + "headers": { + "Content-Type": { + "required": true, + "description": "The MIME type of the response body.", + "schema": { + "type": "string" + }, + "example": "application/json" + }, + "RateLimit-Limit": { + "required": false, + "description": "The number of requests that the client is permitted to make per second. The actual maximum may differ when burst is enabled.", + "schema": { + "type": "string" + }, + "example": "100" + }, + "RateLimit-Remaining": { + "required": false, + "description": "The number of requests remaining until the next window.", + "schema": { + "type": "string" + }, + "example": "93" + }, + "RateLimit-Reset": { + "required": false, + "description": "The remaining seconds until a request of the same cost will be refreshed.", + "schema": { + "type": "string" + }, + "example": "8" + }, + "RateLimit-Policy": { + "required": false, + "description": "The rate limit policy that was used to evaluate the request.", + "schema": { + "type": "string" + }, + "example": "100;w=1;burst=110;comment=\"token bucket\";category=\"trigger\";cost=\"single\"" + }, + "Retry-After": { + "required": false, + "description": "The number of seconds after which the client may retry the request that was previously rejected.", + "schema": { + "type": "string" + }, + "example": "8" + }, + "Idempotency-Key": { + "required": false, + "description": "The idempotency key used to evaluate the request.", + "schema": { + "type": "string" + }, + "example": "8" + }, + "Idempotency-Replay": { + "required": false, + "description": "Whether the request was a replay of a previous request.", + "schema": { + "type": "string" + }, + "example": "true" + }, + "Link": { + "required": false, + "description": "A link to the documentation.", + "schema": { + "type": "string" + }, + "example": "https://docs.novu.co/" + } + } + }, + "externalDocs": { + "description": "Novu Documentation", + "url": "https://docs.novu.co" + } +} \ No newline at end of file diff --git a/specs/openapi-2.0.6.json b/specs/openapi-2.0.6.json new file mode 100644 index 0000000..459ea72 --- /dev/null +++ b/specs/openapi-2.0.6.json @@ -0,0 +1 @@ +{"openapi":"3.0.0","paths":{"/v1/events/trigger":{"post":{"operationId":"EventsController_trigger","x-speakeasy-group":"","x-speakeasy-usage-example":{"title":"Trigger Notification Event"},"x-speakeasy-name-override":"trigger","summary":"Trigger event","description":"\n Trigger event is the main (and only) way to send notifications to subscribers. \n The trigger identifier is used to match the particular workflow associated with it. \n Additional information can be passed according the body interface below.\n ","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventRequestDto"}}}},"responses":{"201":{"description":"Created","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TriggerEventResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Events"],"security":[{"api-key":[]}]}},"/v1/events/trigger/bulk":{"post":{"operationId":"EventsController_triggerBulk","x-speakeasy-group":"","x-speakeasy-usage-example":{"title":"Trigger Notification Events in Bulk"},"x-speakeasy-name-override":"triggerBulk","summary":"Bulk trigger event","description":"\n Using this endpoint you can trigger multiple events at once, to avoid multiple calls to the API.\n The bulk API is limited to 100 events per request.\n ","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTriggerEventDto"}}}},"responses":{"201":{"description":"Created","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TriggerEventResponseDto"}}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Events"],"security":[{"api-key":[]}]}},"/v1/events/trigger/broadcast":{"post":{"operationId":"EventsController_broadcastEventToAll","x-speakeasy-group":"","x-speakeasy-usage-example":{"title":"Broadcast Event to All"},"x-speakeasy-name-override":"triggerBroadcast","summary":"Broadcast event to all","description":"Trigger a broadcast event to all existing subscribers, could be used to send announcements, etc.\n In the future could be used to trigger events to a subset of subscribers based on defined filters.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventToAllRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TriggerEventResponseDto"}}}}}},"201":{"description":"Broadcast request has been registered successfully ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerEventResponseDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Events"],"security":[{"api-key":[]}]}},"/v1/events/trigger/{transactionId}":{"delete":{"operationId":"EventsController_cancel","x-speakeasy-group":"","x-speakeasy-usage-example":{"title":"Cancel Triggered Event"},"x-speakeasy-name-override":"cancel","summary":"Cancel triggered event","description":"\n Using a previously generated transactionId during the event trigger,\n will cancel any active or pending workflows. This is useful to cancel active digests, delays etc...\n ","parameters":[{"name":"transactionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataBooleanDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Events"],"security":[{"api-key":[]}]}},"/v1/notifications":{"get":{"operationId":"NotificationsController_listNotifications","summary":"Get notifications","parameters":[{"name":"channels","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["in_app","email","sms","chat","push"]}}},{"name":"templates","required":false,"in":"query","schema":{"type":"array","items":{"type":"string"}}},{"name":"emails","required":false,"in":"query","schema":{"type":"array","items":{"type":"string"}}},{"name":"search","required":false,"in":"query","deprecated":true,"schema":{"type":"string"}},{"name":"subscriberIds","required":false,"in":"query","schema":{"type":"array","items":{"type":"string"}}},{"name":"page","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"transactionId","required":false,"in":"query","schema":{"type":"string"}},{"name":"after","required":false,"in":"query","schema":{"type":"string"}},{"name":"before","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivitiesResponseDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Notifications"],"security":[{"api-key":[]}]}},"/v1/notifications/stats":{"get":{"operationId":"NotificationsController_getActivityStats","x-speakeasy-group":"Notifications.Stats","summary":"Get notification statistics","parameters":[],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ActivityStatsResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Notifications"],"security":[{"api-key":[]}]}},"/v1/notifications/graph/stats":{"get":{"operationId":"NotificationsController_getActivityGraphStats","x-speakeasy-name-override":"graph","x-speakeasy-group":"Notifications.Stats","summary":"Get notification graph statistics","parameters":[{"name":"days","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ActivityGraphStatesResponse"}}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Notifications"],"security":[{"api-key":[]}]}},"/v1/notifications/{notificationId}":{"get":{"operationId":"NotificationsController_getNotification","summary":"Get notification","parameters":[{"name":"notificationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/ActivityNotificationResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Notifications"],"security":[{"api-key":[]}]}},"/v1/integrations":{"get":{"operationId":"IntegrationsController_listIntegrations","summary":"Get integrations","description":"Return all the integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change","parameters":[],"responses":{"200":{"description":"The list of integrations belonging to the organization that are successfully returned.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationResponseDto"}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]},"post":{"operationId":"IntegrationsController_createIntegration","summary":"Create integration","description":"Create an integration for the current environment the user is based on the API key provided","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntegrationRequestDto"}}}},"responses":{"201":{"description":"Created","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/IntegrationResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]}},"/v1/integrations/active":{"get":{"operationId":"IntegrationsController_getActiveIntegrations","x-speakeasy-name-override":"listActive","summary":"Get active integrations","description":"Return all the active integrations the user has created for that organization. Review v.0.17.0 changelog for a breaking change","parameters":[],"responses":{"200":{"description":"The list of active integrations belonging to the organization that are successfully returned.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationResponseDto"}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]}},"/v1/integrations/webhook/provider/{providerOrIntegrationId}/status":{"get":{"operationId":"IntegrationsController_getWebhookSupportStatus","x-speakeasy-group":"Integrations.Webhooks","summary":"Get webhook support status for provider","description":"Return the status of the webhook for this provider, if it is supported or if it is not based on a boolean value","parameters":[{"name":"providerOrIntegrationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"The status of the webhook for the provider requested","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"type":"boolean"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]}},"/v1/integrations/{integrationId}":{"put":{"operationId":"IntegrationsController_updateIntegrationById","summary":"Update integration","parameters":[{"name":"integrationId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIntegrationRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/IntegrationResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"The integration with the integrationId provided does not exist in the database.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]},"delete":{"operationId":"IntegrationsController_removeIntegration","summary":"Delete integration","parameters":[{"name":"integrationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/IntegrationResponseDto"}}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]}},"/v1/integrations/{integrationId}/set-primary":{"post":{"operationId":"IntegrationsController_setIntegrationAsPrimary","x-speakeasy-name-override":"setAsPrimary","summary":"Set integration as primary","parameters":[{"name":"integrationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/IntegrationResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"The integration with the integrationId provided does not exist in the database.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Integrations"],"security":[{"api-key":[]}]}},"/v1/subscribers":{"get":{"operationId":"SubscribersController_listSubscribers","x-speakeasy-pagination":{"type":"offsetLimit","inputs":[{"name":"page","in":"parameters","type":"page"},{"name":"limit","in":"parameters","type":"limit"}],"outputs":{"results":"$.data.resultArray"}},"summary":"Get subscribers","description":"Returns a list of subscribers, could paginated using the `page` and `limit` query parameter","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":100,"default":10,"type":"number"}}],"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaginatedResponseDto"},{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}]}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]},"post":{"operationId":"SubscribersController_createSubscriber","summary":"Create subscriber","description":"Creates a subscriber entity, in the Novu platform. The subscriber will be later used to receive notifications, and access notification feeds. Communication credentials such as email, phone number, and 3 rd party credentials i.e slack tokens could be later associated to this entity.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriberRequestDto"}}}},"responses":{"201":{"description":"Created","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}":{"get":{"operationId":"SubscribersController_getSubscriber","summary":"Get subscriber","description":"Get subscriber by your internal id used to identify the subscriber","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"includeTopics","required":false,"in":"query","description":"Includes the topics associated with the subscriber","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]},"put":{"operationId":"SubscribersController_updateSubscriber","summary":"Update subscriber","description":"Used to update the subscriber entity with new information","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]},"delete":{"operationId":"SubscribersController_removeSubscriber","summary":"Delete subscriber","description":"Deletes a subscriber entity from the Novu platform","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteSubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/bulk":{"post":{"operationId":"SubscribersController_bulkCreateSubscribers","x-speakeasy-name-override":"createBulk","summary":"Bulk create subscribers","description":"\n Using this endpoint you can create multiple subscribers at once, to avoid multiple calls to the API.\n The bulk API is limited to 500 subscribers per request.\n ","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSubscriberCreateDto"}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/credentials":{"put":{"operationId":"SubscribersController_updateSubscriberChannel","x-speakeasy-group":"Subscribers.Credentials","summary":"Update subscriber credentials","description":"Subscriber credentials associated to the delivery methods such as slack and push tokens.","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberChannelRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]},"patch":{"operationId":"SubscribersController_modifySubscriberChannel","x-speakeasy-name-override":"append","x-speakeasy-group":"Subscribers.Credentials","summary":"Modify subscriber credentials","description":"Subscriber credentials associated to the delivery methods such as slack and push tokens.\n This endpoint appends provided credentials and deviceTokens to the existing ones.","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberChannelRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/credentials/{providerId}":{"delete":{"operationId":"SubscribersController_deleteSubscriberCredentials","x-speakeasy-group":"Subscribers.Credentials","summary":"Delete subscriber credentials by providerId","description":"Delete subscriber credentials such as slack and expo tokens.","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"providerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":""},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/online-status":{"patch":{"operationId":"SubscribersController_updateSubscriberOnlineFlag","x-speakeasy-name-override":"updateOnlineFlag","x-speakeasy-group":"Subscribers.properties","summary":"Update subscriber online status","description":"Used to update the subscriber isOnline flag.","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberOnlineFlagRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/SubscriberResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/preferences":{"get":{"operationId":"SubscribersController_listSubscriberPreferences","x-speakeasy-group":"Subscribers.Preferences","summary":"Get subscriber preferences","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"includeInactiveChannels","required":false,"in":"query","description":"A flag which specifies if the inactive workflow channels should be included in the retrieved preferences. Default is true","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSubscriberPreferenceResponseDto"}}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]},"patch":{"operationId":"SubscribersController_updateSubscriberGlobalPreferences","x-speakeasy-name-override":"updateGlobal","x-speakeasy-group":"Subscribers.Preferences","summary":"Update subscriber global preferences","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberGlobalPreferencesRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/UpdateSubscriberPreferenceResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/preferences/{parameter}":{"get":{"operationId":"SubscribersController_getSubscriberPreferenceByLevel","x-speakeasy-name-override":"retrieveByLevel","x-speakeasy-group":"Subscribers.Preferences","summary":"Get subscriber preferences by level","parameters":[{"name":"includeInactiveChannels","required":false,"in":"query","description":"A flag which specifies if the inactive workflow channels should be included in the retrieved preferences. Default is true","schema":{"type":"boolean"}},{"name":"parameter","required":true,"in":"path","description":"Fetch global or per workflow channel preferences","schema":{"enum":["global","template"],"type":"string"}},{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/GetSubscriberPreferencesResponseDto"}}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]},"patch":{"operationId":"SubscribersController_updateSubscriberPreference","x-speakeasy-group":"Subscribers.Preferences","summary":"Update subscriber preference","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"parameter","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberPreferenceRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/UpdateSubscriberPreferenceResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/notifications/feed":{"get":{"operationId":"SubscribersController_getNotificationsFeed","x-speakeasy-name-override":"feed","x-speakeasy-group":"Subscribers.Notifications","summary":"Get in-app notification feed for a particular subscriber","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":100,"default":10,"type":"number"}},{"name":"read","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"seen","required":false,"in":"query","schema":{"type":"boolean"}},{"name":"payload","required":false,"in":"query","description":"Base64 encoded string of the partial payload JSON object","example":"btoa(JSON.stringify({ foo: 123 })) results in base64 encoded string like eyJmb28iOjEyM30=","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/FeedResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/notifications/unseen":{"get":{"operationId":"SubscribersController_getUnseenCount","x-speakeasy-name-override":"unseenCount","x-speakeasy-group":"Subscribers.Notifications","summary":"Get the unseen in-app notifications count for subscribers feed","parameters":[{"name":"seen","required":true,"in":"query","schema":{"type":"boolean"}},{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/UnseenCountResponse"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/messages/mark-as":{"post":{"operationId":"SubscribersController_markMessagesAs","x-speakeasy-name-override":"markAllAs","x-speakeasy-group":"Subscribers.Messages","summary":"Mark a subscriber messages as seen, read, unseen or unread","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageMarkAsRequestDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MessageEntity"}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/messages/mark-all":{"post":{"operationId":"SubscribersController_markAllUnreadAsRead","x-speakeasy-name-override":"markAll","x-speakeasy-group":"Subscribers.Messages","summary":"Marks all the subscriber messages as read, unread, seen or unseen. Optionally you can pass feed id (or array) to mark messages of a particular feed.","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkAllMessageAsRequestDto"}}}},"responses":{"201":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"type":"number"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}":{"post":{"operationId":"SubscribersController_markActionAsSeen","x-speakeasy-name-override":"updateAsSeen","x-speakeasy-group":"Subscribers.Messages","summary":"Mark message action as seen","parameters":[{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}},{"name":"type","required":true,"in":"path","schema":{}},{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkMessageActionAsSeenDto"}}}},"responses":{"201":{"description":"Created","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/MessageResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth/callback":{"get":{"operationId":"SubscribersController_chatOauthCallback","x-speakeasy-name-override":"chatAccessOauthCallBack","x-speakeasy-group":"Subscribers.Authentication","summary":"Handle providers oauth redirect","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"providerId","required":true,"in":"path","schema":{}},{"name":"code","required":true,"in":"query","schema":{"type":"string"}},{"name":"hmacHash","required":true,"in":"query","schema":{"type":"string"}},{"name":"environmentId","required":true,"in":"query","schema":{"type":"string"}},{"name":"integrationIdentifier","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/subscribers/{subscriberId}/credentials/{providerId}/oauth":{"get":{"operationId":"SubscribersController_chatAccessOauth","x-speakeasy-name-override":"chatAccessOauth","x-speakeasy-group":"Subscribers.Authentication","summary":"Handle chat oauth","parameters":[{"name":"subscriberId","required":true,"in":"path","schema":{"type":"string"}},{"name":"providerId","required":true,"in":"path","schema":{}},{"name":"hmacHash","required":true,"in":"query","schema":{"type":"string"}},{"name":"environmentId","required":true,"in":"query","schema":{"type":"string"}},{"name":"integrationIdentifier","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Subscribers"],"security":[{"api-key":[]}]}},"/v1/messages":{"get":{"operationId":"MessagesController_getMessages","summary":"Get messages","description":"Returns a list of messages, could paginate using the `page` query parameter","parameters":[{"name":"channel","required":false,"in":"query","schema":{"$ref":"#/components/schemas/ChannelTypeEnum"}},{"name":"subscriberId","required":false,"in":"query","schema":{"type":"string"}},{"name":"transactionId","required":false,"in":"query","schema":{"type":"array","items":{"type":"string"}}},{"name":"page","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":10,"type":"number"}}],"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivitiesResponseDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Messages"],"security":[{"api-key":[]}]}},"/v1/messages/{messageId}":{"delete":{"operationId":"MessagesController_deleteMessage","summary":"Delete message","description":"Deletes a message entity from the Novu platform","parameters":[{"name":"messageId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/DeleteMessageResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Messages"],"security":[{"api-key":[]}]}},"/v1/messages/transaction/{transactionId}":{"delete":{"operationId":"MessagesController_deleteMessagesByTransactionId","x-speakeasy-name-override":"deleteByTransactionId","summary":"Delete messages by transactionId","description":"Deletes messages entity from the Novu platform using TransactionId of message","parameters":[{"name":"channel","required":false,"in":"query","description":"The channel of the message to be deleted","schema":{"enum":["in_app","email","sms","chat","push"],"type":"string"}},{"name":"transactionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":""},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Messages"],"security":[{"api-key":[]}]}},"/v1/topics":{"post":{"operationId":"TopicsController_createTopic","summary":"Topic creation","description":"Create a topic","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRequestDto"}}}},"responses":{"201":{"description":"Created","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CreateTopicResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]},"get":{"operationId":"TopicsController_listTopics","summary":"Filter topics","description":"Returns a list of topics that can be paginated using the `page` query parameter and filtered by the topic key with the `key` query parameter","parameters":[{"name":"page","required":false,"in":"query","description":"Number of page for the pagination","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Size of page for the pagination","schema":{"minimum":0,"default":10,"type":"number"}},{"name":"key","required":false,"in":"query","description":"Topic key","schema":{"type":"string"}}],"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilterTopicsResponseDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]}},"/v1/topics/{topicKey}/subscribers":{"post":{"operationId":"TopicsController_assign","x-speakeasy-name-override":"assign","x-speakeasy-group":"Topics.Subscribers","summary":"Subscribers addition","description":"Add subscribers to a topic by key","parameters":[{"name":"topicKey","required":true,"in":"path","description":"The topic key","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSubscribersRequestDto"}}}},"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignSubscriberToTopicDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]}},"/v1/topics/{topicKey}/subscribers/{externalSubscriberId}":{"get":{"operationId":"TopicsController_getTopicSubscriber","x-speakeasy-group":"Topics.Subscribers","summary":"Check topic subscriber","description":"Check if a subscriber belongs to a certain topic","parameters":[{"name":"externalSubscriberId","required":true,"in":"path","description":"The external subscriber id","schema":{"type":"string"}},{"name":"topicKey","required":true,"in":"path","description":"The topic key","schema":{"type":"string"}}],"responses":{"200":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicSubscriberDto"}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]}},"/v1/topics/{topicKey}/subscribers/removal":{"post":{"operationId":"TopicsController_removeSubscribers","x-speakeasy-name-override":"remove","x-speakeasy-group":"Topics.Subscribers","summary":"Subscribers removal","description":"Remove subscribers from a topic","parameters":[{"name":"topicKey","required":true,"in":"path","description":"The topic key","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveSubscribersRequestDto"}}}},"responses":{"204":{"headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"description":""},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]}},"/v1/topics/{topicKey}":{"delete":{"operationId":"TopicsController_deleteTopic","summary":"Delete topic","description":"Delete a topic by its topic key if it has no subscribers","parameters":[{"name":"topicKey","required":true,"in":"path","description":"The topic key","schema":{"type":"string"}}],"responses":{"204":{"description":"The topic has been deleted correctly","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"The topic you are trying to delete has subscribers assigned to it. Delete the subscribers before deleting the topic.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"type":"string","example":"Request with key 3909d656-d4fe-4e80-ba86-90d3861afcd7 is currently being processed. Please retry after 1 second"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]},"get":{"operationId":"TopicsController_getTopic","summary":"Get topic","description":"Get a topic by its topic key","parameters":[{"name":"topicKey","required":true,"in":"path","description":"The topic key","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/GetTopicResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]},"patch":{"operationId":"TopicsController_renameTopic","x-speakeasy-name-override":"rename","summary":"Rename a topic","description":"Rename a topic by providing a new name","parameters":[{"name":"topicKey","required":true,"in":"path","description":"The topic key","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameTopicRequestDto"}}}},"responses":{"200":{"description":"OK","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/RenameTopicResponseDto"}}}}}},"400":{"description":"Bad Request","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"404":{"description":"Not Found","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"409":{"description":"Conflict","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDto"}}}},"422":{"description":"Unprocessable Entity","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorDto"}}}},"429":{"description":"The client has sent too many requests in a given amount of time. ","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"API rate limit exceeded"}}}},"503":{"description":"The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.","headers":{"Content-Type":{"$ref":"#/components/headers/Content-Type"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Idempotency-Key":{"$ref":"#/components/headers/Idempotency-Key"},"Idempotency-Replay":{"$ref":"#/components/headers/Idempotency-Replay"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"string","example":"Please wait some time, then try again."}}}}},"tags":["Topics"],"security":[{"api-key":[]}]}},"/v1/support/user-organizations":{"post":{"operationId":"SupportController_fetchUserOrganizations","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlainCardRequestDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/support/create-thread":{"post":{"operationId":"SupportController_createThread","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSupportThreadDto"}}}},"responses":{"201":{"description":""}}}}},"info":{"title":"Novu API","description":"Novu REST API. Please see https://docs.novu.co/api-reference for more details.","version":"1.0","contact":{"name":"Novu Support","url":"https://discord.gg/novu","email":"support@novu.co"},"termsOfService":"https://novu.co/terms","license":{"name":"MIT","url":"https://opensource.org/license/mit"}},"tags":[{"name":"Events","description":"Events represent a change in state of a subscriber. They are used to trigger workflows, and enable you to send notifications to subscribers based on their actions.","externalDocs":{"url":"https://docs.novu.co/workflows"}},{"name":"Subscribers","description":"A subscriber in Novu represents someone who should receive a message. A subscriber’s profile information contains important attributes about the subscriber that will be used in messages (name, email). The subscriber object can contain other key-value pairs that can be used to further personalize your messages.","externalDocs":{"url":"https://docs.novu.co/subscribers/subscribers"}},{"name":"Topics","description":"Topics are a way to group subscribers together so that they can be notified of events at once. A topic is identified by a custom key. This can be helpful for things like sending out marketing emails or notifying users of new features. Topics can also be used to send notifications to the subscribers who have been grouped together based on their interests, location, activities and much more.","externalDocs":{"url":"https://docs.novu.co/subscribers/topics"}},{"name":"Notification","description":"A notification conveys information from source to recipient, triggered by a workflow acting as a message blueprint. Notifications can be individual or bundled as digest for user-friendliness.","externalDocs":{"url":"https://docs.novu.co/getting-started/introduction"}},{"name":"Integrations","description":"With the help of the Integration Store, you can easily integrate your favorite delivery provider. During the runtime of the API, the Integrations Store is responsible for storing the configurations of all the providers.","externalDocs":{"url":"https://docs.novu.co/channels-and-providers/integration-store"}},{"name":"Layouts","description":"Novu allows the creation of layouts - a specific HTML design or structure to wrap content of email notifications. Layouts can be manipulated and assigned to new or existing workflows within the Novu platform, allowing users to create, manage, and assign these layouts to workflows, so they can be reused to structure the appearance of notifications sent through the platform.","externalDocs":{"url":"https://docs.novu.co/content-creation-design/layouts"}},{"name":"Workflows","description":"All notifications are sent via a workflow. Each workflow acts as a container for the logic and blueprint that are associated with a type of notification in your system.","externalDocs":{"url":"https://docs.novu.co/workflows"}},{"name":"Notification Templates","description":"Deprecated. Use Workflows (/workflows) instead, which provide the same functionality under a new name."},{"name":"Workflow groups","description":"Workflow groups are used to organize workflows into logical groups."},{"name":"Changes","description":"Changes represent a change in state of an environment. They are analagous to a pending pull request in git, enabling you to test changes before they are applied to your environment and atomically apply them when you are ready.","externalDocs":{"url":"https://docs.novu.co/platform/environments#promoting-pending-changes-to-production"}},{"name":"Environments","description":"Novu uses the concept of environments to ensure logical separation of your data and configuration. This means that subscribers, and preferences created in one environment are never accessible to another.","externalDocs":{"url":"https://docs.novu.co/platform/environments"}},{"name":"Inbound Parse","description":"Inbound Webhook is a feature that allows processing of incoming emails for a domain or subdomain. The feature parses the contents of the email and POSTs the information to a specified URL in a multipart/form-data format.","externalDocs":{"url":"https://docs.novu.co/platform/inbound-parse-webhook"}},{"name":"Feeds","description":"Novu provides a notification activity feed that monitors every outgoing message associated with its relevant metadata. This can be used to monitor activity and discover potential issues with a specific provider or a channel type.","externalDocs":{"url":"https://docs.novu.co/activity-feed"}},{"name":"Tenants","description":"A tenant represents a group of users. As a developer, when your apps have organizations, they are referred to as tenants. Tenants in Novu provides the ability to tailor specific notification experiences to users of different groups or organizations.","externalDocs":{"url":"https://docs.novu.co/tenants"}},{"name":"Messages","description":"A message in Novu represents a notification delivered to a recipient on a particular channel. Messages contain information about the request that triggered its delivery, a view of the data sent to the recipient, and a timeline of its lifecycle events. Learn more about messages.","externalDocs":{"url":"https://docs.novu.co/workflows/messages"}},{"name":"Organizations","description":"An organization serves as a separate entity within your Novu account. Each organization you create has its own separate integration store, workflows, subscribers, and API keys. This separation of resources allows you to manage multi-tenant environments and separate domains within a single account.","externalDocs":{"url":"https://docs.novu.co/platform/organizations"}},{"name":"Execution Details","description":"Execution details are used to track the execution of a workflow. They provided detailed information on the execution of a workflow, including the status of each step, the input and output of each step, and the overall status of the execution.","externalDocs":{"url":"https://docs.novu.co/activity-feed"}},{"name":"Translations","description":"Translations are used to localize your messages for different languages and regions. Novu provides a way to create and manage translations for your messages. You can create translations for your messages in different languages and regions, and assign them to your subscribers based on their preferences.","externalDocs":{"url":"https://docs.novu.co/content-creation-design/translations"}}],"servers":[{"url":"https://api.novu.co"},{"url":"https://eu.api.novu.co"}],"components":{"securitySchemes":{"api-key":{"type":"apiKey","in":"header","name":"Authorization","description":"API key authentication. Allowed headers-- \"Authorization: ApiKey \"."}},"schemas":{"DataWrapperDto":{"type":"object","properties":{"data":{"type":"object"}},"required":["data"]},"ErrorDto":{"type":"object","properties":{"statusCode":{"type":"number","description":"HTTP status code of the error response.","example":404},"timestamp":{"type":"string","description":"Timestamp of when the error occurred.","example":"2024-12-12T13:00:00Z"},"path":{"type":"string","description":"The path where the error occurred.","example":"/api/v1/resource"},"message":{"type":"string","description":"A detailed error message.","example":"Resource not found."},"ctx":{"type":"object","description":"Optional context object for additional error details.","additionalProperties":true,"example":{"workflowId":"some_wf_id","stepId":"some_wf_id"}},"errorId":{"type":"string","description":"Optional unique identifier for the error, useful for tracking using Sentry and \n New Relic, only available for 500.","example":"abc123"}},"required":["statusCode","timestamp","path","message"]},"ValidationErrorDto":{"type":"object","properties":{"statusCode":{"type":"number","description":"HTTP status code of the error response.","example":404},"timestamp":{"type":"string","description":"Timestamp of when the error occurred.","example":"2024-12-12T13:00:00Z"},"path":{"type":"string","description":"The path where the error occurred.","example":"/api/v1/resource"},"message":{"type":"string","description":"A detailed error message.","example":"Resource not found."},"ctx":{"type":"object","description":"Optional context object for additional error details.","additionalProperties":true,"example":{"workflowId":"some_wf_id","stepId":"some_wf_id"}},"errorId":{"type":"string","description":"Optional unique identifier for the error, useful for tracking using Sentry and \n New Relic, only available for 500.","example":"abc123"},"errors":{"type":"object","description":"A record of validation errors keyed by field name","additionalProperties":{"type":"object","properties":{"messages":{"type":"array","items":{"type":"string"}},"value":{"oneOf":[{"type":"string","nullable":true},{"type":"number"},{"type":"boolean"},{"type":"object","additionalProperties":true},{"type":"array","items":{"type":"object","additionalProperties":true}}]}},"required":["messages","value"],"example":{"messages":["Field is required","Invalid format"],"value":"xx xx xx "}},"example":{"fieldName1":{"messages":["Field is required","Must be a valid email address"],"value":"invalidEmail"},"fieldName2":{"messages":["Must be at least 18 years old"],"value":17},"fieldName3":{"messages":["Must be a boolean value"],"value":true},"fieldName4":{"messages":["Must be a valid object"],"value":{"key":"value"}}}}},"required":["statusCode","timestamp","path","message","errors"]},"TriggerEventResponseDto":{"type":"object","properties":{"acknowledged":{"type":"boolean","description":"Indicates whether the trigger was acknowledged or not"},"status":{"enum":["error","trigger_not_active","no_workflow_active_steps_defined","no_workflow_steps_defined","processed","no_tenant_found"],"type":"string","description":"Status of the trigger"},"error":{"description":"In case of an error, this field will contain the error message(s)","type":"array","items":{"type":"string"}},"transactionId":{"type":"string","description":"The returned transaction ID of the trigger"}},"required":["acknowledged","status"]},"ChannelCredentialsDto":{"type":"object","properties":{"webhookUrl":{"type":"string","description":"The URL for the webhook associated with the channel."},"deviceTokens":{"description":"An array of device tokens for push notifications.","type":"array","items":{"type":"string"}}}},"SubscriberChannelDto":{"type":"object","properties":{"providerId":{"type":"string","description":"The ID of the chat or push provider.","enum":["slack","discord","msteams","mattermost","ryver","zulip","grafana-on-call","getstream","rocket-chat","whatsapp-business","fcm","apns","expo","one-signal","pushpad","push-webhook","pusher-beams"]},"integrationIdentifier":{"type":"string","description":"An optional identifier for the integration."},"credentials":{"description":"Credentials for the channel.","allOf":[{"$ref":"#/components/schemas/ChannelCredentialsDto"}]}},"required":["providerId","credentials"]},"SubscriberPayloadDto":{"type":"object","properties":{"subscriberId":{"type":"string","description":"The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems"},"email":{"type":"string","description":"The email address of the subscriber."},"firstName":{"type":"string","description":"The first name of the subscriber."},"lastName":{"type":"string","description":"The last name of the subscriber."},"phone":{"type":"string","description":"The phone number of the subscriber."},"avatar":{"type":"string","description":"An HTTP URL to the profile image of your subscriber."},"locale":{"type":"string","description":"The locale of the subscriber."},"data":{"type":"object","description":"An optional payload object that can contain any properties.","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"boolean"},{"type":"number"}]}},"channels":{"description":"An optional array of subscriber channels.","type":"array","items":{"$ref":"#/components/schemas/SubscriberChannelDto"}}},"required":["subscriberId"]},"TenantPayloadDto":{"type":"object","properties":{"identifier":{"type":"string"},"name":{"type":"string"},"data":{"type":"object"}}},"TriggerRecipientsTypeEnum":{"type":"string","enum":["Subscriber","Topic"]},"TopicPayloadDto":{"type":"object","properties":{"topicKey":{"type":"string"},"type":{"$ref":"#/components/schemas/TriggerRecipientsTypeEnum"}},"required":["topicKey","type"]},"WorkflowToStepControlValuesDto":{"type":"object","properties":{"steps":{"type":"object","description":"A mapping of step IDs to their corresponding data.","additionalProperties":{"type":"object","additionalProperties":true}}}},"TriggerEventRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"The trigger identifier of the workflow you wish to send. This identifier can be found on the workflow page.","example":"workflow_identifier"},"payload":{"type":"object","description":"The payload object is used to pass additional custom information that could be \n used to render the workflow, or perform routing rules based on it. \n This data will also be available when fetching the notifications feed from the API to display certain parts of the UI.","additionalProperties":true,"example":{"comment_id":"string","post":{"text":"string"}}},"bridgeUrl":{"type":"string","description":"A URL to bridge for additional processing.","example":"https://example.com/bridge"},"overrides":{"type":"object","description":"This could be used to override provider specific configurations","example":{"fcm":{"data":{"key":"value"}}},"additionalProperties":{"type":"object","additionalProperties":true}},"to":{"description":"The recipients list of people who will receive the notification.","oneOf":[{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/SubscriberPayloadDto"},{"$ref":"#/components/schemas/TopicPayloadDto"},{"type":"string","description":"Unique identifier of a subscriber in your systems","example":"SUBSCRIBER_ID"}]}},{"type":"string","description":"Unique identifier of a subscriber in your systems","example":"SUBSCRIBER_ID"},{"$ref":"#/components/schemas/SubscriberPayloadDto"},{"$ref":"#/components/schemas/TopicPayloadDto"}]},"transactionId":{"type":"string","description":"A unique identifier for this transaction, we will generate a UUID if not provided."},"actor":{"description":"It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system","oneOf":[{"type":"string","description":"Unique identifier of a subscriber in your systems"},{"$ref":"#/components/schemas/SubscriberPayloadDto"}]},"tenant":{"description":"It is used to specify a tenant context during trigger event.\n Existing tenants will be updated with the provided details.","oneOf":[{"type":"string","description":"Unique identifier of a tenant in your system"},{"$ref":"#/components/schemas/TenantPayloadDto"}]},"controls":{"description":"Additional control configurations.","allOf":[{"$ref":"#/components/schemas/WorkflowToStepControlValuesDto"}]}},"required":["name","to"]},"BulkTriggerEventDto":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/TriggerEventRequestDto"}}},"required":["events"]},"TriggerEventToAllRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"The trigger identifier associated for the template you wish to send. This identifier can be found on the template page."},"payload":{"type":"object","example":{"comment_id":"string","post":{"text":"string"}},"description":"The payload object is used to pass additional information that \n could be used to render the template, or perform routing rules based on it. \n For In-App channel, payload data are also available in ","additionalProperties":true},"overrides":{"type":"object","description":"This could be used to override provider specific configurations","example":{"fcm":{"data":{"key":"value"}}}},"transactionId":{"type":"string","description":"A unique identifier for this transaction, we will generated a UUID if not provided."},"actor":{"description":"It is used to display the Avatar of the provided actor's subscriber id or actor object.\n If a new actor object is provided, we will create a new subscriber in our system\n ","oneOf":[{"type":"string","description":"Unique identifier of a subscriber in your systems"},{"$ref":"#/components/schemas/SubscriberPayloadDto"}]},"tenant":{"description":"It is used to specify a tenant context during trigger event.\n If a new tenant object is provided, we will create a new tenant.\n ","oneOf":[{"type":"string","description":"Unique identifier of a tenant in your system"},{"$ref":"#/components/schemas/TenantPayloadDto"}]}},"required":["name","payload"]},"DataBooleanDto":{"type":"object","properties":{"data":{"type":"boolean"}},"required":["data"]},"ActivityNotificationSubscriberResponseDto":{"type":"object","properties":{"firstName":{"type":"string"},"_id":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"}},"required":["_id"]},"ActivityNotificationTemplateResponseDto":{"type":"object","properties":{"_id":{"type":"string"},"name":{"type":"string"},"triggers":{"type":"array","items":{"type":"string"}}},"required":["name","triggers"]},"ActivityNotificationResponseDto":{"type":"object","properties":{"_id":{"type":"string"},"_environmentId":{"type":"string"},"_organizationId":{"type":"string"},"transactionId":{"type":"string"},"createdAt":{"type":"string"},"channels":{"type":"string","items":{"type":"string","enum":["in_app","email","sms","chat","push","digest","trigger","delay","custom"]},"enum":["in_app","email","sms","chat","push","digest","trigger","delay","custom"]},"subscriber":{"$ref":"#/components/schemas/ActivityNotificationSubscriberResponseDto"},"template":{"$ref":"#/components/schemas/ActivityNotificationTemplateResponseDto"},"jobs":{"type":"array","items":{"type":"string"}}},"required":["_environmentId","_organizationId","transactionId"]},"ActivitiesResponseDto":{"type":"object","properties":{"hasMore":{"type":"boolean"},"data":{"description":"Array of Activity notifications","type":"array","items":{"$ref":"#/components/schemas/ActivityNotificationResponseDto"}},"pageSize":{"type":"number"},"page":{"type":"number"}},"required":["hasMore","data","pageSize","page"]},"ActivityStatsResponseDto":{"type":"object","properties":{"weeklySent":{"type":"number"},"monthlySent":{"type":"number"}},"required":["weeklySent","monthlySent"]},"ActivityGraphStatesResponse":{"type":"object","properties":{"_id":{"type":"string"},"count":{"type":"number"},"templates":{"type":"array","items":{"type":"string"}},"channels":{"type":"array","items":{"type":"string","enum":["in_app","email","sms","chat","push"]}}},"required":["_id","count","templates","channels"]},"CredentialsDto":{"type":"object","properties":{"apiKey":{"type":"string"},"user":{"type":"string"},"secretKey":{"type":"string"},"domain":{"type":"string"},"password":{"type":"string"},"host":{"type":"string"},"port":{"type":"string"},"secure":{"type":"boolean"},"region":{"type":"string"},"accountSid":{"type":"string"},"messageProfileId":{"type":"string"},"token":{"type":"string"},"from":{"type":"string"},"senderName":{"type":"string"},"projectName":{"type":"string"},"applicationId":{"type":"string"},"clientId":{"type":"string"},"requireTls":{"type":"boolean"},"ignoreTls":{"type":"boolean"},"tlsOptions":{"type":"object"},"baseUrl":{"type":"string"},"webhookUrl":{"type":"string"},"redirectUrl":{"type":"string"},"hmac":{"type":"boolean"},"serviceAccount":{"type":"string"},"ipPoolName":{"type":"string"},"apiKeyRequestHeader":{"type":"string"},"secretKeyRequestHeader":{"type":"string"},"idPath":{"type":"string"},"datePath":{"type":"string"},"apiToken":{"type":"string"},"authenticateByToken":{"type":"boolean"},"authenticationTokenKey":{"type":"string"},"instanceId":{"type":"string"},"alertUid":{"type":"string"},"title":{"type":"string"},"imageUrl":{"type":"string"},"state":{"type":"string"},"externalLink":{"type":"string"},"channelId":{"type":"string"},"phoneNumberIdentification":{"type":"string"},"accessKey":{"type":"string"}}},"BuilderFieldType":{"type":"string","enum":["BOOLEAN","TEXT","DATE","NUMBER","STATEMENT","LIST","MULTI_LIST","GROUP"]},"FieldFilterPart":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"operator":{"type":"string","enum":["LARGER","SMALLER","LARGER_EQUAL","SMALLER_EQUAL","EQUAL","NOT_EQUAL","ALL_IN","ANY_IN","NOT_IN","BETWEEN","NOT_BETWEEN","LIKE","NOT_LIKE","IN"]},"on":{"type":"string","enum":["subscriber","payload"]}},"required":["field","value","operator","on"]},"StepFilter":{"type":"object","properties":{"isNegated":{"type":"boolean"},"type":{"$ref":"#/components/schemas/BuilderFieldType"},"value":{"type":"string","enum":["AND","OR"]},"children":{"type":"array","items":{"$ref":"#/components/schemas/FieldFilterPart"}}},"required":["isNegated","type","value","children"]},"IntegrationResponseDto":{"type":"object","properties":{"_id":{"type":"string","description":"The unique identifier of the integration record in the database. This is automatically generated."},"_environmentId":{"type":"string","description":"The unique identifier for the environment associated with this integration. This links to the Environment collection."},"_organizationId":{"type":"string","description":"The unique identifier for the organization that owns this integration. This links to the Organization collection."},"name":{"type":"string","description":"The name of the integration, which is used to identify it in the user interface."},"identifier":{"type":"string","description":"A unique string identifier for the integration, often used for API calls or internal references."},"providerId":{"type":"string","description":"The identifier for the provider of the integration (e.g., \"mailgun\", \"twilio\")."},"channel":{"enum":["in_app","email","sms","chat","push"],"type":"string","description":"The channel type for the integration, which defines how the integration communicates (e.g., email, SMS)."},"credentials":{"description":"The credentials required for the integration to function, including API keys and other sensitive information.","allOf":[{"$ref":"#/components/schemas/CredentialsDto"}]},"active":{"type":"boolean","description":"Indicates whether the integration is currently active. An active integration will process events and messages."},"deleted":{"type":"boolean","description":"Indicates whether the integration has been marked as deleted (soft delete)."},"deletedAt":{"type":"string","description":"The timestamp indicating when the integration was deleted. This is set when the integration is soft deleted."},"deletedBy":{"type":"string","description":"The identifier of the user who performed the deletion of this integration. Useful for audit trails."},"primary":{"type":"boolean","description":"Indicates whether this integration is marked as primary. A primary integration is often the default choice for processing."},"conditions":{"description":"An array of conditions associated with the integration that may influence its behavior or processing logic.","type":"array","items":{"$ref":"#/components/schemas/StepFilter"}}},"required":["_environmentId","_organizationId","name","identifier","providerId","channel","credentials","active","deleted","primary"]},"CreateIntegrationRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"The name of the integration"},"identifier":{"type":"string","description":"The unique identifier for the integration"},"_environmentId":{"type":"string","description":"The ID of the associated environment","format":"uuid"},"providerId":{"type":"string","description":"The provider ID for the integration"},"channel":{"enum":["in_app","email","sms","chat","push"],"type":"string","description":"The channel type for the integration"},"credentials":{"description":"The credentials for the integration","allOf":[{"$ref":"#/components/schemas/CredentialsDto"}]},"active":{"type":"boolean","description":"If the integration is active, the validation on the credentials field will run"},"check":{"type":"boolean","description":"Flag to check the integration status"},"conditions":{"description":"Conditions for the integration","type":"array","items":{"$ref":"#/components/schemas/StepFilter"}}},"required":["providerId","channel"]},"UpdateIntegrationRequestDto":{"type":"object","properties":{"name":{"type":"string"},"identifier":{"type":"string"},"_environmentId":{"type":"string"},"active":{"type":"boolean","description":"If the integration is active the validation on the credentials field will run"},"credentials":{"$ref":"#/components/schemas/CredentialsDto"},"removeNovuBranding":{"type":"boolean","description":"If true, the Novu branding will be removed from the Inbox component"},"check":{"type":"boolean"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/StepFilter"}}}},"PaginatedResponseDto":{"type":"object","properties":{"page":{"type":"number","description":"The current page of the paginated response"},"hasMore":{"type":"boolean","description":"Does the list have more items to fetch"},"pageSize":{"type":"number","description":"Number of items on each page"},"data":{"description":"The list of items matching the query","type":"array","items":{"type":"object"}}},"required":["page","hasMore","pageSize","data"]},"ChannelCredentials":{"type":"object","properties":{"webhookUrl":{"type":"string","description":"Webhook url used by chat app integrations. The webhook should be obtained from the chat app provider."},"channel":{"type":"string","description":"Channel specification for Mattermost chat notifications"},"deviceTokens":{"description":"Contains an array of the subscriber device tokens for a given provider. Used on Push integrations","type":"array","items":{"type":"string"}},"alertUid":{"type":"string","description":"alert_uid for grafana on-call webhook payload"},"title":{"type":"string","description":"title to be used with grafana on call webhook"},"imageUrl":{"type":"string","description":"image_url property fo grafana on call webhook"},"state":{"type":"string","description":"state property fo grafana on call webhook"},"externalUrl":{"type":"string","description":"link_to_upstream_details property fo grafana on call webhook"}},"required":["webhookUrl"]},"ChannelSettings":{"type":"object","properties":{"providerId":{"type":"string","enum":["slack","discord","msteams","mattermost","ryver","zulip","grafana-on-call","getstream","rocket-chat","whatsapp-business","fcm","apns","expo","one-signal","pushpad","push-webhook","pusher-beams"],"description":"The provider identifier for the credentials"},"integrationIdentifier":{"type":"string","description":"The integration identifier"},"credentials":{"description":"Credentials payload for the specified provider","allOf":[{"$ref":"#/components/schemas/ChannelCredentials"}]},"_integrationId":{"type":"string","description":"The unique identifier of the integration associated with this channel."}},"required":["providerId","credentials","_integrationId"]},"SubscriberResponseDto":{"type":"object","properties":{"_id":{"type":"string","description":"The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier."},"firstName":{"type":"string","description":"The first name of the subscriber."},"lastName":{"type":"string","description":"The last name of the subscriber."},"email":{"type":"string","description":"The email address of the subscriber."},"phone":{"type":"string","description":"The phone number of the subscriber."},"avatar":{"type":"string","description":"The URL of the subscriber's avatar image."},"locale":{"type":"string","description":"The locale setting of the subscriber, indicating their preferred language or region."},"subscriberId":{"type":"string","description":"The identifier used to create this subscriber, which typically corresponds to the user ID in your system."},"channels":{"description":"An array of channel settings associated with the subscriber.","type":"array","items":{"$ref":"#/components/schemas/ChannelSettings"}},"topics":{"description":"An array of topics that the subscriber is subscribed to.","type":"array","items":{"type":"string"}},"isOnline":{"type":"boolean","description":"Indicates whether the subscriber is currently online."},"lastOnlineAt":{"type":"string","description":"The timestamp indicating when the subscriber was last online, in ISO 8601 format."},"_organizationId":{"type":"string","description":"The unique identifier of the organization to which the subscriber belongs."},"_environmentId":{"type":"string","description":"The unique identifier of the environment associated with this subscriber."},"deleted":{"type":"boolean","description":"Indicates whether the subscriber has been deleted."},"createdAt":{"type":"string","description":"The timestamp indicating when the subscriber was created, in ISO 8601 format."},"updatedAt":{"type":"string","description":"The timestamp indicating when the subscriber was last updated, in ISO 8601 format."},"__v":{"type":"number","description":"The version of the subscriber document."}},"required":["subscriberId","_organizationId","_environmentId","deleted","createdAt","updatedAt"]},"CreateSubscriberRequestDto":{"type":"object","properties":{"subscriberId":{"type":"string","description":"The internal identifier you used to create this subscriber, usually correlates to the id the user in your systems"},"email":{"type":"string","description":"The email address of the subscriber."},"firstName":{"type":"string","description":"The first name of the subscriber."},"lastName":{"type":"string","description":"The last name of the subscriber."},"phone":{"type":"string","description":"The phone number of the subscriber."},"avatar":{"type":"string","description":"An HTTP URL to the profile image of your subscriber."},"locale":{"type":"string","description":"The locale of the subscriber."},"data":{"type":"object","description":"An optional payload object that can contain any properties.","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"boolean"},{"type":"number"}]}},"channels":{"description":"An optional array of subscriber channels.","type":"array","items":{"$ref":"#/components/schemas/SubscriberChannelDto"}}},"required":["subscriberId"]},"BulkSubscriberCreateDto":{"type":"object","properties":{"subscribers":{"description":"An array of subscribers to be created in bulk.","type":"array","items":{"type":"string"}}},"required":["subscribers"]},"UpdateSubscriberRequestDto":{"type":"object","properties":{"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"avatar":{"type":"string"},"locale":{"type":"string"},"data":{"type":"object"},"channels":{"type":"array","items":{"type":"string"}}}},"UpdateSubscriberChannelRequestDto":{"type":"object","properties":{"providerId":{"type":"string","enum":["slack","discord","msteams","mattermost","ryver","zulip","grafana-on-call","getstream","rocket-chat","whatsapp-business","fcm","apns","expo","one-signal","pushpad","push-webhook","pusher-beams"],"description":"The provider identifier for the credentials"},"integrationIdentifier":{"type":"string","description":"The integration identifier"},"credentials":{"description":"Credentials payload for the specified provider","allOf":[{"$ref":"#/components/schemas/ChannelCredentials"}]}},"required":["providerId","credentials"]},"UpdateSubscriberOnlineFlagRequestDto":{"type":"object","properties":{"isOnline":{"type":"boolean"}},"required":["isOnline"]},"DeleteSubscriberResponseDto":{"type":"object","properties":{"acknowledged":{"type":"boolean","description":"A boolean stating the success of the action"},"status":{"type":"string","description":"The status enum for the performed action","enum":["deleted"]}},"required":["acknowledged","status"]},"TemplateResponse":{"type":"object","properties":{"_id":{"type":"string","description":"Unique identifier of the workflow"},"name":{"type":"string","description":"Name of the workflow"},"critical":{"type":"boolean","description":"Critical templates will always be delivered to the end user and should be hidden from the subscriber preferences screen"},"triggers":{"description":"Triggers are the events that will trigger the workflow.","type":"array","items":{"type":"string"}}},"required":["_id","name","critical","triggers"]},"PreferenceChannels":{"type":"object","properties":{"email":{"type":"boolean"},"sms":{"type":"boolean"},"in_app":{"type":"boolean"},"chat":{"type":"boolean"},"push":{"type":"boolean"}}},"Preference":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Sets if the workflow is fully enabled for all channels or not for the subscriber."},"channels":{"description":"Subscriber preferences for the different channels regarding this workflow","allOf":[{"$ref":"#/components/schemas/PreferenceChannels"}]}},"required":["enabled","channels"]},"UpdateSubscriberPreferenceResponseDto":{"type":"object","properties":{"template":{"description":"The workflow information and if it is critical or not","allOf":[{"$ref":"#/components/schemas/TemplateResponse"}]},"preference":{"description":"The preferences of the subscriber regarding the related workflow","allOf":[{"$ref":"#/components/schemas/Preference"}]}},"required":["template","preference"]},"GetSubscriberPreferencesResponseDto":{"type":"object","properties":{"template":{"description":"The workflow information and if it is critical or not","allOf":[{"$ref":"#/components/schemas/TemplateResponse"}]},"preference":{"description":"The preferences of the subscriber regarding the related workflow","allOf":[{"$ref":"#/components/schemas/Preference"}]}},"required":["preference"]},"ChannelPreference":{"type":"object","properties":{"type":{"type":"string","enum":["in_app","email","sms","chat","push"],"description":"The type of channel that is enabled or not"},"enabled":{"type":"boolean","description":"If channel is enabled or not"}},"required":["type","enabled"]},"UpdateSubscriberPreferenceRequestDto":{"type":"object","properties":{"channel":{"description":"The subscriber preferences for every ChannelTypeEnum for the workflow assigned.","allOf":[{"$ref":"#/components/schemas/ChannelPreference"}]},"enabled":{"type":"boolean","description":"Sets if the workflow is fully enabled for all channels or not for the subscriber."}}},"UpdateSubscriberGlobalPreferencesRequestDto":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Enable or disable the subscriber global preferences."},"preferences":{"description":"The subscriber global preferences for every ChannelTypeEnum.","type":"array","items":{"$ref":"#/components/schemas/ChannelPreference"}}}},"EmailBlockStyles":{"type":"object","properties":{"textAlign":{"type":"string","enum":["center","left","right"]}},"required":["textAlign"]},"EmailBlock":{"type":"object","properties":{"type":{"enum":["button","text"],"type":"string"},"content":{"type":"string"},"url":{"type":"string"},"styles":{"$ref":"#/components/schemas/EmailBlockStyles"}},"required":["type","content"]},"MessageCTAData":{"type":"object","properties":{"url":{"type":"string"}}},"MessageButton":{"type":"object","properties":{"type":{"type":"string","enum":["primary","secondary"]},"content":{"type":"string"},"resultContent":{"type":"string"}},"required":["type","content"]},"MessageActionResult":{"type":"object","properties":{"payload":{"type":"object"},"type":{"type":"string","enum":["primary","secondary"]}}},"MessageAction":{"type":"object","properties":{"status":{"type":"string","enum":["pending","done"]},"buttons":{"type":"array","items":{"$ref":"#/components/schemas/MessageButton"}},"result":{"$ref":"#/components/schemas/MessageActionResult"}}},"MessageCTA":{"type":"object","properties":{"type":{"type":"string","enum":["redirect"]},"data":{"$ref":"#/components/schemas/MessageCTAData"},"action":{"$ref":"#/components/schemas/MessageAction"}},"required":["data"]},"ActorTypeEnum":{"type":"string","description":"The type of the actor, indicating the role in the notification process.","enum":["none","user","system_icon","system_custom"]},"ActorFeedItemDto":{"type":"object","properties":{"data":{"type":"string","description":"The data associated with the actor, can be null if not applicable.","nullable":true,"example":null},"type":{"$ref":"#/components/schemas/ActorTypeEnum"}},"required":["data","type"]},"SubscriberFeedResponseDto":{"type":"object","properties":{"_id":{"type":"string","description":"The internal ID generated by Novu for your subscriber. This ID does not match the `subscriberId` used in your queries. Refer to `subscriberId` for that identifier."},"firstName":{"type":"string","description":"The first name of the subscriber."},"lastName":{"type":"string","description":"The last name of the subscriber."},"avatar":{"type":"string","description":"The URL of the subscriber's avatar image."},"subscriberId":{"type":"string","description":"The identifier used to create this subscriber, which typically corresponds to the user ID in your system."}},"required":["subscriberId"]},"ChannelTypeEnum":{"type":"string","description":"The channel through which the notification is sent.","enum":["in_app","email","sms","chat","push"]},"NotificationFeedItemDto":{"type":"object","properties":{"_id":{"type":"string","description":"Unique identifier for the notification.","example":"615c1f2f9b0c5b001f8e4e3b"},"_templateId":{"type":"string","description":"Identifier for the template used to generate the notification.","example":"template_12345"},"_environmentId":{"type":"string","description":"Identifier for the environment where the notification is sent.","example":"env_67890"},"_messageTemplateId":{"type":"string","description":"Identifier for the message template used.","example":"message_template_54321"},"_organizationId":{"type":"string","description":"Identifier for the organization sending the notification.","example":"org_98765"},"_notificationId":{"type":"string","description":"Unique identifier for the notification instance.","example":"notification_123456"},"_subscriberId":{"type":"string","description":"Unique identifier for the subscriber receiving the notification.","example":"subscriber_112233"},"_feedId":{"type":"string","description":"Identifier for the feed associated with the notification.","example":"feed_445566"},"_jobId":{"type":"string","description":"Identifier for the job that triggered the notification.","example":"job_778899"},"createdAt":{"type":"string","description":"Timestamp indicating when the notification was created.","format":"date-time","nullable":true,"example":"2024-12-10T10:10:59.639Z"},"updatedAt":{"type":"string","nullable":true,"description":"Timestamp indicating when the notification was last updated.","format":"date-time","example":"2024-12-10T10:10:59.639Z"},"actor":{"description":"Actor details related to the notification, if applicable.","allOf":[{"$ref":"#/components/schemas/ActorFeedItemDto"}]},"subscriber":{"description":"Subscriber details associated with this notification.","allOf":[{"$ref":"#/components/schemas/SubscriberFeedResponseDto"}]},"transactionId":{"type":"string","description":"Unique identifier for the transaction associated with the notification.","example":"transaction_123456"},"templateIdentifier":{"type":"string","nullable":true,"description":"Identifier for the template used, if applicable.","example":"template_abcdef"},"providerId":{"type":"string","nullable":true,"description":"Identifier for the provider that sends the notification.","example":"provider_xyz"},"content":{"type":"string","description":"The main content of the notification.","example":"This is a test notification content."},"subject":{"type":"string","nullable":true,"description":"The subject line for email notifications, if applicable.","example":"Test Notification Subject"},"channel":{"$ref":"#/components/schemas/ChannelTypeEnum"},"read":{"type":"boolean","description":"Indicates whether the notification has been read by the subscriber.","example":false},"seen":{"type":"boolean","description":"Indicates whether the notification has been seen by the subscriber.","example":true},"deleted":{"type":"boolean","description":"Indicates whether the notification has been deleted.","example":false},"deviceTokens":{"nullable":true,"description":"Device tokens for push notifications, if applicable.","example":["token1","token2"],"type":"array","items":{"type":"string"}},"cta":{"description":"Call-to-action information associated with the notification.","allOf":[{"$ref":"#/components/schemas/MessageCTA"}]},"status":{"type":"string","description":"Current status of the notification.","enum":["sent","error","warning"],"example":"sent"},"payload":{"type":"object","description":"The payload that was used to send the notification trigger.","additionalProperties":true,"example":{"key":"value"}},"overrides":{"type":"object","description":"Provider-specific overrides used when triggering the notification.","additionalProperties":true,"example":{"overrideKey":"overrideValue"}}},"required":["_id","_templateId","_environmentId","_messageTemplateId","_organizationId","_notificationId","_subscriberId","_feedId","_jobId","transactionId","content","channel","read","seen","deleted","cta","status"]},"FeedResponseDto":{"type":"object","properties":{"totalCount":{"type":"number","description":"Total number of notifications available.","example":5},"hasMore":{"type":"boolean","description":"Indicates if there are more notifications to load.","example":true},"data":{"description":"Array of notifications returned in the response.","type":"array","items":{"$ref":"#/components/schemas/NotificationFeedItemDto"}},"pageSize":{"type":"number","description":"The number of notifications returned in this response.","example":2},"page":{"type":"number","description":"The current page number of the notifications.","example":1}},"required":["hasMore","data","pageSize","page"]},"UnseenCountResponse":{"type":"object","properties":{"count":{"type":"number"}},"required":["count"]},"MessageMarkAsRequestDto":{"type":"object","properties":{"messageId":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"markAs":{"enum":["read","seen","unread","unseen"],"type":"string"}},"required":["messageId","markAs"]},"MessageEntity":{"type":"object","properties":{}},"MarkAllMessageAsRequestDto":{"type":"object","properties":{"feedIdentifier":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Optional feed identifier or array of feed identifiers"},"markAs":{"enum":["read","seen","unread","unseen"],"type":"string","description":"Mark all subscriber messages as read, unread, seen or unseen"}},"required":["markAs"]},"NotificationGroup":{"type":"object","properties":{"_id":{"type":"string"},"name":{"type":"string"},"_environmentId":{"type":"string"},"_organizationId":{"type":"string"},"_parentId":{"type":"string"}},"required":["name","_environmentId","_organizationId"]},"DigestRegularMetadata":{"type":"object","properties":{"amount":{"type":"number"},"unit":{"type":"string","enum":["seconds","minutes","hours","days","weeks","months"]},"digestKey":{"type":"string"},"type":{"type":"string","enum":["regular","backoff"]},"backoff":{"type":"boolean"},"backoffAmount":{"type":"number"},"backoffUnit":{"type":"string","enum":["seconds","minutes","hours","days","weeks","months"]},"updateMode":{"type":"boolean"}},"required":["type"]},"TimedConfig":{"type":"object","properties":{"atTime":{"type":"string"},"weekDays":{"type":"array","items":{"type":"string","enum":["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]}},"monthDays":{"type":"array","items":{"type":"string"}},"ordinal":{"type":"string","enum":["1","2","3","4","5","last"]},"ordinalValue":{"type":"string","enum":["day","weekday","weekend","sunday","monday","tuesday","wednesday","thursday","friday","saturday"]},"monthlyType":{"type":"string","enum":["each","on"]}}},"DigestTimedMetadata":{"type":"object","properties":{"amount":{"type":"number"},"unit":{"type":"string","enum":["seconds","minutes","hours","days","weeks","months"]},"digestKey":{"type":"string"},"type":{"type":"string","enum":["timed"]},"timed":{"$ref":"#/components/schemas/TimedConfig"}},"required":["type"]},"DelayRegularMetadata":{"type":"object","properties":{"amount":{"type":"number"},"unit":{"type":"string","enum":["seconds","minutes","hours","days","weeks","months"]},"type":{"type":"string","enum":["regular"]}},"required":["type"]},"DelayScheduledMetadata":{"type":"object","properties":{"type":{"type":"string","enum":["scheduled"]},"delayPath":{"type":"string"}},"required":["type","delayPath"]},"MessageTemplate":{"type":"object","properties":{}},"NotificationStepVariant":{"type":"object","properties":{"_id":{"type":"string"},"uuid":{"type":"string"},"name":{"type":"string"},"_templateId":{"type":"string"},"active":{"type":"boolean"},"shouldStopOnFail":{"type":"boolean"},"template":{"$ref":"#/components/schemas/MessageTemplate"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/StepFilter"}},"_parentId":{"type":"object"},"metadata":{"oneOf":[{"$ref":"#/components/schemas/DigestRegularMetadata"},{"$ref":"#/components/schemas/DigestTimedMetadata"},{"$ref":"#/components/schemas/DelayRegularMetadata"},{"$ref":"#/components/schemas/DelayScheduledMetadata"}]},"replyCallback":{"type":"object"}}},"NotificationStep":{"type":"object","properties":{"_id":{"type":"string"},"uuid":{"type":"string"},"name":{"type":"string"},"_templateId":{"type":"string"},"active":{"type":"boolean"},"shouldStopOnFail":{"type":"boolean"},"template":{"$ref":"#/components/schemas/MessageTemplate"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/StepFilter"}},"_parentId":{"type":"object"},"metadata":{"oneOf":[{"$ref":"#/components/schemas/DigestRegularMetadata"},{"$ref":"#/components/schemas/DigestTimedMetadata"},{"$ref":"#/components/schemas/DelayRegularMetadata"},{"$ref":"#/components/schemas/DelayScheduledMetadata"}]},"replyCallback":{"type":"object"},"variants":{"$ref":"#/components/schemas/NotificationStepVariant"}}},"NotificationTriggerVariable":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"NotificationTrigger":{"type":"object","properties":{"type":{"type":"string","enum":["event"]},"identifier":{"type":"string"},"variables":{"type":"array","items":{"$ref":"#/components/schemas/NotificationTriggerVariable"}},"subscriberVariables":{"type":"array","items":{"$ref":"#/components/schemas/NotificationTriggerVariable"}}},"required":["type","identifier","variables"]},"WorkflowResponse":{"type":"object","properties":{"_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"active":{"type":"boolean"},"draft":{"type":"boolean"},"preferenceSettings":{"$ref":"#/components/schemas/PreferenceChannels"},"critical":{"type":"boolean"},"tags":{"type":"array","items":{"type":"string"}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/NotificationStep"}},"_organizationId":{"type":"string"},"_creatorId":{"type":"string"},"_environmentId":{"type":"string"},"triggers":{"type":"array","items":{"$ref":"#/components/schemas/NotificationTrigger"}},"_notificationGroupId":{"type":"string"},"_parentId":{"type":"string"},"deleted":{"type":"boolean"},"deletedAt":{"type":"string"},"deletedBy":{"type":"string"},"notificationGroup":{"$ref":"#/components/schemas/NotificationGroup"},"data":{"type":"object"},"workflowIntegrationStatus":{"type":"object"}},"required":["name","description","active","draft","preferenceSettings","critical","tags","steps","_organizationId","_creatorId","_environmentId","triggers","_notificationGroupId","deleted","deletedAt","deletedBy"]},"MessageResponseDto":{"type":"object","properties":{"_id":{"type":"string"},"_templateId":{"type":"string"},"_environmentId":{"type":"string"},"_messageTemplateId":{"type":"string"},"_organizationId":{"type":"string"},"_notificationId":{"type":"string"},"_subscriberId":{"type":"string"},"subscriber":{"$ref":"#/components/schemas/SubscriberResponseDto"},"template":{"$ref":"#/components/schemas/WorkflowResponse"},"templateIdentifier":{"type":"string"},"createdAt":{"type":"string"},"lastSeenDate":{"type":"string"},"lastReadDate":{"type":"string"},"content":{"oneOf":[{"$ref":"#/components/schemas/EmailBlock"},{"type":"string"}]},"transactionId":{"type":"string"},"subject":{"type":"string"},"channel":{"enum":["in_app","email","sms","chat","push"],"type":"string"},"read":{"type":"boolean"},"seen":{"type":"boolean"},"email":{"type":"string"},"phone":{"type":"string"},"directWebhookUrl":{"type":"string"},"providerId":{"type":"string"},"deviceTokens":{"type":"array","items":{"type":"string"}},"title":{"type":"string"},"cta":{"$ref":"#/components/schemas/MessageCTA"},"_feedId":{"type":"object","nullable":true},"status":{"type":"string","enum":["sent","error","warning"]},"errorId":{"type":"string"},"errorText":{"type":"string"},"payload":{"type":"object","description":"The payload that was used to send the notification trigger"},"overrides":{"type":"object","description":"Provider specific overrides used when triggering the notification"}},"required":["_templateId","_environmentId","_messageTemplateId","_organizationId","_notificationId","_subscriberId","createdAt","content","transactionId","channel","read","seen","cta","status","errorId","errorText","payload","overrides"]},"MarkMessageActionAsSeenDto":{"type":"object","properties":{"status":{"enum":["pending","done"],"type":"string","description":"Message action status"},"payload":{"type":"object","description":"Message action payload"}},"required":["status"]},"DeleteMessageResponseDto":{"type":"object","properties":{"acknowledged":{"type":"boolean","description":"A boolean stating the success of the action"},"status":{"type":"string","description":"The status enum for the performed action","enum":["deleted"]}},"required":["acknowledged","status"]},"CreateTopicResponseDto":{"type":"object","properties":{"_id":{"type":"string","description":"The unique identifier for the Topic created."},"key":{"type":"string","description":"User defined custom key and provided by the user that will be an unique identifier for the Topic created."}},"required":["key"]},"CreateTopicRequestDto":{"type":"object","properties":{"key":{"type":"string","description":"User defined custom key and provided by the user that will be an unique identifier for the Topic created."},"name":{"type":"string","description":"User defined custom name and provided by the user that will name the Topic created."}},"required":["key","name"]},"AddSubscribersRequestDto":{"type":"object","properties":{"subscribers":{"description":"List of subscriber identifiers that will be associated to the topic","type":"array","items":{"type":"string"}}},"required":["subscribers"]},"FailedAssignmentsDto":{"type":"object","properties":{"notFound":{"description":"List of subscriber IDs that were not found","type":"array","items":{"type":"string"}}}},"AssignSubscriberToTopicDto":{"type":"object","properties":{"succeeded":{"description":"List of successfully assigned subscriber IDs","type":"array","items":{"type":"string"}},"failed":{"description":"Details about failed assignments","allOf":[{"$ref":"#/components/schemas/FailedAssignmentsDto"}]}},"required":["succeeded"]},"TopicSubscriberDto":{"type":"object","properties":{"_organizationId":{"type":"string","description":"Unique identifier for the organization","example":"org_123456789"},"_environmentId":{"type":"string","description":"Unique identifier for the environment","example":"env_123456789"},"_subscriberId":{"type":"string","description":"Unique identifier for the subscriber","example":"sub_123456789"},"_topicId":{"type":"string","description":"Unique identifier for the topic","example":"topic_123456789"},"topicKey":{"type":"string","description":"Key associated with the topic","example":"my_topic_key"},"externalSubscriberId":{"type":"string","description":"External identifier for the subscriber","example":"external_subscriber_123"}},"required":["_organizationId","_environmentId","_subscriberId","_topicId","topicKey","externalSubscriberId"]},"RemoveSubscribersRequestDto":{"type":"object","properties":{"subscribers":{"description":"List of subscriber identifiers that will be removed to the topic","type":"array","items":{"type":"string"}}},"required":["subscribers"]},"TopicDto":{"type":"object","properties":{"_id":{"type":"string"},"_organizationId":{"type":"string"},"_environmentId":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"subscribers":{"type":"array","items":{"type":"string"}}},"required":["_organizationId","_environmentId","key","name","subscribers"]},"FilterTopicsResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TopicDto"}},"page":{"type":"number"},"pageSize":{"type":"number"},"totalCount":{"type":"number"}},"required":["data","page","pageSize","totalCount"]},"GetTopicResponseDto":{"type":"object","properties":{"_id":{"type":"string"},"_organizationId":{"type":"string"},"_environmentId":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"subscribers":{"type":"array","items":{"type":"string"}}},"required":["_organizationId","_environmentId","key","name","subscribers"]},"RenameTopicResponseDto":{"type":"object","properties":{"_id":{"type":"string"},"_organizationId":{"type":"string"},"_environmentId":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"subscribers":{"type":"array","items":{"type":"string"}}},"required":["_organizationId","_environmentId","key","name","subscribers"]},"RenameTopicRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"User defined custom name and provided by the user to rename the topic."}},"required":["name"]},"GeneratePreviewResponseDto":{"type":"object","properties":{}},"PlainCardRequestDto":{"type":"object","properties":{"cardKeys":{"type":"array","items":{"type":"string"}},"customer":{"type":"object","nullable":true},"tenant":{"type":"object","nullable":true},"thread":{"type":"object","nullable":true},"timestamp":{"type":"string"}},"required":["timestamp"]},"CreateSupportThreadDto":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},"headers":{"Content-Type":{"required":true,"description":"The MIME type of the response body.","schema":{"type":"string"},"example":"application/json"},"RateLimit-Limit":{"required":false,"description":"The number of requests that the client is permitted to make per second. The actual maximum may differ when burst is enabled.","schema":{"type":"string"},"example":"100"},"RateLimit-Remaining":{"required":false,"description":"The number of requests remaining until the next window.","schema":{"type":"string"},"example":"93"},"RateLimit-Reset":{"required":false,"description":"The remaining seconds until a request of the same cost will be refreshed.","schema":{"type":"string"},"example":"8"},"RateLimit-Policy":{"required":false,"description":"The rate limit policy that was used to evaluate the request.","schema":{"type":"string"},"example":"100;w=1;burst=110;comment=\"token bucket\";category=\"trigger\";cost=\"single\""},"Retry-After":{"required":false,"description":"The number of seconds after which the client may retry the request that was previously rejected.","schema":{"type":"string"},"example":"8"},"Idempotency-Key":{"required":false,"description":"The idempotency key used to evaluate the request.","schema":{"type":"string"},"example":"8"},"Idempotency-Replay":{"required":false,"description":"Whether the request was a replay of a previous request.","schema":{"type":"string"},"example":"true"},"Link":{"required":false,"description":"A link to the documentation.","schema":{"type":"string"},"example":"https://docs.novu.co/"}}},"externalDocs":{"description":"Novu Documentation","url":"https://docs.novu.co"}} \ No newline at end of file diff --git a/specs/openapi-diff.sh b/specs/openapi-diff.sh new file mode 100644 index 0000000..a91a453 --- /dev/null +++ b/specs/openapi-diff.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -e + +PREVIOUS="0.18.0" +VERSIONS=('0.19.0' '0.24.0' '2.0.6') + +for version in "${VERSIONS[@]}"; do + echo "Processing version $version" + + mkdir -p $version + + # see https://github.com/OpenAPITools/openapi-diff + docker run --rm -t \ + -v $(pwd):/spec \ + openapitools/openapi-diff:latest \ + /spec/openapi-$PREVIOUS.json /spec/openapi-$version.json \ + --asciidoc /spec/$version/diff.ascidoc \ + --html /spec/$version/diff.html \ + --markdown /spec/$version/diff.md + + PREVIOUS=$version +done \ No newline at end of file diff --git a/src/Novu/Interfaces/IApiConfiguration.cs b/src/Novu.Domain/IApiConfiguration.cs similarity index 79% rename from src/Novu/Interfaces/IApiConfiguration.cs rename to src/Novu.Domain/IApiConfiguration.cs index 7d2e618..5bd70ab 100644 --- a/src/Novu/Interfaces/IApiConfiguration.cs +++ b/src/Novu.Domain/IApiConfiguration.cs @@ -1,4 +1,4 @@ -namespace Novu.Interfaces; +namespace Novu.Domain; public interface IApiConfiguration { diff --git a/src/Novu/Interfaces/INovuClientConfiguration.cs b/src/Novu.Domain/INovuClientConfiguration.cs similarity index 93% rename from src/Novu/Interfaces/INovuClientConfiguration.cs rename to src/Novu.Domain/INovuClientConfiguration.cs index f8a527b..26ddf04 100644 --- a/src/Novu/Interfaces/INovuClientConfiguration.cs +++ b/src/Novu.Domain/INovuClientConfiguration.cs @@ -1,4 +1,4 @@ -namespace Novu.Interfaces; +namespace Novu.Domain; public interface INovuClientConfiguration { diff --git a/src/Novu/Internal/IsExternalInit.cs b/src/Novu.Domain/Internal/IsExternalInit.cs similarity index 100% rename from src/Novu/Internal/IsExternalInit.cs rename to src/Novu.Domain/Internal/IsExternalInit.cs diff --git a/src/Novu/JsonConverters/ArrayConverter.cs b/src/Novu.Domain/JsonConverters/ArrayConverter.cs similarity index 97% rename from src/Novu/JsonConverters/ArrayConverter.cs rename to src/Novu.Domain/JsonConverters/ArrayConverter.cs index 20cbfeb..30ccf36 100644 --- a/src/Novu/JsonConverters/ArrayConverter.cs +++ b/src/Novu.Domain/JsonConverters/ArrayConverter.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace Novu.JsonConverters; +namespace Novu.Domain.JsonConverters; /// /// ConvertToInt a {T} or Array{T} to an Array{T} diff --git a/src/Novu/JsonConverters/JsonCreationConverter.cs b/src/Novu.Domain/JsonConverters/JsonCreationConverter.cs similarity index 97% rename from src/Novu/JsonConverters/JsonCreationConverter.cs rename to src/Novu.Domain/JsonConverters/JsonCreationConverter.cs index 5603ac8..fa2020e 100644 --- a/src/Novu/JsonConverters/JsonCreationConverter.cs +++ b/src/Novu.Domain/JsonConverters/JsonCreationConverter.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace Novu.JsonConverters; +namespace Novu.Domain.JsonConverters; /// /// see https://www.tutorialdocs.com/article/webapi-data-binding.html diff --git a/src/Novu/JsonConverters/MessageTemplateConverter.cs b/src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs similarity index 91% rename from src/Novu/JsonConverters/MessageTemplateConverter.cs rename to src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs index a36152e..440c22e 100644 --- a/src/Novu/JsonConverters/MessageTemplateConverter.cs +++ b/src/Novu.Domain/JsonConverters/MessageTemplateConverter.cs @@ -1,9 +1,9 @@ using Newtonsoft.Json.Linq; -using Novu.Models.Workflows.Step; -using Novu.Models.Workflows.Step.Message; -using Novu.Utils; +using Novu.Domain.Models.Workflows.Step; +using Novu.Domain.Models.Workflows.Step.Message; +using Novu.Domain.Utils; -namespace Novu.JsonConverters; +namespace Novu.Domain.JsonConverters; /// /// Converts the incoming JSON stream into polymorphic type diff --git a/src/Novu/JsonConverters/MetaDataConverter.cs b/src/Novu.Domain/JsonConverters/MetaDataConverter.cs similarity index 96% rename from src/Novu/JsonConverters/MetaDataConverter.cs rename to src/Novu.Domain/JsonConverters/MetaDataConverter.cs index 7d2af38..d67f4de 100644 --- a/src/Novu/JsonConverters/MetaDataConverter.cs +++ b/src/Novu.Domain/JsonConverters/MetaDataConverter.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json.Linq; -using Novu.Models.Workflows.Step; -using Novu.Utils; +using Novu.Domain.Models.Workflows.Step; +using Novu.Domain.Utils; -namespace Novu.JsonConverters; +namespace Novu.Domain.JsonConverters; /// /// Converts the incoming JSON stream into polymorphic type diff --git a/src/Novu/JsonConverters/TypeOrStringConverter.cs b/src/Novu.Domain/JsonConverters/TypeOrStringConverter.cs similarity index 97% rename from src/Novu/JsonConverters/TypeOrStringConverter.cs rename to src/Novu.Domain/JsonConverters/TypeOrStringConverter.cs index 29e0c30..76823f8 100644 --- a/src/Novu/JsonConverters/TypeOrStringConverter.cs +++ b/src/Novu.Domain/JsonConverters/TypeOrStringConverter.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace Novu.JsonConverters; +namespace Novu.Domain.JsonConverters; /// /// Solves the problem of diff --git a/src/Novu.Domain/Models/Blueprints/Blueprint.cs b/src/Novu.Domain/Models/Blueprints/Blueprint.cs new file mode 100644 index 0000000..5d49a45 --- /dev/null +++ b/src/Novu.Domain/Models/Blueprints/Blueprint.cs @@ -0,0 +1,5 @@ +namespace Novu.Domain.Models.Blueprints; + +public class Blueprint +{ +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Blueprints/GroupedBlueprint.cs b/src/Novu.Domain/Models/Blueprints/GroupedBlueprint.cs new file mode 100644 index 0000000..94a3b86 --- /dev/null +++ b/src/Novu.Domain/Models/Blueprints/GroupedBlueprint.cs @@ -0,0 +1,14 @@ +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Blueprints; + +public class GroupedBlueprint +{ + [JsonProperty("general")] + [Required] + public ICollection General { get; set; } = new Collection(); + + [JsonProperty("popular")] [Required] public GroupedBlueprint? Popular { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Changes/Change.cs b/src/Novu.Domain/Models/Changes/Change.cs new file mode 100644 index 0000000..fdf27b7 --- /dev/null +++ b/src/Novu.Domain/Models/Changes/Change.cs @@ -0,0 +1,45 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Novu.Domain.Models.Changes; + +public class Change +{ + [JsonProperty("_id")] public string Id { get; set; } + + [JsonProperty("_creatorId")] + [Required(AllowEmptyStrings = true)] + public string CreatorId { get; set; } + + [JsonProperty("_environmentId")] + [Required(AllowEmptyStrings = true)] + public string EnvironmentId { get; set; } + + [JsonProperty("_organizationId")] + [Required(AllowEmptyStrings = true)] + public string OrganizationId { get; set; } + + [JsonProperty("_entityId")] + [Required(AllowEmptyStrings = true)] + public string EntityId { get; set; } + + [JsonProperty("enabled")] public bool Enabled { get; set; } + + [JsonProperty("type")] + [Required(AllowEmptyStrings = true)] + [JsonConverter(typeof(StringEnumConverter))] + public ChangeEnum? Type { get; set; } + + [JsonProperty("change")] [Required] public ChangeItem[] Changes { get; set; } = Array.Empty(); + + [JsonProperty("createdAt")] + [Required(AllowEmptyStrings = true)] + public string CreatedAt { get; set; } + + [JsonProperty("updatedAt")] + [Required(AllowEmptyStrings = true)] + public string UpdatedAt { get; set; } + + [JsonProperty("_parentId")] public string ParentId { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Changes/ChangeEnum.cs b/src/Novu.Domain/Models/Changes/ChangeEnum.cs new file mode 100644 index 0000000..eb55060 --- /dev/null +++ b/src/Novu.Domain/Models/Changes/ChangeEnum.cs @@ -0,0 +1,26 @@ +using System.Runtime.Serialization; + +namespace Novu.Domain.Models.Changes; + +public enum ChangeEnum +{ + [EnumMember(Value = @"Feed")] Feed = 0, + + [EnumMember(Value = @"MessageTemplate")] + MessageTemplate = 1, + + [EnumMember(Value = @"Layout")] Layout = 2, + + [EnumMember(Value = @"DefaultLayout")] DefaultLayout = 3, + + [EnumMember(Value = @"NotificationTemplate")] + NotificationTemplate = 4, + + [EnumMember(Value = @"NotificationGroup")] + NotificationGroup = 5, + + [EnumMember(Value = @"TranslationGroup")] + TranslationGroup = 6, + + [EnumMember(Value = @"Translation")] Translation = 7, +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Changes/ChangeItem.cs b/src/Novu.Domain/Models/Changes/ChangeItem.cs new file mode 100644 index 0000000..b33cde0 --- /dev/null +++ b/src/Novu.Domain/Models/Changes/ChangeItem.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Changes; + +public class ChangeItem +{ + [JsonProperty("op")] public string Op { get; set; } + + [JsonProperty("path")] public IList Paths { get; set; } + + [JsonProperty("val")] + [Required(AllowEmptyStrings = true)] + public string Val { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Changes/FeedCreateData.cs b/src/Novu.Domain/Models/Changes/FeedCreateData.cs new file mode 100644 index 0000000..af8209a --- /dev/null +++ b/src/Novu.Domain/Models/Changes/FeedCreateData.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Changes; + +public class ChangesCreateData +{ + /// + /// User defined custom name and provided by the user that will name the Topic created. + /// + [JsonProperty("changeIds")] + [Required] + public IList ChangeIds { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Environments/ApiKey.cs b/src/Novu.Domain/Models/Environments/ApiKey.cs new file mode 100644 index 0000000..201fe6d --- /dev/null +++ b/src/Novu.Domain/Models/Environments/ApiKey.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Environments; + +public class ApiKey +{ + [JsonProperty("key")] + [Required(AllowEmptyStrings = true)] + public string Key { get; set; } + + [JsonProperty("_userId")] + [Required(AllowEmptyStrings = true)] + public string UserId { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Environments/NovuEnvironment.cs b/src/Novu.Domain/Models/Environments/NovuEnvironment.cs new file mode 100644 index 0000000..03b3e8d --- /dev/null +++ b/src/Novu.Domain/Models/Environments/NovuEnvironment.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Environments; + +/// +/// Named with the Novu prefix to avoid the hassle of System.Environment static class collisions +/// +public class NovuEnvironment +{ + [JsonProperty("_id")] public string Id { get; set; } + + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonProperty("_organizationId")] + [Required(AllowEmptyStrings = true)] + public string OrganizationId { get; set; } + + [JsonProperty("identifier")] + [Required(AllowEmptyStrings = true)] + public string Identifier { get; set; } + + [JsonProperty("apiKeys")] public ICollection ApiKeys { get; set; } + + [JsonProperty("_parentId")] + [Required(AllowEmptyStrings = true)] + public string ParentId { get; set; } +} \ No newline at end of file diff --git a/src/Novu/DTO/Events/BroadcastEventCreateData.cs b/src/Novu.Domain/Models/Events/BroadcastEventCreateData.cs similarity index 94% rename from src/Novu/DTO/Events/BroadcastEventCreateData.cs rename to src/Novu.Domain/Models/Events/BroadcastEventCreateData.cs index 4226d36..3a6f2f0 100644 --- a/src/Novu/DTO/Events/BroadcastEventCreateData.cs +++ b/src/Novu.Domain/Models/Events/BroadcastEventCreateData.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using Novu.DTO.Workflows; +using Novu.Domain.Models.Workflows; -namespace Novu.DTO.Events; +namespace Novu.Domain.Models.Events; /// /// see https://docs.novu.co/api/broadcast-event-to-all/ diff --git a/src/Novu/DTO/Events/BulkEventCreateData.cs b/src/Novu.Domain/Models/Events/BulkEventCreateData.cs similarity index 88% rename from src/Novu/DTO/Events/BulkEventCreateData.cs rename to src/Novu.Domain/Models/Events/BulkEventCreateData.cs index bf9f6b8..e178b0c 100644 --- a/src/Novu/DTO/Events/BulkEventCreateData.cs +++ b/src/Novu.Domain/Models/Events/BulkEventCreateData.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Events; +namespace Novu.Domain.Models.Events; public class BulkEventCreateData { diff --git a/src/Novu/DTO/Events/EventAcknowledgeData.cs b/src/Novu.Domain/Models/Events/EventAcknowledgeData.cs similarity index 53% rename from src/Novu/DTO/Events/EventAcknowledgeData.cs rename to src/Novu.Domain/Models/Events/EventAcknowledgeData.cs index 106ebd9..68dee59 100644 --- a/src/Novu/DTO/Events/EventAcknowledgeData.cs +++ b/src/Novu.Domain/Models/Events/EventAcknowledgeData.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; -namespace Novu.DTO.Events; +namespace Novu.Domain.Models.Events; -public class EventAcknowledgeData : AcknowledgeData +public class EventAcknowledgeData : NovuAcknowledgeData { [JsonProperty("transactionId")] public string TransactionId { get; set; } } \ No newline at end of file diff --git a/src/Novu/DTO/Events/EventCreateData.cs b/src/Novu.Domain/Models/Events/EventCreateData.cs similarity index 92% rename from src/Novu/DTO/Events/EventCreateData.cs rename to src/Novu.Domain/Models/Events/EventCreateData.cs index 7e15259..59a03bc 100644 --- a/src/Novu/DTO/Events/EventCreateData.cs +++ b/src/Novu.Domain/Models/Events/EventCreateData.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Events; -namespace Novu.DTO.Events; +namespace Novu.Domain.Models.Events; public class EventCreateData { diff --git a/src/Novu.Domain/Models/Events/EventTo.cs b/src/Novu.Domain/Models/Events/EventTo.cs new file mode 100644 index 0000000..8a610a8 --- /dev/null +++ b/src/Novu.Domain/Models/Events/EventTo.cs @@ -0,0 +1,55 @@ +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Events; + +public record EventTo +{ + /// + /// Subscriber ID to send the event to. + /// + [JsonProperty("subscriberId")] + public string SubscriberId { get; set; } + + /// + /// Subscriber first name to be populated in workflows. + /// + [JsonProperty("firstName", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public string FirstName { get; set; } + + /// + /// Subscriber last name to be populated in workflows. + /// + [JsonProperty("lastName", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public string LastName { get; set; } + + /// + /// Subscriber email to be populated in workflows. + /// + [JsonProperty("email", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Email { get; set; } + + /// + /// Subscriber phone to be populated in workflows. + /// + [JsonProperty("phone", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Phone { get; set; } + + /// + /// Subscriber avatar to be populated in workflows. + /// + [JsonProperty("avatar", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Avatar { get; set; } + + /// + /// Subscriber locale to be populated in workflows. + /// + [JsonProperty("locale", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Locale { get; set; } + + /// + /// Set of arbitrary data as a json structure that should be { key:value } + /// see https://docs.novu.co/concepts/subscribers#subscriber-attributes + /// + [JsonProperty("data", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] + public dynamic Data { get; set; } +} \ No newline at end of file diff --git a/src/Novu/DTO/Events/TopicCreateData.cs b/src/Novu.Domain/Models/Events/TopicCreateData.cs similarity index 97% rename from src/Novu/DTO/Events/TopicCreateData.cs rename to src/Novu.Domain/Models/Events/TopicCreateData.cs index 85bd247..3d81059 100644 --- a/src/Novu/DTO/Events/TopicCreateData.cs +++ b/src/Novu.Domain/Models/Events/TopicCreateData.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using Novu.Models.Triggers; +using Novu.Domain.Models.Triggers; -namespace Novu.DTO.Events; +namespace Novu.Domain.Models.Events; /// /// see https://docs.novu.co/platform/topics/#sending-a-notification-to-a-topic diff --git a/src/Novu.Domain/Models/Feeds/Feed.cs b/src/Novu.Domain/Models/Feeds/Feed.cs new file mode 100644 index 0000000..d67629d --- /dev/null +++ b/src/Novu.Domain/Models/Feeds/Feed.cs @@ -0,0 +1,28 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Feeds; + +public class Feed +{ + [JsonProperty("_id")] public string Id { get; set; } + + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonProperty("identifier")] + [Required(AllowEmptyStrings = true)] + public string Identifier { get; set; } + + [JsonProperty("_environmentId")] + [Required(AllowEmptyStrings = true)] + public string EnvironmentId { get; set; } + + [JsonProperty("_organizationId")] + [Required(AllowEmptyStrings = true)] + public string OrganizationId { get; set; } + + [JsonProperty("_additionalProperties")] + public IDictionary AdditionalProperties { get; set; } = new Dictionary(); +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Feeds/FeedCreateData.cs b/src/Novu.Domain/Models/Feeds/FeedCreateData.cs new file mode 100644 index 0000000..235126a --- /dev/null +++ b/src/Novu.Domain/Models/Feeds/FeedCreateData.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Feeds; + +public class FeedCreateData +{ + + /// + /// User defined custom name and provided by the user that will name the Topic created. + /// + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/Novu/Models/IntegrationExtensions.cs b/src/Novu.Domain/Models/IntegrationExtensions.cs similarity index 89% rename from src/Novu/Models/IntegrationExtensions.cs rename to src/Novu.Domain/Models/IntegrationExtensions.cs index 8a1076f..eb027cc 100644 --- a/src/Novu/Models/IntegrationExtensions.cs +++ b/src/Novu.Domain/Models/IntegrationExtensions.cs @@ -1,6 +1,6 @@ -using Novu.DTO.Integrations; +using Novu.Domain.Models.Integrations; -namespace Novu.Models; +namespace Novu.Domain.Models; public static class IntegrationExtensions { diff --git a/src/Novu/Models/Integrations/Credentials.cs b/src/Novu.Domain/Models/Integrations/Credentials.cs similarity index 98% rename from src/Novu/Models/Integrations/Credentials.cs rename to src/Novu.Domain/Models/Integrations/Credentials.cs index 7b4a655..8877c86 100644 --- a/src/Novu/Models/Integrations/Credentials.cs +++ b/src/Novu.Domain/Models/Integrations/Credentials.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Integrations; +namespace Novu.Domain.Models.Integrations; /// /// This object has ALL the options across ALL providers in various combinations diff --git a/src/Novu/DTO/Integrations/Integration.cs b/src/Novu.Domain/Models/Integrations/Integration.cs similarity index 95% rename from src/Novu/DTO/Integrations/Integration.cs rename to src/Novu.Domain/Models/Integrations/Integration.cs index bc743e1..7402b31 100644 --- a/src/Novu/DTO/Integrations/Integration.cs +++ b/src/Novu.Domain/Models/Integrations/Integration.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Integrations; -namespace Novu.DTO.Integrations; +namespace Novu.Domain.Models.Integrations; public class Integration { diff --git a/src/Novu/DTO/Integrations/IntegrationCreateData.cs b/src/Novu.Domain/Models/Integrations/IntegrationCreateData.cs similarity index 91% rename from src/Novu/DTO/Integrations/IntegrationCreateData.cs rename to src/Novu.Domain/Models/Integrations/IntegrationCreateData.cs index a6b528a..c663f55 100644 --- a/src/Novu/DTO/Integrations/IntegrationCreateData.cs +++ b/src/Novu.Domain/Models/Integrations/IntegrationCreateData.cs @@ -1,8 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using Novu.Models.Integrations; -namespace Novu.DTO.Integrations; +namespace Novu.Domain.Models.Integrations; public class IntegrationCreateData { diff --git a/src/Novu/DTO/Integrations/IntegrationEditData.cs b/src/Novu.Domain/Models/Integrations/IntegrationEditData.cs similarity index 91% rename from src/Novu/DTO/Integrations/IntegrationEditData.cs rename to src/Novu.Domain/Models/Integrations/IntegrationEditData.cs index c8ec1d4..59f2f9a 100644 --- a/src/Novu/DTO/Integrations/IntegrationEditData.cs +++ b/src/Novu.Domain/Models/Integrations/IntegrationEditData.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Integrations; -namespace Novu.DTO.Integrations; +namespace Novu.Domain.Models.Integrations; public class IntegrationEditData { diff --git a/src/Novu/DTO/Layouts/Layout.cs b/src/Novu.Domain/Models/Layouts/Layout.cs similarity index 95% rename from src/Novu/DTO/Layouts/Layout.cs rename to src/Novu.Domain/Models/Layouts/Layout.cs index 40c6818..555a5b3 100644 --- a/src/Novu/DTO/Layouts/Layout.cs +++ b/src/Novu.Domain/Models/Layouts/Layout.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.Models.Workflows.Step.Message; -namespace Novu.DTO.Layouts; +namespace Novu.Domain.Models.Layouts; public class Layout { diff --git a/src/Novu/DTO/Layouts/LayoutCreateData.cs b/src/Novu.Domain/Models/Layouts/LayoutCreateData.cs similarity index 94% rename from src/Novu/DTO/Layouts/LayoutCreateData.cs rename to src/Novu.Domain/Models/Layouts/LayoutCreateData.cs index fc6299a..8fecada 100644 --- a/src/Novu/DTO/Layouts/LayoutCreateData.cs +++ b/src/Novu.Domain/Models/Layouts/LayoutCreateData.cs @@ -1,8 +1,8 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.Models.Workflows.Step.Message; -namespace Novu.DTO.Layouts; +namespace Novu.Domain.Models.Layouts; /// /// see https://docs.novu.co/api/layout-creation/ diff --git a/src/Novu/DTO/Layouts/LayoutEditData.cs b/src/Novu.Domain/Models/Layouts/LayoutEditData.cs similarity index 83% rename from src/Novu/DTO/Layouts/LayoutEditData.cs rename to src/Novu.Domain/Models/Layouts/LayoutEditData.cs index 868dcfb..6b68917 100644 --- a/src/Novu/DTO/Layouts/LayoutEditData.cs +++ b/src/Novu.Domain/Models/Layouts/LayoutEditData.cs @@ -1,4 +1,4 @@ -namespace Novu.DTO.Layouts; +namespace Novu.Domain.Models.Layouts; /// /// see https://docs.novu.co/api/update-a-layout/ diff --git a/src/Novu/DTO/Messages/Message.cs b/src/Novu.Domain/Models/Messages/Message.cs similarity index 87% rename from src/Novu/DTO/Messages/Message.cs rename to src/Novu.Domain/Models/Messages/Message.cs index bea1433..d92fa24 100644 --- a/src/Novu/DTO/Messages/Message.cs +++ b/src/Novu.Domain/Models/Messages/Message.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using Novu.Models.Notifications; +using Novu.Domain.Models.Notifications; -namespace Novu.DTO.Messages; +namespace Novu.Domain.Models.Messages; public class Message { diff --git a/src/Novu.Domain/Models/MxRecords/MxRecordStatus.cs b/src/Novu.Domain/Models/MxRecords/MxRecordStatus.cs new file mode 100644 index 0000000..9b5ab14 --- /dev/null +++ b/src/Novu.Domain/Models/MxRecords/MxRecordStatus.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace Novu.Domain.Models.MxRecords; + +public class MxRecordStatus +{ + [JsonProperty("mxRecordConfigured")] + public bool MxRecordConfigured { get; set; } +} \ No newline at end of file diff --git a/src/Novu/Models/Notifications/Digest.cs b/src/Novu.Domain/Models/Notifications/Digest.cs similarity index 80% rename from src/Novu/Models/Notifications/Digest.cs rename to src/Novu.Domain/Models/Notifications/Digest.cs index e45d066..32f8ecb 100644 --- a/src/Novu/Models/Notifications/Digest.cs +++ b/src/Novu.Domain/Models/Notifications/Digest.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Digest { diff --git a/src/Novu/Models/Notifications/ExecutionDetail.cs b/src/Novu.Domain/Models/Notifications/ExecutionDetail.cs similarity index 96% rename from src/Novu/Models/Notifications/ExecutionDetail.cs rename to src/Novu.Domain/Models/Notifications/ExecutionDetail.cs index fa888f8..60cf92a 100644 --- a/src/Novu/Models/Notifications/ExecutionDetail.cs +++ b/src/Novu.Domain/Models/Notifications/ExecutionDetail.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class ExecutionDetail { diff --git a/src/Novu/Models/Notifications/Job.cs b/src/Novu.Domain/Models/Notifications/Job.cs similarity index 95% rename from src/Novu/Models/Notifications/Job.cs rename to src/Novu.Domain/Models/Notifications/Job.cs index 1bd6c38..13603e4 100644 --- a/src/Novu/Models/Notifications/Job.cs +++ b/src/Novu.Domain/Models/Notifications/Job.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Job { diff --git a/src/Novu/Models/Notifications/Metadata.cs b/src/Novu.Domain/Models/Notifications/Metadata.cs similarity index 71% rename from src/Novu/Models/Notifications/Metadata.cs rename to src/Novu.Domain/Models/Notifications/Metadata.cs index 12632cb..d5dfa23 100644 --- a/src/Novu/Models/Notifications/Metadata.cs +++ b/src/Novu.Domain/Models/Notifications/Metadata.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Metadata { diff --git a/src/Novu/DTO/Notifications/Notification.cs b/src/Novu.Domain/Models/Notifications/Notification.cs similarity index 83% rename from src/Novu/DTO/Notifications/Notification.cs rename to src/Novu.Domain/Models/Notifications/Notification.cs index ef5cdd2..681ed0f 100644 --- a/src/Novu/DTO/Notifications/Notification.cs +++ b/src/Novu.Domain/Models/Notifications/Notification.cs @@ -1,9 +1,7 @@ using Newtonsoft.Json; -using Novu.Models.Notifications; -using Novu.Models.Subscribers.Preferences; -using Template = Novu.Models.Notifications.Template; +using Novu.Domain.Models.Subscribers.Preferences; -namespace Novu.DTO.Notifications; +namespace Novu.Domain.Models.Notifications; public class Notification { @@ -14,7 +12,7 @@ public class Notification [JsonProperty("transactionId")] public string TransactionId { get; set; } [JsonProperty("channels")] public ChannelTypeEnum[] Channels { get; set; } [JsonProperty("template")] public Template Template { get; set; } - + [JsonProperty("content")] public string Content { get; set; } /// /// Sometimes this can be null and not sure why /// diff --git a/src/Novu/DTO/Notifications/NotificationGraphStats.cs b/src/Novu.Domain/Models/Notifications/NotificationGraphStats.cs similarity index 88% rename from src/Novu/DTO/Notifications/NotificationGraphStats.cs rename to src/Novu.Domain/Models/Notifications/NotificationGraphStats.cs index 0240d18..9685ee1 100644 --- a/src/Novu/DTO/Notifications/NotificationGraphStats.cs +++ b/src/Novu.Domain/Models/Notifications/NotificationGraphStats.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Notifications; +namespace Novu.Domain.Models.Notifications; public class NotificationGraphStats { diff --git a/src/Novu/DTO/Notifications/NotificationStats.cs b/src/Novu.Domain/Models/Notifications/NotificationStats.cs similarity index 81% rename from src/Novu/DTO/Notifications/NotificationStats.cs rename to src/Novu.Domain/Models/Notifications/NotificationStats.cs index 3806d8d..d03ac68 100644 --- a/src/Novu/DTO/Notifications/NotificationStats.cs +++ b/src/Novu.Domain/Models/Notifications/NotificationStats.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Notifications; +namespace Novu.Domain.Models.Notifications; public class NotificationStats { diff --git a/src/Novu/Models/Notifications/Step.cs b/src/Novu.Domain/Models/Notifications/Step.cs similarity index 93% rename from src/Novu/Models/Notifications/Step.cs rename to src/Novu.Domain/Models/Notifications/Step.cs index c09652a..bb5f1a9 100644 --- a/src/Novu/Models/Notifications/Step.cs +++ b/src/Novu.Domain/Models/Notifications/Step.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Step { diff --git a/src/Novu/Models/Notifications/Subscriber.cs b/src/Novu.Domain/Models/Notifications/Subscriber.cs similarity index 91% rename from src/Novu/Models/Notifications/Subscriber.cs rename to src/Novu.Domain/Models/Notifications/Subscriber.cs index cd5e1c2..e001e56 100644 --- a/src/Novu/Models/Notifications/Subscriber.cs +++ b/src/Novu.Domain/Models/Notifications/Subscriber.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Subscriber { diff --git a/src/Novu/Models/Notifications/Template.cs b/src/Novu.Domain/Models/Notifications/Template.cs similarity index 96% rename from src/Novu/Models/Notifications/Template.cs rename to src/Novu.Domain/Models/Notifications/Template.cs index 83995d4..15ddee9 100644 --- a/src/Novu/Models/Notifications/Template.cs +++ b/src/Novu.Domain/Models/Notifications/Template.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Template { diff --git a/src/Novu/Models/Notifications/Timed.cs b/src/Novu.Domain/Models/Notifications/Timed.cs similarity index 81% rename from src/Novu/Models/Notifications/Timed.cs rename to src/Novu.Domain/Models/Notifications/Timed.cs index e701fe0..7512da8 100644 --- a/src/Novu/Models/Notifications/Timed.cs +++ b/src/Novu.Domain/Models/Notifications/Timed.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Timed { diff --git a/src/Novu/Models/Notifications/To.cs b/src/Novu.Domain/Models/Notifications/To.cs similarity index 73% rename from src/Novu/Models/Notifications/To.cs rename to src/Novu.Domain/Models/Notifications/To.cs index b80f2c4..3f7cd26 100644 --- a/src/Novu/Models/Notifications/To.cs +++ b/src/Novu.Domain/Models/Notifications/To.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class To { diff --git a/src/Novu/Models/Notifications/Trigger.cs b/src/Novu.Domain/Models/Notifications/Trigger.cs similarity index 80% rename from src/Novu/Models/Notifications/Trigger.cs rename to src/Novu.Domain/Models/Notifications/Trigger.cs index 0fef284..eb90c5a 100644 --- a/src/Novu/Models/Notifications/Trigger.cs +++ b/src/Novu.Domain/Models/Notifications/Trigger.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using Novu.Models.Workflows.Trigger; +using Novu.Domain.Models.Workflows.Trigger; -namespace Novu.Models.Notifications; +namespace Novu.Domain.Models.Notifications; public class Trigger { diff --git a/src/Novu/DTO/AcknowledgeData.cs b/src/Novu.Domain/Models/NovuAcknowledgeData.cs similarity index 72% rename from src/Novu/DTO/AcknowledgeData.cs rename to src/Novu.Domain/Models/NovuAcknowledgeData.cs index fdc33ba..aa1b9e2 100644 --- a/src/Novu/DTO/AcknowledgeData.cs +++ b/src/Novu.Domain/Models/NovuAcknowledgeData.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; -namespace Novu.DTO; +namespace Novu.Domain.Models; -public class AcknowledgeData +public class NovuAcknowledgeData { [JsonProperty("acknowledged")] public bool Acknowledged { get; set; } [JsonProperty("status")] public string Status { get; set; } diff --git a/src/Novu/DTO/ErrorData.cs b/src/Novu.Domain/Models/NovuErrorData.cs similarity index 93% rename from src/Novu/DTO/ErrorData.cs rename to src/Novu.Domain/Models/NovuErrorData.cs index a497b3a..c864890 100644 --- a/src/Novu/DTO/ErrorData.cs +++ b/src/Novu.Domain/Models/NovuErrorData.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; -using Novu.JsonConverters; +using Novu.Domain.JsonConverters; -namespace Novu.DTO; +namespace Novu.Domain.Models; /// /// Client errors (eg HTTP status 4xx range) return reason for failure. Particularly is @@ -12,7 +12,7 @@ namespace Novu.DTO; /// https://datatracker.ietf.org/doc/html/rfc7807 /// that Refit detects. /// -public class ErrorData +public class NovuErrorData { /// /// The actual reason for failure to start problem solving on. Sometime comes in as a string so convert to list diff --git a/src/Novu/DTO/NovuPaginatedResponse.cs b/src/Novu.Domain/Models/NovuPaginatedResponse.cs similarity index 96% rename from src/Novu/DTO/NovuPaginatedResponse.cs rename to src/Novu.Domain/Models/NovuPaginatedResponse.cs index e4281e3..579bd99 100644 --- a/src/Novu/DTO/NovuPaginatedResponse.cs +++ b/src/Novu.Domain/Models/NovuPaginatedResponse.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Interfaces; -namespace Novu.DTO; +namespace Novu.Domain.Models; /// /// see NovuPaginatedResponse diff --git a/src/Novu/DTO/NovuResponse.cs b/src/Novu.Domain/Models/NovuResponse.cs similarity index 56% rename from src/Novu/DTO/NovuResponse.cs rename to src/Novu.Domain/Models/NovuResponse.cs index b57e793..93fb3c6 100644 --- a/src/Novu/DTO/NovuResponse.cs +++ b/src/Novu.Domain/Models/NovuResponse.cs @@ -1,3 +1,3 @@ -namespace Novu.DTO; +namespace Novu.Domain.Models; public record NovuResponse(T Data); \ No newline at end of file diff --git a/src/Novu/DTO/SucceedData.cs b/src/Novu.Domain/Models/NovuSucceedData.cs similarity index 62% rename from src/Novu/DTO/SucceedData.cs rename to src/Novu.Domain/Models/NovuSucceedData.cs index be3d9b7..6c2d2e2 100644 --- a/src/Novu/DTO/SucceedData.cs +++ b/src/Novu.Domain/Models/NovuSucceedData.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; -namespace Novu.DTO; +namespace Novu.Domain.Models; -public class SucceedData +public class NovuSucceedData { [JsonProperty("succeeded")] public string[] Succeeded { get; set; } } \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/Branding.cs b/src/Novu.Domain/Models/Organizations/Branding.cs new file mode 100644 index 0000000..8c20d80 --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/Branding.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Novu.Domain.Models.Organizations; + +public class Branding +{ + [JsonProperty("direction")] + [JsonConverter(typeof(StringEnumConverter))] + public DirectionEnum DirectionEnum { get; set; } + + [JsonProperty("logo")] + [Required(AllowEmptyStrings = true)] + public string Logo { get; set; } + + [JsonProperty("color")] + [Required(AllowEmptyStrings = true)] + public string Color { get; set; } + + [JsonProperty("fontColor")] + [Required(AllowEmptyStrings = true)] + public string FontColor { get; set; } + + [JsonProperty("contentBackground")] + [Required(AllowEmptyStrings = true)] + public string ContentBackground { get; set; } + + [JsonProperty("fontFamily")] public string FontFamily { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/BrandingEditData.cs b/src/Novu.Domain/Models/Organizations/BrandingEditData.cs new file mode 100644 index 0000000..531e49e --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/BrandingEditData.cs @@ -0,0 +1,29 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Organizations; + +public class BrandingEditData +{ + // [JsonProperty("direction")] + // [JsonConverter(typeof(StringEnumConverter))] + // public DirectionEnum DirectionEnum { get; set; } + + [JsonProperty("logo")] + [Required(AllowEmptyStrings = true)] + public string Logo { get; set; } + + [JsonProperty("color")] + [Required(AllowEmptyStrings = true)] + public string Color { get; set; } + + [JsonProperty("fontColor")] + [Required(AllowEmptyStrings = true)] + public string FontColor { get; set; } + + [JsonProperty("contentBackground")] + [Required(AllowEmptyStrings = true)] + public string ContentBackground { get; set; } + + [JsonProperty("fontFamily")] public string FontFamily { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/DirectionEnum.cs b/src/Novu.Domain/Models/Organizations/DirectionEnum.cs new file mode 100644 index 0000000..434ddc0 --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/DirectionEnum.cs @@ -0,0 +1,10 @@ +using System.Runtime.Serialization; + +namespace Novu.Domain.Models.Organizations; + +public enum DirectionEnum +{ + [EnumMember(Value = @"ltr")] Ltr = 0, + + [EnumMember(Value = @"trl")] Trl = 1, +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/JobTitleEnum.cs b/src/Novu.Domain/Models/Organizations/JobTitleEnum.cs new file mode 100644 index 0000000..4f3f87a --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/JobTitleEnum.cs @@ -0,0 +1,20 @@ +using System.Runtime.Serialization; + +namespace Novu.Domain.Models.Organizations; + +public enum JobTitleEnum +{ + [EnumMember(Value = @"engineer")] Engineer = 0, + + [EnumMember(Value = @"engineering_manager")] + EngineeringManager = 1, + + [EnumMember(Value = @"architect")] Architect = 2, + + [EnumMember(Value = @"product_manager")] + ProductManager = 3, + + [EnumMember(Value = @"designer")] Designer = 4, + + [EnumMember(Value = @"other")] Other = 5, +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/Member.cs b/src/Novu.Domain/Models/Organizations/Member.cs new file mode 100644 index 0000000..a138c19 --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/Member.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Novu.Domain.Models.Organizations; + +public class Member +{ + [JsonProperty("_id")] + [Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonProperty("_userId")] + [Required(AllowEmptyStrings = true)] + public string UserId { get; set; } + + [JsonProperty("user")] public MemberUser MemberUser { get; set; } + + [JsonProperty("roles")] + public ICollection Roles { get; set; } + + [JsonProperty("invite")] public MemberInvite Invite { get; set; } + + [JsonProperty("memberStatus")] + [JsonConverter(typeof(StringEnumConverter))] + public MemberStatusEnum MemberStatusEnum { get; set; } + + [JsonProperty("_organizationId")] + [Required(AllowEmptyStrings = true)] + public string OrganizationId { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/MemberInvite.cs b/src/Novu.Domain/Models/Organizations/MemberInvite.cs new file mode 100644 index 0000000..2b8c1a4 --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/MemberInvite.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Organizations; + +public class MemberInvite +{ + [JsonProperty("email")] + [Required(AllowEmptyStrings = true)] + public string Email { get; set; } + + [JsonProperty("token")] + [Required(AllowEmptyStrings = true)] + public string Token { get; set; } + + [JsonProperty("invitationDate")] + [Required(AllowEmptyStrings = true)] + public DateTimeOffset InvitationDate { get; set; } + + [JsonProperty("answerDate")] public DateTimeOffset AnswerDate { get; set; } + + [JsonProperty("_inviterId")] + [Required(AllowEmptyStrings = true)] + public string InviterId { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/MemberRoleEnum.cs b/src/Novu.Domain/Models/Organizations/MemberRoleEnum.cs new file mode 100644 index 0000000..b8be23f --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/MemberRoleEnum.cs @@ -0,0 +1,12 @@ +using System.Runtime.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Novu.Domain.Models.Organizations; + +[JsonConverter(typeof(StringEnumConverter))] +public enum MemberRoleEnum +{ + [EnumMember(Value = @"admin")] Admin = 0, + [EnumMember(Value = @"member")] Member = 1, +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/MemberStatusEnum.cs b/src/Novu.Domain/Models/Organizations/MemberStatusEnum.cs new file mode 100644 index 0000000..e269d76 --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/MemberStatusEnum.cs @@ -0,0 +1,12 @@ +using System.Runtime.Serialization; + +namespace Novu.Domain.Models.Organizations; + +public enum MemberStatusEnum +{ + [EnumMember(Value = @"new")] New = 0, + + [EnumMember(Value = @"active")] Active = 1, + + [EnumMember(Value = @"invited")] Invited = 2, +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/MemberUser.cs b/src/Novu.Domain/Models/Organizations/MemberUser.cs new file mode 100644 index 0000000..f7880cf --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/MemberUser.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Organizations; + +public class MemberUser +{ + [JsonProperty("_id")] + [Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonProperty("firstName")] + [Required(AllowEmptyStrings = true)] + public string FirstName { get; set; } + + [JsonProperty("lastName")] + [Required(AllowEmptyStrings = true)] + public string LastName { get; set; } + + [JsonProperty("email")] + [Required(AllowEmptyStrings = true)] + public string Email { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/Organization.cs b/src/Novu.Domain/Models/Organizations/Organization.cs new file mode 100644 index 0000000..c5031ed --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/Organization.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Organizations; + +public class Organization +{ + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonProperty("logo")] public string Logo { get; set; } + + [JsonProperty("branding")] [Required] public Branding Branding { get; set; } = new(); + + [JsonProperty("partnerConfigurations")] + public ICollection PartnerConfigurations { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/OrganizationCreateData.cs b/src/Novu.Domain/Models/Organizations/OrganizationCreateData.cs new file mode 100644 index 0000000..11b128e --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/OrganizationCreateData.cs @@ -0,0 +1,22 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Novu.Domain.Models.Organizations; + +public class OrganizationCreateData +{ + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonProperty("logo")] public string Logo { get; set; } + + [JsonProperty("jobTitle")] + [JsonConverter(typeof(StringEnumConverter))] + public JobTitleEnum JobTitleEnum { get; set; } + + [JsonProperty("domain")] public string Domain { get; set; } + + [JsonProperty("productUseCases")] public object ProductUseCases { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/OrganizationEditData.cs b/src/Novu.Domain/Models/Organizations/OrganizationEditData.cs new file mode 100644 index 0000000..523f5ad --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/OrganizationEditData.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Organizations; + +public class OrganizationEditData +{ + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/OrganizationNameOnly.cs b/src/Novu.Domain/Models/Organizations/OrganizationNameOnly.cs new file mode 100644 index 0000000..9a59adc --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/OrganizationNameOnly.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Organizations; + +public class OrganizationNameOnly +{ + [JsonProperty("name")] + [Required(AllowEmptyStrings = true)] + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/PartnerConfiguration.cs b/src/Novu.Domain/Models/Organizations/PartnerConfiguration.cs new file mode 100644 index 0000000..4baad1a --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/PartnerConfiguration.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Novu.Domain.Models.Organizations; + +public class PartnerConfiguration +{ + [JsonProperty("projectIds")] public ICollection ProjectIds { get; set; } + + [JsonProperty("accessToken")] + [Required(AllowEmptyStrings = true)] + public string AccessToken { get; set; } + + [JsonProperty("configurationId")] + [Required(AllowEmptyStrings = true)] + public string ConfigurationId { get; set; } + + [JsonProperty("teamId")] public string TeamId { get; set; } + + [JsonProperty("partnerType")] + [Required(AllowEmptyStrings = true)] + [JsonConverter(typeof(StringEnumConverter))] + public PartnerTypeEnum PartnerTypeEnum { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Organizations/PartnerTypeEnum.cs b/src/Novu.Domain/Models/Organizations/PartnerTypeEnum.cs new file mode 100644 index 0000000..90a9c9a --- /dev/null +++ b/src/Novu.Domain/Models/Organizations/PartnerTypeEnum.cs @@ -0,0 +1,8 @@ +using System.Runtime.Serialization; + +namespace Novu.Domain.Models.Organizations; + +public enum PartnerTypeEnum +{ + [EnumMember(Value = @"vercel")] Vercel = 0, +} \ No newline at end of file diff --git a/src/Novu/Models/Subscribers/AdditionalData.cs b/src/Novu.Domain/Models/Subscribers/AdditionalData.cs similarity index 80% rename from src/Novu/Models/Subscribers/AdditionalData.cs rename to src/Novu.Domain/Models/Subscribers/AdditionalData.cs index 2c1f20c..9b0a8f5 100644 --- a/src/Novu/Models/Subscribers/AdditionalData.cs +++ b/src/Novu.Domain/Models/Subscribers/AdditionalData.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Subscribers; +namespace Novu.Domain.Models.Subscribers; public class AdditionalData { diff --git a/src/Novu/DTO/Subscribers/Notifications/NotificationCount.cs b/src/Novu.Domain/Models/Subscribers/Notifications/NotificationCount.cs similarity index 67% rename from src/Novu/DTO/Subscribers/Notifications/NotificationCount.cs rename to src/Novu.Domain/Models/Subscribers/Notifications/NotificationCount.cs index 5a38f1a..07d39eb 100644 --- a/src/Novu/DTO/Subscribers/Notifications/NotificationCount.cs +++ b/src/Novu.Domain/Models/Subscribers/Notifications/NotificationCount.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Subscribers.Notifications; +namespace Novu.Domain.Models.Subscribers.Notifications; public class NotificationCount { diff --git a/src/Novu/Models/Subscribers/Preferences/Channel.cs b/src/Novu.Domain/Models/Subscribers/Preferences/Channel.cs similarity index 83% rename from src/Novu/Models/Subscribers/Preferences/Channel.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/Channel.cs index 2b33471..dd9fdb6 100644 --- a/src/Novu/Models/Subscribers/Preferences/Channel.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/Channel.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class Channel { diff --git a/src/Novu/Models/Subscribers/Preferences/ChannelTypeEnum.cs b/src/Novu.Domain/Models/Subscribers/Preferences/ChannelTypeEnum.cs similarity index 87% rename from src/Novu/Models/Subscribers/Preferences/ChannelTypeEnum.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/ChannelTypeEnum.cs index 20b0ae8..a629874 100644 --- a/src/Novu/Models/Subscribers/Preferences/ChannelTypeEnum.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/ChannelTypeEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; [JsonConverter(typeof(StringEnumConverter))] public enum ChannelTypeEnum diff --git a/src/Novu/Models/Subscribers/Preferences/Channels.cs b/src/Novu.Domain/Models/Subscribers/Preferences/Channels.cs similarity index 86% rename from src/Novu/Models/Subscribers/Preferences/Channels.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/Channels.cs index 89533c1..57815d9 100644 --- a/src/Novu/Models/Subscribers/Preferences/Channels.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/Channels.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class Channels { diff --git a/src/Novu/Models/Subscribers/Preferences/Override.cs b/src/Novu.Domain/Models/Subscribers/Preferences/Override.cs similarity index 77% rename from src/Novu/Models/Subscribers/Preferences/Override.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/Override.cs index 7e8ce4f..fadb5fc 100644 --- a/src/Novu/Models/Subscribers/Preferences/Override.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/Override.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class Override { diff --git a/src/Novu/Models/Subscribers/Preferences/Preference.cs b/src/Novu.Domain/Models/Subscribers/Preferences/Preference.cs similarity index 83% rename from src/Novu/Models/Subscribers/Preferences/Preference.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/Preference.cs index 34504c0..8160ed5 100644 --- a/src/Novu/Models/Subscribers/Preferences/Preference.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/Preference.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class Preference { diff --git a/src/Novu/DTO/Subscribers/Preferences/SubscriberPreference.cs b/src/Novu.Domain/Models/Subscribers/Preferences/SubscriberPreference.cs similarity index 70% rename from src/Novu/DTO/Subscribers/Preferences/SubscriberPreference.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/SubscriberPreference.cs index 8924e37..4fc26e5 100644 --- a/src/Novu/DTO/Subscribers/Preferences/SubscriberPreference.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/SubscriberPreference.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Subscribers.Preferences; -namespace Novu.DTO.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class SubscriberPreference { diff --git a/src/Novu/DTO/Subscribers/Preferences/SubscriberPreferenceEditData.cs b/src/Novu.Domain/Models/Subscribers/Preferences/SubscriberPreferenceEditData.cs similarity index 61% rename from src/Novu/DTO/Subscribers/Preferences/SubscriberPreferenceEditData.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/SubscriberPreferenceEditData.cs index 52a8895..2325d52 100644 --- a/src/Novu/DTO/Subscribers/Preferences/SubscriberPreferenceEditData.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/SubscriberPreferenceEditData.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Subscribers.Preferences; -namespace Novu.DTO.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class SubscriberPreferenceEditData { diff --git a/src/Novu/Models/Subscribers/Preferences/Template.cs b/src/Novu.Domain/Models/Subscribers/Preferences/Template.cs similarity index 81% rename from src/Novu/Models/Subscribers/Preferences/Template.cs rename to src/Novu.Domain/Models/Subscribers/Preferences/Template.cs index b684a3e..7d6fdde 100644 --- a/src/Novu/Models/Subscribers/Preferences/Template.cs +++ b/src/Novu.Domain/Models/Subscribers/Preferences/Template.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Subscribers.Preferences; +namespace Novu.Domain.Models.Subscribers.Preferences; public class Template { diff --git a/src/Novu/DTO/Subscribers/Subscriber.cs b/src/Novu.Domain/Models/Subscribers/Subscriber.cs similarity index 95% rename from src/Novu/DTO/Subscribers/Subscriber.cs rename to src/Novu.Domain/Models/Subscribers/Subscriber.cs index 39bc6c5..0295044 100644 --- a/src/Novu/DTO/Subscribers/Subscriber.cs +++ b/src/Novu.Domain/Models/Subscribers/Subscriber.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Subscribers; -namespace Novu.DTO.Subscribers; +namespace Novu.Domain.Models.Subscribers; public class Subscriber { diff --git a/src/Novu/DTO/Subscribers/SubscriberCreateData.cs b/src/Novu.Domain/Models/Subscribers/SubscriberCreateData.cs similarity index 90% rename from src/Novu/DTO/Subscribers/SubscriberCreateData.cs rename to src/Novu.Domain/Models/Subscribers/SubscriberCreateData.cs index d20df45..03c15cd 100644 --- a/src/Novu/DTO/Subscribers/SubscriberCreateData.cs +++ b/src/Novu.Domain/Models/Subscribers/SubscriberCreateData.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Subscribers; -namespace Novu.DTO.Subscribers; +namespace Novu.Domain.Models.Subscribers; public class SubscriberCreateData { diff --git a/src/Novu/DTO/Subscribers/SubscriberEditData.cs b/src/Novu.Domain/Models/Subscribers/SubscriberEditData.cs similarity index 95% rename from src/Novu/DTO/Subscribers/SubscriberEditData.cs rename to src/Novu.Domain/Models/Subscribers/SubscriberEditData.cs index 681f0d0..d7c889f 100644 --- a/src/Novu/DTO/Subscribers/SubscriberEditData.cs +++ b/src/Novu.Domain/Models/Subscribers/SubscriberEditData.cs @@ -1,7 +1,6 @@ using Newtonsoft.Json; -using Novu.Models.Subscribers; -namespace Novu.DTO.Subscribers; +namespace Novu.Domain.Models.Subscribers; public class SubscriberEditData { diff --git a/src/Novu/DTO/Subscribers/SubscriberOnlineEditData.cs b/src/Novu.Domain/Models/Subscribers/SubscriberOnlineEditData.cs similarity index 76% rename from src/Novu/DTO/Subscribers/SubscriberOnlineEditData.cs rename to src/Novu.Domain/Models/Subscribers/SubscriberOnlineEditData.cs index 15c3fc4..3cd163b 100644 --- a/src/Novu/DTO/Subscribers/SubscriberOnlineEditData.cs +++ b/src/Novu.Domain/Models/Subscribers/SubscriberOnlineEditData.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Subscribers; +namespace Novu.Domain.Models.Subscribers; public class SubscriberOnlineEditData { diff --git a/src/Novu.Domain/Models/Tenants/Tenant.cs b/src/Novu.Domain/Models/Tenants/Tenant.cs new file mode 100644 index 0000000..02026f5 --- /dev/null +++ b/src/Novu.Domain/Models/Tenants/Tenant.cs @@ -0,0 +1,31 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Tenants; + +public class Tenant +{ + [JsonProperty("_id")] + [Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonProperty("identifier")] + [Required(AllowEmptyStrings = true)] + public string Identifier { get; set; } + + [JsonProperty("name")] public string Name { get; set; } + + //[JsonProperty("data")] public object Data { get; set; } + + [JsonProperty("_environmentId")] + [Required(AllowEmptyStrings = true)] + public string EnvironmentId { get; set; } + + [JsonProperty("createdAt")] + [Required(AllowEmptyStrings = true)] + public string CreatedAt { get; set; } + + [JsonProperty("updatedAt")] + [Required(AllowEmptyStrings = true)] + public string UpdatedAt { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Tenants/TopicCreateData.cs b/src/Novu.Domain/Models/Tenants/TopicCreateData.cs new file mode 100644 index 0000000..753dc39 --- /dev/null +++ b/src/Novu.Domain/Models/Tenants/TopicCreateData.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Tenants; + +public class TenantCreateData +{ + [JsonProperty("identifier")] + [Required(AllowEmptyStrings = true)] + public string Identifier { get; set; } + + [JsonProperty("name")] public string Name { get; set; } + + [JsonProperty("data")] public object Data { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/Tenants/TopicEditData.cs b/src/Novu.Domain/Models/Tenants/TopicEditData.cs new file mode 100644 index 0000000..1b59acb --- /dev/null +++ b/src/Novu.Domain/Models/Tenants/TopicEditData.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; + +namespace Novu.Domain.Models.Tenants; + +public class TenantEditData +{ + [JsonProperty("identifier")] + [Required(AllowEmptyStrings = true)] + public string Identifier { get; set; } + + [JsonProperty("name")] public string Name { get; set; } + + [JsonProperty("data")] public object Data { get; set; } +} \ No newline at end of file diff --git a/src/Novu/DTO/Topics/Topic.cs b/src/Novu.Domain/Models/Topics/Topic.cs similarity index 92% rename from src/Novu/DTO/Topics/Topic.cs rename to src/Novu.Domain/Models/Topics/Topic.cs index f4914ba..6f45ab0 100644 --- a/src/Novu/DTO/Topics/Topic.cs +++ b/src/Novu.Domain/Models/Topics/Topic.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Topics; +namespace Novu.Domain.Models.Topics; public class Topic { diff --git a/src/Novu/DTO/Topics/TopicCreateData.cs b/src/Novu.Domain/Models/Topics/TopicCreateData.cs similarity index 92% rename from src/Novu/DTO/Topics/TopicCreateData.cs rename to src/Novu.Domain/Models/Topics/TopicCreateData.cs index ea3270d..fa04ac4 100644 --- a/src/Novu/DTO/Topics/TopicCreateData.cs +++ b/src/Novu.Domain/Models/Topics/TopicCreateData.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Topics; +namespace Novu.Domain.Models.Topics; public class TopicCreateData { diff --git a/src/Novu/DTO/Topics/TopicEditData.cs b/src/Novu.Domain/Models/Topics/TopicEditData.cs similarity index 79% rename from src/Novu/DTO/Topics/TopicEditData.cs rename to src/Novu.Domain/Models/Topics/TopicEditData.cs index 063b26b..45a0487 100644 --- a/src/Novu/DTO/Topics/TopicEditData.cs +++ b/src/Novu.Domain/Models/Topics/TopicEditData.cs @@ -1,4 +1,4 @@ -namespace Novu.DTO.Topics; +namespace Novu.Domain.Models.Topics; /// /// Rename Topic Request diff --git a/src/Novu/DTO/Topics/TopicSubscriber.cs b/src/Novu.Domain/Models/Topics/TopicSubscriber.cs similarity index 95% rename from src/Novu/DTO/Topics/TopicSubscriber.cs rename to src/Novu.Domain/Models/Topics/TopicSubscriber.cs index d5f7864..2a79b38 100644 --- a/src/Novu/DTO/Topics/TopicSubscriber.cs +++ b/src/Novu.Domain/Models/Topics/TopicSubscriber.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Topics; +namespace Novu.Domain.Models.Topics; public class TopicSubscriber { diff --git a/src/Novu/DTO/Topics/TopicSubscriberCreateData.cs b/src/Novu.Domain/Models/Topics/TopicSubscriberCreateData.cs similarity index 86% rename from src/Novu/DTO/Topics/TopicSubscriberCreateData.cs rename to src/Novu.Domain/Models/Topics/TopicSubscriberCreateData.cs index 2e43f67..d9fc969 100644 --- a/src/Novu/DTO/Topics/TopicSubscriberCreateData.cs +++ b/src/Novu.Domain/Models/Topics/TopicSubscriberCreateData.cs @@ -1,4 +1,4 @@ -namespace Novu.DTO.Topics; +namespace Novu.Domain.Models.Topics; /// /// List of subscribers to be added or removed from the Topic. diff --git a/src/Novu/Models/Triggers/Actor.cs b/src/Novu.Domain/Models/Triggers/Actor.cs similarity index 75% rename from src/Novu/Models/Triggers/Actor.cs rename to src/Novu.Domain/Models/Triggers/Actor.cs index 5ce0e06..4ea9c35 100644 --- a/src/Novu/Models/Triggers/Actor.cs +++ b/src/Novu.Domain/Models/Triggers/Actor.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Triggers; +namespace Novu.Domain.Models.Triggers; public class Actor { diff --git a/src/Novu/Models/Triggers/TopicTrigger.cs b/src/Novu.Domain/Models/Triggers/TopicTrigger.cs similarity index 84% rename from src/Novu/Models/Triggers/TopicTrigger.cs rename to src/Novu.Domain/Models/Triggers/TopicTrigger.cs index a2255cc..9f4958b 100644 --- a/src/Novu/Models/Triggers/TopicTrigger.cs +++ b/src/Novu.Domain/Models/Triggers/TopicTrigger.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Novu.Models.Workflows.Trigger; +using Novu.Domain.Models.Workflows.Trigger; -namespace Novu.Models.Triggers; +namespace Novu.Domain.Models.Triggers; public class TopicTrigger { diff --git a/src/Novu/DTO/WorkflowGroups/WorkflowGroup.cs b/src/Novu.Domain/Models/WorkflowGroups/WorkflowGroup.cs similarity index 90% rename from src/Novu/DTO/WorkflowGroups/WorkflowGroup.cs rename to src/Novu.Domain/Models/WorkflowGroups/WorkflowGroup.cs index 24aac7a..4be1745 100644 --- a/src/Novu/DTO/WorkflowGroups/WorkflowGroup.cs +++ b/src/Novu.Domain/Models/WorkflowGroups/WorkflowGroup.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.WorkflowGroups; +namespace Novu.Domain.Models.WorkflowGroups; public class WorkflowGroup { diff --git a/src/Novu/DTO/WorkflowGroups/WorkflowGroupCreateData.cs b/src/Novu.Domain/Models/WorkflowGroups/WorkflowGroupCreateData.cs similarity index 72% rename from src/Novu/DTO/WorkflowGroups/WorkflowGroupCreateData.cs rename to src/Novu.Domain/Models/WorkflowGroups/WorkflowGroupCreateData.cs index 1b2d283..70b6131 100644 --- a/src/Novu/DTO/WorkflowGroups/WorkflowGroupCreateData.cs +++ b/src/Novu.Domain/Models/WorkflowGroups/WorkflowGroupCreateData.cs @@ -1,6 +1,6 @@  using Newtonsoft.Json; - namespace Novu.DTO.WorkflowGroups; + namespace Novu.Domain.Models.WorkflowGroups; public class WorkflowGroupCreateData { diff --git a/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverride.cs b/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverride.cs new file mode 100644 index 0000000..ebb9ee4 --- /dev/null +++ b/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverride.cs @@ -0,0 +1,48 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Novu.Domain.Models.Workflows; + +namespace Novu.Domain.Models.WorkflowOverrides; + +public class WorkflowOverride +{ + [JsonProperty("_id")] + [Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonProperty("_organizationId")] + [Required(AllowEmptyStrings = true)] + public string OrganizationId { get; set; } + + [JsonProperty("_environmentId")] + [Required(AllowEmptyStrings = true)] + public string EnvironmentId { get; set; } + + [JsonProperty("_workflowId")] + [Required(AllowEmptyStrings = true)] + public string WorkflowId { get; set; } + + [JsonProperty("_tenantId")] + [Required(AllowEmptyStrings = true)] + public string TenantId { get; set; } + + [JsonProperty("active")] public bool Active { get; set; } + + [JsonProperty("preferenceSettings")] + [Required] + public PreferenceChannels PreferenceSettings { get; set; } = new(); + + [JsonProperty("deleted")] public bool Deleted { get; set; } + + [JsonProperty("deletedAt")] public string DeletedAt { get; set; } + + [JsonProperty("deletedBy")] public string DeletedBy { get; set; } + + [JsonProperty("createdAt")] + [Required(AllowEmptyStrings = true)] + public string CreatedAt { get; set; } + + [JsonProperty("updatedAt")] + [Required(AllowEmptyStrings = true)] + public string UpdatedAt { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverrideCreateData.cs b/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverrideCreateData.cs new file mode 100644 index 0000000..3978ecb --- /dev/null +++ b/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverrideCreateData.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; +using Newtonsoft.Json; +using Novu.Domain.Models.Workflows; + +namespace Novu.Domain.Models.WorkflowOverrides; + +public class WorkflowOverrideCreateData +{ + + [JsonProperty("workflowId")] + [Required(AllowEmptyStrings = true)] + public string WorkflowId { get; set; } + + [JsonProperty("tenantId")] + [Required(AllowEmptyStrings = true)] + public string TenantId { get; set; } + + [JsonProperty("active")] public bool Active { get; set; } + + [JsonProperty("preferenceSettings")] public PreferenceChannels PreferenceSettings { get; set; } +} \ No newline at end of file diff --git a/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverrideEditData.cs b/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverrideEditData.cs new file mode 100644 index 0000000..d9385e6 --- /dev/null +++ b/src/Novu.Domain/Models/WorkflowOverrides/WorkflowOverrideEditData.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; +using Novu.Domain.Models.Workflows; + +namespace Novu.Domain.Models.WorkflowOverrides; + +public class WorkflowOverrideEditData +{ + [JsonProperty("active")] public bool Active { get; set; } + [JsonProperty("preferenceSettings")] public PreferenceChannels PreferenceSettings { get; set; } +} \ No newline at end of file diff --git a/src/Novu/Models/Workflows/Child.cs b/src/Novu.Domain/Models/Workflows/Child.cs similarity index 88% rename from src/Novu/Models/Workflows/Child.cs rename to src/Novu.Domain/Models/Workflows/Child.cs index c0a4e47..4187e20 100644 --- a/src/Novu/Models/Workflows/Child.cs +++ b/src/Novu.Domain/Models/Workflows/Child.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows; +namespace Novu.Domain.Models.Workflows; public class Child { diff --git a/src/Novu/Models/Workflows/Filter.cs b/src/Novu.Domain/Models/Workflows/Filter.cs similarity index 88% rename from src/Novu/Models/Workflows/Filter.cs rename to src/Novu.Domain/Models/Workflows/Filter.cs index 2b72a27..d21a61d 100644 --- a/src/Novu/Models/Workflows/Filter.cs +++ b/src/Novu.Domain/Models/Workflows/Filter.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows; +namespace Novu.Domain.Models.Workflows; public class Filter { diff --git a/src/Novu/Models/Workflows/PreferenceChannels.cs b/src/Novu.Domain/Models/Workflows/PreferenceChannels.cs similarity index 92% rename from src/Novu/Models/Workflows/PreferenceChannels.cs rename to src/Novu.Domain/Models/Workflows/PreferenceChannels.cs index 8ab6088..1f76a5e 100644 --- a/src/Novu/Models/Workflows/PreferenceChannels.cs +++ b/src/Novu.Domain/Models/Workflows/PreferenceChannels.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows; +namespace Novu.Domain.Models.Workflows; /// /// Channel preference settings diff --git a/src/Novu/Models/Workflows/Step/AmountAndUnit.cs b/src/Novu.Domain/Models/Workflows/Step/AmountAndUnit.cs similarity index 90% rename from src/Novu/Models/Workflows/Step/AmountAndUnit.cs rename to src/Novu.Domain/Models/Workflows/Step/AmountAndUnit.cs index 92a489e..2deae86 100644 --- a/src/Novu/Models/Workflows/Step/AmountAndUnit.cs +++ b/src/Novu.Domain/Models/Workflows/Step/AmountAndUnit.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class AmountAndUnit { diff --git a/src/Novu/Models/Workflows/Step/ButtonTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/ButtonTypeEnum.cs similarity index 83% rename from src/Novu/Models/Workflows/Step/ButtonTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/ButtonTypeEnum.cs index 99cd432..ec8bc01 100644 --- a/src/Novu/Models/Workflows/Step/ButtonTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/ButtonTypeEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public enum ButtonTypeEnum { diff --git a/src/Novu/Models/Workflows/Step/DaysEnum.cs b/src/Novu.Domain/Models/Workflows/Step/DaysEnum.cs similarity index 91% rename from src/Novu/Models/Workflows/Step/DaysEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/DaysEnum.cs index b2b61ba..dace5bc 100644 --- a/src/Novu/Models/Workflows/Step/DaysEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DaysEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum DaysEnum diff --git a/src/Novu/Models/Workflows/Step/DelayRegularMetadata.cs b/src/Novu.Domain/Models/Workflows/Step/DelayRegularMetadata.cs similarity index 84% rename from src/Novu/Models/Workflows/Step/DelayRegularMetadata.cs rename to src/Novu.Domain/Models/Workflows/Step/DelayRegularMetadata.cs index 05e06c4..4ffb1e8 100644 --- a/src/Novu/Models/Workflows/Step/DelayRegularMetadata.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DelayRegularMetadata.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class DelayRegularMetadata : AmountAndUnit, IWorkflowMetaData { diff --git a/src/Novu/Models/Workflows/Step/DelayScheduledMetadata.cs b/src/Novu.Domain/Models/Workflows/Step/DelayScheduledMetadata.cs similarity index 91% rename from src/Novu/Models/Workflows/Step/DelayScheduledMetadata.cs rename to src/Novu.Domain/Models/Workflows/Step/DelayScheduledMetadata.cs index 8b1169a..e5f4777 100644 --- a/src/Novu/Models/Workflows/Step/DelayScheduledMetadata.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DelayScheduledMetadata.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class DelayScheduledMetadata : IWorkflowMetaData { diff --git a/src/Novu/Models/Workflows/Step/DelayTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/DelayTypeEnum.cs similarity index 85% rename from src/Novu/Models/Workflows/Step/DelayTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/DelayTypeEnum.cs index fcf277a..749fd87 100644 --- a/src/Novu/Models/Workflows/Step/DelayTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DelayTypeEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum DelayTypeEnum diff --git a/src/Novu/Models/Workflows/Step/DigestBaseMetadata.cs b/src/Novu.Domain/Models/Workflows/Step/DigestBaseMetadata.cs similarity index 76% rename from src/Novu/Models/Workflows/Step/DigestBaseMetadata.cs rename to src/Novu.Domain/Models/Workflows/Step/DigestBaseMetadata.cs index 6205103..ff3801b 100644 --- a/src/Novu/Models/Workflows/Step/DigestBaseMetadata.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DigestBaseMetadata.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class DigestBaseMetadata : AmountAndUnit { diff --git a/src/Novu/Models/Workflows/Step/DigestRegularMetadata.cs b/src/Novu.Domain/Models/Workflows/Step/DigestRegularMetadata.cs similarity index 96% rename from src/Novu/Models/Workflows/Step/DigestRegularMetadata.cs rename to src/Novu.Domain/Models/Workflows/Step/DigestRegularMetadata.cs index 0447da7..697e207 100644 --- a/src/Novu/Models/Workflows/Step/DigestRegularMetadata.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DigestRegularMetadata.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class DigestRegularMetadata : DigestBaseMetadata, IWorkflowMetaData { diff --git a/src/Novu/Models/Workflows/Step/DigestTimedMetadata.cs b/src/Novu.Domain/Models/Workflows/Step/DigestTimedMetadata.cs similarity index 89% rename from src/Novu/Models/Workflows/Step/DigestTimedMetadata.cs rename to src/Novu.Domain/Models/Workflows/Step/DigestTimedMetadata.cs index 2987996..dbce84e 100644 --- a/src/Novu/Models/Workflows/Step/DigestTimedMetadata.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DigestTimedMetadata.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class DigestTimedMetadata : DigestBaseMetadata, IWorkflowMetaData { diff --git a/src/Novu/Models/Workflows/Step/DigestTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/DigestTypeEnum.cs similarity index 87% rename from src/Novu/Models/Workflows/Step/DigestTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/DigestTypeEnum.cs index a084b77..1215d87 100644 --- a/src/Novu/Models/Workflows/Step/DigestTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/DigestTypeEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum DigestTypeEnum diff --git a/src/Novu/Models/Workflows/Step/IWorkflowMetaData.cs b/src/Novu.Domain/Models/Workflows/Step/IWorkflowMetaData.cs similarity index 65% rename from src/Novu/Models/Workflows/Step/IWorkflowMetaData.cs rename to src/Novu.Domain/Models/Workflows/Step/IWorkflowMetaData.cs index 2849960..23c077a 100644 --- a/src/Novu/Models/Workflows/Step/IWorkflowMetaData.cs +++ b/src/Novu.Domain/Models/Workflows/Step/IWorkflowMetaData.cs @@ -1,4 +1,4 @@ -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; // [JsonConverter(typeof(MetaDataConverter))] public interface IWorkflowMetaData diff --git a/src/Novu/Models/Workflows/Step/Message/Actor.cs b/src/Novu.Domain/Models/Workflows/Step/Message/Actor.cs similarity index 76% rename from src/Novu/Models/Workflows/Step/Message/Actor.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/Actor.cs index f98c68d..00d20f8 100644 --- a/src/Novu/Models/Workflows/Step/Message/Actor.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/Actor.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class Actor { diff --git a/src/Novu/Models/Workflows/Step/Message/ActorTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/Message/ActorTypeEnum.cs similarity index 87% rename from src/Novu/Models/Workflows/Step/Message/ActorTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/ActorTypeEnum.cs index 5d0811e..d46b460 100644 --- a/src/Novu/Models/Workflows/Step/Message/ActorTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/ActorTypeEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; [JsonConverter(typeof(StringEnumConverter))] public enum ActorTypeEnum diff --git a/src/Novu/Models/Workflows/Step/Message/BaseMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/BaseMessageTemplate.cs similarity index 93% rename from src/Novu/Models/Workflows/Step/Message/BaseMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/BaseMessageTemplate.cs index 3d53537..e814913 100644 --- a/src/Novu/Models/Workflows/Step/Message/BaseMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/BaseMessageTemplate.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public abstract class BaseMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/ChannelCtaTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/Message/ChannelCtaTypeEnum.cs similarity index 70% rename from src/Novu/Models/Workflows/Step/Message/ChannelCtaTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/ChannelCtaTypeEnum.cs index bf9e2c3..0ea9bae 100644 --- a/src/Novu/Models/Workflows/Step/Message/ChannelCtaTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/ChannelCtaTypeEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public enum ChannelCtaTypeEnum { diff --git a/src/Novu/Models/Workflows/Step/Message/ChatMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/ChatMessageTemplate.cs similarity index 87% rename from src/Novu/Models/Workflows/Step/Message/ChatMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/ChatMessageTemplate.cs index 8196320..1208e4d 100644 --- a/src/Novu/Models/Workflows/Step/Message/ChatMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/ChatMessageTemplate.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class ChatMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/DelayMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/DelayMessageTemplate.cs similarity index 89% rename from src/Novu/Models/Workflows/Step/Message/DelayMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/DelayMessageTemplate.cs index 9ae49d2..675b61a 100644 --- a/src/Novu/Models/Workflows/Step/Message/DelayMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/DelayMessageTemplate.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class DelayMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/DigestMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/DigestMessageTemplate.cs similarity index 89% rename from src/Novu/Models/Workflows/Step/Message/DigestMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/DigestMessageTemplate.cs index 24107d5..4736a4a 100644 --- a/src/Novu/Models/Workflows/Step/Message/DigestMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/DigestMessageTemplate.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class DigestMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/EmailBlock.cs b/src/Novu.Domain/Models/Workflows/Step/Message/EmailBlock.cs similarity index 85% rename from src/Novu/Models/Workflows/Step/Message/EmailBlock.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/EmailBlock.cs index 9e1dfb9..2b8fb30 100644 --- a/src/Novu/Models/Workflows/Step/Message/EmailBlock.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/EmailBlock.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class EmailBlock { diff --git a/src/Novu/Models/Workflows/Step/Message/EmailBlockStyle.cs b/src/Novu.Domain/Models/Workflows/Step/Message/EmailBlockStyle.cs similarity index 70% rename from src/Novu/Models/Workflows/Step/Message/EmailBlockStyle.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/EmailBlockStyle.cs index d398b50..1851c7a 100644 --- a/src/Novu/Models/Workflows/Step/Message/EmailBlockStyle.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/EmailBlockStyle.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class EmailBlockStyle { diff --git a/src/Novu/Models/Workflows/Step/Message/EmailBlockTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/Message/EmailBlockTypeEnum.cs similarity index 75% rename from src/Novu/Models/Workflows/Step/Message/EmailBlockTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/EmailBlockTypeEnum.cs index e0e2a64..f4db0ff 100644 --- a/src/Novu/Models/Workflows/Step/Message/EmailBlockTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/EmailBlockTypeEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public enum EmailBlockTypeEnum { diff --git a/src/Novu/Models/Workflows/Step/Message/EmailMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/EmailMessageTemplate.cs similarity index 90% rename from src/Novu/Models/Workflows/Step/Message/EmailMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/EmailMessageTemplate.cs index 550404e..75ba3dd 100644 --- a/src/Novu/Models/Workflows/Step/Message/EmailMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/EmailMessageTemplate.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Novu.JsonConverters; +using Novu.Domain.JsonConverters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class EmailMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/IMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/IMessageTemplate.cs similarity index 95% rename from src/Novu/Models/Workflows/Step/Message/IMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/IMessageTemplate.cs index 23b98d3..24be1c7 100644 --- a/src/Novu/Models/Workflows/Step/Message/IMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/IMessageTemplate.cs @@ -1,4 +1,4 @@ -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public interface IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/InAppMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs similarity index 89% rename from src/Novu/Models/Workflows/Step/Message/InAppMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs index 95d62e0..c129879 100644 --- a/src/Novu/Models/Workflows/Step/Message/InAppMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/InAppMessageTemplate.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Novu.JsonConverters; +using Novu.Domain.JsonConverters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class InAppMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/MessageAction.cs b/src/Novu.Domain/Models/Workflows/Step/Message/MessageAction.cs similarity index 84% rename from src/Novu/Models/Workflows/Step/Message/MessageAction.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/MessageAction.cs index 4581504..9a7f4b7 100644 --- a/src/Novu/Models/Workflows/Step/Message/MessageAction.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/MessageAction.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class MessageAction { diff --git a/src/Novu/Models/Workflows/Step/Message/MessageActionResult.cs b/src/Novu.Domain/Models/Workflows/Step/Message/MessageActionResult.cs similarity index 78% rename from src/Novu/Models/Workflows/Step/Message/MessageActionResult.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/MessageActionResult.cs index 5bcc3c4..4f2a530 100644 --- a/src/Novu/Models/Workflows/Step/Message/MessageActionResult.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/MessageActionResult.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class MessageActionResult { diff --git a/src/Novu/Models/Workflows/Step/Message/MessageActionStatusEnum.cs b/src/Novu.Domain/Models/Workflows/Step/Message/MessageActionStatusEnum.cs similarity index 76% rename from src/Novu/Models/Workflows/Step/Message/MessageActionStatusEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/MessageActionStatusEnum.cs index ed14f59..d1e09ed 100644 --- a/src/Novu/Models/Workflows/Step/Message/MessageActionStatusEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/MessageActionStatusEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public enum MessageActionStatusEnum { diff --git a/src/Novu/Models/Workflows/Step/Message/MessageCta.cs b/src/Novu.Domain/Models/Workflows/Step/Message/MessageCta.cs similarity index 83% rename from src/Novu/Models/Workflows/Step/Message/MessageCta.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/MessageCta.cs index 28d2931..d8e5585 100644 --- a/src/Novu/Models/Workflows/Step/Message/MessageCta.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/MessageCta.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class MessageCta { diff --git a/src/Novu/Models/Workflows/Step/Message/MessageCtaData.cs b/src/Novu.Domain/Models/Workflows/Step/Message/MessageCtaData.cs similarity index 67% rename from src/Novu/Models/Workflows/Step/Message/MessageCtaData.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/MessageCtaData.cs index 360053f..61d1b0a 100644 --- a/src/Novu/Models/Workflows/Step/Message/MessageCtaData.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/MessageCtaData.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class MessageCtaData { diff --git a/src/Novu/Models/Workflows/Step/Message/MessageTemplateContentType.cs b/src/Novu.Domain/Models/Workflows/Step/Message/MessageTemplateContentType.cs similarity index 77% rename from src/Novu/Models/Workflows/Step/Message/MessageTemplateContentType.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/MessageTemplateContentType.cs index 3b1a6b4..9aba7c2 100644 --- a/src/Novu/Models/Workflows/Step/Message/MessageTemplateContentType.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/MessageTemplateContentType.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public enum MessageTemplateContentType { diff --git a/src/Novu/Models/Workflows/Step/Message/PushMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/PushMessageTemplate.cs similarity index 90% rename from src/Novu/Models/Workflows/Step/Message/PushMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/PushMessageTemplate.cs index 7bd834c..f6150e1 100644 --- a/src/Novu/Models/Workflows/Step/Message/PushMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/PushMessageTemplate.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class PushMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/SmsMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/SmsMessageTemplate.cs similarity index 88% rename from src/Novu/Models/Workflows/Step/Message/SmsMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/SmsMessageTemplate.cs index c2c62de..3f86392 100644 --- a/src/Novu/Models/Workflows/Step/Message/SmsMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/SmsMessageTemplate.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -using Novu.JsonConverters; +using Novu.Domain.JsonConverters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class SmsMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/Message/TemplateVariable.cs b/src/Novu.Domain/Models/Workflows/Step/Message/TemplateVariable.cs similarity index 92% rename from src/Novu/Models/Workflows/Step/Message/TemplateVariable.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/TemplateVariable.cs index 3001836..faf6127 100644 --- a/src/Novu/Models/Workflows/Step/Message/TemplateVariable.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/TemplateVariable.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class TemplateVariable { diff --git a/src/Novu/Models/Workflows/Step/Message/TemplateVariableTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/Message/TemplateVariableTypeEnum.cs similarity index 80% rename from src/Novu/Models/Workflows/Step/Message/TemplateVariableTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/TemplateVariableTypeEnum.cs index 4e47e31..8fb7363 100644 --- a/src/Novu/Models/Workflows/Step/Message/TemplateVariableTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/TemplateVariableTypeEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public enum TemplateVariableTypeEnum { diff --git a/src/Novu/Models/Workflows/Step/Message/TextAlignEnum.cs b/src/Novu.Domain/Models/Workflows/Step/Message/TextAlignEnum.cs similarity index 79% rename from src/Novu/Models/Workflows/Step/Message/TextAlignEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/TextAlignEnum.cs index 1f24e06..28814c1 100644 --- a/src/Novu/Models/Workflows/Step/Message/TextAlignEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/TextAlignEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public enum TextAlignEnum { diff --git a/src/Novu/Models/Workflows/Step/Message/TriggerMessageTemplate.cs b/src/Novu.Domain/Models/Workflows/Step/Message/TriggerMessageTemplate.cs similarity index 87% rename from src/Novu/Models/Workflows/Step/Message/TriggerMessageTemplate.cs rename to src/Novu.Domain/Models/Workflows/Step/Message/TriggerMessageTemplate.cs index f716922..a754ed4 100644 --- a/src/Novu/Models/Workflows/Step/Message/TriggerMessageTemplate.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Message/TriggerMessageTemplate.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step.Message; +namespace Novu.Domain.Models.Workflows.Step.Message; public class TriggerMessageTemplate : BaseMessageTemplate, IMessageTemplate { diff --git a/src/Novu/Models/Workflows/Step/MonthlyTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/MonthlyTypeEnum.cs similarity index 85% rename from src/Novu/Models/Workflows/Step/MonthlyTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/MonthlyTypeEnum.cs index 5c2298a..00c20b4 100644 --- a/src/Novu/Models/Workflows/Step/MonthlyTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/MonthlyTypeEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum MonthlyTypeEnum diff --git a/src/Novu/Models/Workflows/Step/OrdinalEnum.cs b/src/Novu.Domain/Models/Workflows/Step/OrdinalEnum.cs similarity index 90% rename from src/Novu/Models/Workflows/Step/OrdinalEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/OrdinalEnum.cs index 8629b40..7f409f2 100644 --- a/src/Novu/Models/Workflows/Step/OrdinalEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/OrdinalEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum OrdinalEnum diff --git a/src/Novu/Models/Workflows/Step/OrdinalValueEnum.cs b/src/Novu.Domain/Models/Workflows/Step/OrdinalValueEnum.cs similarity index 93% rename from src/Novu/Models/Workflows/Step/OrdinalValueEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/OrdinalValueEnum.cs index 8e44fae..6e9e753 100644 --- a/src/Novu/Models/Workflows/Step/OrdinalValueEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/OrdinalValueEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum OrdinalValueEnum diff --git a/src/Novu/Models/Workflows/Step/ReplyCallback.cs b/src/Novu.Domain/Models/Workflows/Step/ReplyCallback.cs similarity index 79% rename from src/Novu/Models/Workflows/Step/ReplyCallback.cs rename to src/Novu.Domain/Models/Workflows/Step/ReplyCallback.cs index 866c411..c40f869 100644 --- a/src/Novu/Models/Workflows/Step/ReplyCallback.cs +++ b/src/Novu.Domain/Models/Workflows/Step/ReplyCallback.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class ReplyCallback { diff --git a/src/Novu/Models/Workflows/Step/Step.cs b/src/Novu.Domain/Models/Workflows/Step/Step.cs similarity index 90% rename from src/Novu/Models/Workflows/Step/Step.cs rename to src/Novu.Domain/Models/Workflows/Step/Step.cs index b90a49c..bed5488 100644 --- a/src/Novu/Models/Workflows/Step/Step.cs +++ b/src/Novu.Domain/Models/Workflows/Step/Step.cs @@ -1,8 +1,8 @@ using Newtonsoft.Json; -using Novu.JsonConverters; -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.JsonConverters; +using Novu.Domain.Models.Workflows.Step.Message; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; /// /// diff --git a/src/Novu/Models/Workflows/Step/StepTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Step/StepTypeEnum.cs similarity index 92% rename from src/Novu/Models/Workflows/Step/StepTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/StepTypeEnum.cs index 442d929..06bf5e2 100644 --- a/src/Novu/Models/Workflows/Step/StepTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/StepTypeEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum StepTypeEnum diff --git a/src/Novu/Models/Workflows/Step/TimedConfig.cs b/src/Novu.Domain/Models/Workflows/Step/TimedConfig.cs similarity index 93% rename from src/Novu/Models/Workflows/Step/TimedConfig.cs rename to src/Novu.Domain/Models/Workflows/Step/TimedConfig.cs index a215521..4653ecd 100644 --- a/src/Novu/Models/Workflows/Step/TimedConfig.cs +++ b/src/Novu.Domain/Models/Workflows/Step/TimedConfig.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; public class TimedConfig { diff --git a/src/Novu/Models/Workflows/Step/UnitEnum.cs b/src/Novu.Domain/Models/Workflows/Step/UnitEnum.cs similarity index 90% rename from src/Novu/Models/Workflows/Step/UnitEnum.cs rename to src/Novu.Domain/Models/Workflows/Step/UnitEnum.cs index 42ec8bc..3c892bf 100644 --- a/src/Novu/Models/Workflows/Step/UnitEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Step/UnitEnum.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace Novu.Models.Workflows.Step; +namespace Novu.Domain.Models.Workflows.Step; [JsonConverter(typeof(StringEnumConverter))] public enum UnitEnum diff --git a/src/Novu/Models/Workflows/Trigger/Trigger.cs b/src/Novu.Domain/Models/Workflows/Trigger/Trigger.cs similarity index 92% rename from src/Novu/Models/Workflows/Trigger/Trigger.cs rename to src/Novu.Domain/Models/Workflows/Trigger/Trigger.cs index fb75871..806bad9 100644 --- a/src/Novu/Models/Workflows/Trigger/Trigger.cs +++ b/src/Novu.Domain/Models/Workflows/Trigger/Trigger.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -namespace Novu.Models.Workflows.Trigger; +namespace Novu.Domain.Models.Workflows.Trigger; /// /// diff --git a/src/Novu/Models/Workflows/Trigger/TriggerRecipientsTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Trigger/TriggerRecipientsTypeEnum.cs similarity index 86% rename from src/Novu/Models/Workflows/Trigger/TriggerRecipientsTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Trigger/TriggerRecipientsTypeEnum.cs index aca3f3e..e00d1e6 100644 --- a/src/Novu/Models/Workflows/Trigger/TriggerRecipientsTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Trigger/TriggerRecipientsTypeEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Trigger; +namespace Novu.Domain.Models.Workflows.Trigger; /// /// see https://github.com/novuhq/novu/blob/next/libs/shared/src/types/events/index.ts#L40 diff --git a/src/Novu/Models/Workflows/Trigger/TriggerTypeEnum.cs b/src/Novu.Domain/Models/Workflows/Trigger/TriggerTypeEnum.cs similarity index 70% rename from src/Novu/Models/Workflows/Trigger/TriggerTypeEnum.cs rename to src/Novu.Domain/Models/Workflows/Trigger/TriggerTypeEnum.cs index 755b8a9..907a7e5 100644 --- a/src/Novu/Models/Workflows/Trigger/TriggerTypeEnum.cs +++ b/src/Novu.Domain/Models/Workflows/Trigger/TriggerTypeEnum.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Models.Workflows.Trigger; +namespace Novu.Domain.Models.Workflows.Trigger; public enum TriggerTypeEnum { diff --git a/src/Novu/Models/Workflows/Trigger/TriggerVariable.cs b/src/Novu.Domain/Models/Workflows/Trigger/TriggerVariable.cs similarity index 84% rename from src/Novu/Models/Workflows/Trigger/TriggerVariable.cs rename to src/Novu.Domain/Models/Workflows/Trigger/TriggerVariable.cs index 8389028..36228d3 100644 --- a/src/Novu/Models/Workflows/Trigger/TriggerVariable.cs +++ b/src/Novu.Domain/Models/Workflows/Trigger/TriggerVariable.cs @@ -1,8 +1,8 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.Models.Workflows.Step.Message; -namespace Novu.Models.Workflows.Trigger; +namespace Novu.Domain.Models.Workflows.Trigger; /// /// diff --git a/src/Novu/DTO/Workflows/Workflow.cs b/src/Novu.Domain/Models/Workflows/Workflow.cs similarity index 88% rename from src/Novu/DTO/Workflows/Workflow.cs rename to src/Novu.Domain/Models/Workflows/Workflow.cs index 3f06a5e..7dbd69c 100644 --- a/src/Novu/DTO/Workflows/Workflow.cs +++ b/src/Novu.Domain/Models/Workflows/Workflow.cs @@ -1,11 +1,8 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using Novu.DTO.WorkflowGroups; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; -using Novu.Models.Workflows.Trigger; +using Novu.Domain.Models.WorkflowGroups; -namespace Novu.DTO.Workflows; +namespace Novu.Domain.Models.Workflows; public class Workflow { @@ -46,13 +43,13 @@ public class Workflow [Required] [JsonProperty("steps", Required = Required.Always)] - public Step[] Steps { get; set; } + public Step.Step[] Steps { get; set; } /// /// Triggers are not found on the interface but exist on the instance and are not settable. /// [JsonProperty("triggers")] - public Trigger[] Triggers { get; set; } + public Trigger.Trigger[] Triggers { get; set; } [JsonProperty("deleted")] public bool Deleted { get; set; } diff --git a/src/Novu/DTO/Workflows/WorkflowCreateData.cs b/src/Novu.Domain/Models/Workflows/WorkflowCreateData.cs similarity index 90% rename from src/Novu/DTO/Workflows/WorkflowCreateData.cs rename to src/Novu.Domain/Models/Workflows/WorkflowCreateData.cs index 9badd40..485a08f 100644 --- a/src/Novu/DTO/Workflows/WorkflowCreateData.cs +++ b/src/Novu.Domain/Models/Workflows/WorkflowCreateData.cs @@ -1,10 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; -using Novu.Models.Workflows.Trigger; -namespace Novu.DTO.Workflows; +namespace Novu.Domain.Models.Workflows; public class WorkflowCreateData { @@ -31,7 +28,7 @@ public class WorkflowCreateData /// [Required] [JsonProperty("steps", Required = Required.Always)] - public Step[] Steps { get; set; } + public Step.Step[] Steps { get; set; } [JsonProperty("active")] public bool Active { get; set; } diff --git a/src/Novu/DTO/Workflows/WorkflowEditData.cs b/src/Novu.Domain/Models/Workflows/WorkflowEditData.cs similarity index 85% rename from src/Novu/DTO/Workflows/WorkflowEditData.cs rename to src/Novu.Domain/Models/Workflows/WorkflowEditData.cs index 7ad4bb7..20b2220 100644 --- a/src/Novu/DTO/Workflows/WorkflowEditData.cs +++ b/src/Novu.Domain/Models/Workflows/WorkflowEditData.cs @@ -1,10 +1,7 @@ using System.ComponentModel.DataAnnotations; using Newtonsoft.Json; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; -using Novu.Models.Workflows.Trigger; -namespace Novu.DTO.Workflows; +namespace Novu.Domain.Models.Workflows; /// /// see @@ -25,7 +22,7 @@ public class WorkflowEditData [Required] [JsonProperty("steps", Required = Required.Always)] - public Step[] Steps { get; set; } + public Step.Step[] Steps { get; set; } /// /// This is a workflow group in the api see https://docs.novu.co/api/create-workflow-group/ @@ -50,5 +47,5 @@ public class WorkflowEditData [JsonProperty("data")] public object Data { get; set; } - [JsonProperty("triggers")] public Trigger[] Triggers { get; set; } + [JsonProperty("triggers")] public Trigger.Trigger[] Triggers { get; set; } } \ No newline at end of file diff --git a/src/Novu/DTO/Workflows/WorkflowStatusEditData.cs b/src/Novu.Domain/Models/Workflows/WorkflowStatusEditData.cs similarity index 76% rename from src/Novu/DTO/Workflows/WorkflowStatusEditData.cs rename to src/Novu.Domain/Models/Workflows/WorkflowStatusEditData.cs index 2065adf..e6b2435 100644 --- a/src/Novu/DTO/Workflows/WorkflowStatusEditData.cs +++ b/src/Novu.Domain/Models/Workflows/WorkflowStatusEditData.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace Novu.DTO.Workflows; +namespace Novu.Domain.Models.Workflows; public class WorkflowStatusEditData { diff --git a/src/Novu.Domain/Novu.Domain.csproj b/src/Novu.Domain/Novu.Domain.csproj new file mode 100644 index 0000000..e5c8e08 --- /dev/null +++ b/src/Novu.Domain/Novu.Domain.csproj @@ -0,0 +1,18 @@ + + + + + netstandard2.0 + 11.0 + enable + enable + CS8604,CS8618 + Novu.Domain + + + + + + + + diff --git a/src/Novu/NovuConstants.cs b/src/Novu.Domain/NovuConstants.cs similarity index 79% rename from src/Novu/NovuConstants.cs rename to src/Novu.Domain/NovuConstants.cs index 97f3c16..df9dabb 100644 --- a/src/Novu/NovuConstants.cs +++ b/src/Novu.Domain/NovuConstants.cs @@ -1,4 +1,4 @@ -namespace Novu; +namespace Novu.Domain; public static class NovuConstants { diff --git a/src/Novu.Domain/NovuJsonSettings.cs b/src/Novu.Domain/NovuJsonSettings.cs new file mode 100644 index 0000000..881e651 --- /dev/null +++ b/src/Novu.Domain/NovuJsonSettings.cs @@ -0,0 +1,23 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; + +namespace Novu.Domain; + +public static class NovuJsonSettings +{ + public static readonly JsonSerializerSettings DefaultSerializerSettings = new() + { + MissingMemberHandling = MissingMemberHandling.Ignore, + NullValueHandling = NullValueHandling.Ignore, + ContractResolver = new DefaultContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy(), + }, + // General enum conversions are required to the in-place strings + Converters = new List + { + new StringEnumConverter(), + }, + }; +} \ No newline at end of file diff --git a/src/Novu/Utils/EnumMemberExtensions.cs b/src/Novu.Domain/Utils/EnumMemberExtensions.cs similarity index 98% rename from src/Novu/Utils/EnumMemberExtensions.cs rename to src/Novu.Domain/Utils/EnumMemberExtensions.cs index 615a89b..5adb6f2 100644 --- a/src/Novu/Utils/EnumMemberExtensions.cs +++ b/src/Novu.Domain/Utils/EnumMemberExtensions.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace Novu.Utils; +namespace Novu.Domain.Utils; public static class EnumMemberExtensions { diff --git a/src/Novu.Extensions/ApiExceptionExtensions.cs b/src/Novu.Extensions/ApiExceptionExtensions.cs index 87455f1..f61b06a 100644 --- a/src/Novu.Extensions/ApiExceptionExtensions.cs +++ b/src/Novu.Extensions/ApiExceptionExtensions.cs @@ -1,5 +1,5 @@ using Newtonsoft.Json; -using Novu.DTO; +using Novu.Domain.Models; using Refit; namespace Novu.Extensions; @@ -11,13 +11,13 @@ public static class ApiExceptionExtensions /// where Refit throws a /// see https://github.com/reactiveui/refit#handling-exceptions /// - public static ErrorData ToErrorMessage(this ApiException apiException) + public static NovuErrorData ToErrorMessage(this ApiException apiException) { switch (apiException.HasContent) { case true: { - var error = JsonConvert.DeserializeObject(apiException.Content!); + var error = JsonConvert.DeserializeObject(apiException.Content!); if (error is not null) { return error; @@ -27,6 +27,6 @@ public static ErrorData ToErrorMessage(this ApiException apiException) } } - return new ErrorData(); + return new NovuErrorData(); } } \ No newline at end of file diff --git a/src/Novu.Extensions/ConfigurationExtensions.cs b/src/Novu.Extensions/ConfigurationExtensions.cs index 3f601dc..ead8621 100644 --- a/src/Novu.Extensions/ConfigurationExtensions.cs +++ b/src/Novu.Extensions/ConfigurationExtensions.cs @@ -1,12 +1,25 @@ using System; using System.IO; using Microsoft.Extensions.Configuration; -using Novu.Models; +using Microsoft.Extensions.Hosting; namespace Novu.Extensions; public static class ConfigurationExtensions { + public static HostBuilderContext SetNovuConfiguration(this HostBuilderContext context, string environment) + { + context.Configuration = GetConfiguration(environment); + return context; + } + + public static IConfiguration GetConfiguration(string environment) + { + // set environment variable to pickup correct configuration + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", environment); + return Settings.FileName.CreateConfigurationRoot(); + } + /// /// Load up the configuration from (based on the directory) the running process /// - appsettings.json diff --git a/src/Novu.Extensions/IocNovuRegistrationExtensions.cs b/src/Novu.Extensions/IocNovuRegistrationExtensions.cs index 3931dd9..c15ce7e 100644 --- a/src/Novu.Extensions/IocNovuRegistrationExtensions.cs +++ b/src/Novu.Extensions/IocNovuRegistrationExtensions.cs @@ -2,7 +2,8 @@ using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain; using Refit; namespace Novu.Extensions; @@ -36,13 +37,23 @@ public static IServiceCollection RegisterNovuClients( services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); - services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); + services.AddRefitClient(settings).ConfigureHttpClient(configureClient); return services .AddTransient(_ => novuConfiguration); @@ -64,7 +75,7 @@ private static RefitSettings RefitSettings(RefitSettings refitSettings) { return refitSettings ?? new RefitSettings { - ContentSerializer = new NewtonsoftJsonContentSerializer(NovuClient.DefaultSerializerSettings), + ContentSerializer = new NewtonsoftJsonContentSerializer(NovuJsonSettings.DefaultSerializerSettings), }; } } \ No newline at end of file diff --git a/src/Novu.Extensions/Novu.Extensions.csproj b/src/Novu.Extensions/Novu.Extensions.csproj index 080d024..c1f96ba 100644 --- a/src/Novu.Extensions/Novu.Extensions.csproj +++ b/src/Novu.Extensions/Novu.Extensions.csproj @@ -20,13 +20,14 @@ - + + diff --git a/src/Novu.Sync/Comparers/IntegrationDetailsComparer.cs b/src/Novu.Sync/Comparers/IntegrationDetailsComparer.cs index cae0d47..1c8e42a 100644 --- a/src/Novu.Sync/Comparers/IntegrationDetailsComparer.cs +++ b/src/Novu.Sync/Comparers/IntegrationDetailsComparer.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; using Newtonsoft.Json; -using Novu.DTO.Integrations; +using Novu.Domain; +using Novu.Domain.Models.Integrations; namespace Novu.Sync.Comparers; @@ -19,8 +20,8 @@ public bool Equals(Integration x, Integration y) x.Active == y.Active && // inefficient but needing to check if the payloads are different // TODO: may want to inject serialisation setting to be consistent - JsonConvert.SerializeObject(x.Credentials, NovuClient.DefaultSerializerSettings) - .Equals(JsonConvert.SerializeObject(y.Credentials, NovuClient.DefaultSerializerSettings)); + JsonConvert.SerializeObject(x.Credentials, NovuJsonSettings.DefaultSerializerSettings) + .Equals(JsonConvert.SerializeObject(y.Credentials, NovuJsonSettings.DefaultSerializerSettings)); } public int GetHashCode(Integration obj) diff --git a/src/Novu.Sync/Comparers/IntegrationIdComparer.cs b/src/Novu.Sync/Comparers/IntegrationIdComparer.cs index 01ac9a4..22d1554 100644 --- a/src/Novu.Sync/Comparers/IntegrationIdComparer.cs +++ b/src/Novu.Sync/Comparers/IntegrationIdComparer.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Novu.DTO.Integrations; +using Novu.Domain.Models.Integrations; namespace Novu.Sync.Comparers; diff --git a/src/Novu.Sync/Comparers/LayoutDetailsComparer.cs b/src/Novu.Sync/Comparers/LayoutDetailsComparer.cs index 39d0fad..d93301b 100644 --- a/src/Novu.Sync/Comparers/LayoutDetailsComparer.cs +++ b/src/Novu.Sync/Comparers/LayoutDetailsComparer.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Novu.DTO.Layouts; +using Novu.Domain.Models.Layouts; namespace Novu.Sync.Comparers; diff --git a/src/Novu.Sync/Comparers/LayoutIdComparer.cs b/src/Novu.Sync/Comparers/LayoutIdComparer.cs index 3979003..feec866 100644 --- a/src/Novu.Sync/Comparers/LayoutIdComparer.cs +++ b/src/Novu.Sync/Comparers/LayoutIdComparer.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Novu.DTO.Layouts; +using Novu.Domain.Models.Layouts; namespace Novu.Sync.Comparers; diff --git a/src/Novu.Sync/Comparers/WorkflowDetailsComparer.cs b/src/Novu.Sync/Comparers/WorkflowDetailsComparer.cs index f52533d..b7fae3d 100644 --- a/src/Novu.Sync/Comparers/WorkflowDetailsComparer.cs +++ b/src/Novu.Sync/Comparers/WorkflowDetailsComparer.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; using Newtonsoft.Json; -using Novu.DTO.Workflows; +using Novu.Domain; +using Novu.Domain.Models.Workflows; namespace Novu.Sync.Comparers; @@ -18,10 +19,10 @@ public bool Equals(Workflow x, Workflow y) x.Description == y.Description && // inefficient but needing to check if the payloads are different // TODO: may want to inject serialisation setting to be consistent - JsonConvert.SerializeObject(x.PreferenceSettings, NovuClient.DefaultSerializerSettings) - .Equals(JsonConvert.SerializeObject(y.PreferenceSettings, NovuClient.DefaultSerializerSettings)) && - JsonConvert.SerializeObject(x.Steps, NovuClient.DefaultSerializerSettings) - .Equals(JsonConvert.SerializeObject(y.Steps, NovuClient.DefaultSerializerSettings)); + JsonConvert.SerializeObject(x.PreferenceSettings, NovuJsonSettings.DefaultSerializerSettings) + .Equals(JsonConvert.SerializeObject(y.PreferenceSettings, NovuJsonSettings.DefaultSerializerSettings)) && + JsonConvert.SerializeObject(x.Steps, NovuJsonSettings.DefaultSerializerSettings) + .Equals(JsonConvert.SerializeObject(y.Steps, NovuJsonSettings.DefaultSerializerSettings)); } public int GetHashCode(Workflow obj) diff --git a/src/Novu.Sync/Comparers/WorkflowGroupComparer.cs b/src/Novu.Sync/Comparers/WorkflowGroupComparer.cs index 8f5708a..ca3e591 100644 --- a/src/Novu.Sync/Comparers/WorkflowGroupComparer.cs +++ b/src/Novu.Sync/Comparers/WorkflowGroupComparer.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Novu.DTO.WorkflowGroups; +using Novu.Domain.Models.WorkflowGroups; namespace Novu.Sync.Comparers; diff --git a/src/Novu.Sync/Comparers/WorkflowIdComparer.cs b/src/Novu.Sync/Comparers/WorkflowIdComparer.cs index d478e83..75aa453 100644 --- a/src/Novu.Sync/Comparers/WorkflowIdComparer.cs +++ b/src/Novu.Sync/Comparers/WorkflowIdComparer.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Novu.DTO.Workflows; +using Novu.Domain.Models.Workflows; namespace Novu.Sync.Comparers; diff --git a/src/Novu.Sync/IocRegistrationExtensions.cs b/src/Novu.Sync/IocRegistrationExtensions.cs index bcd83fd..f882b1f 100644 --- a/src/Novu.Sync/IocRegistrationExtensions.cs +++ b/src/Novu.Sync/IocRegistrationExtensions.cs @@ -8,10 +8,10 @@ public static class IocRegistrationExtensions { public static IServiceCollection RegisterNovuSync(this IServiceCollection services) { - services.AddTransient, LayoutSync>(); - services.AddTransient, WorkflowGroupSync>(); - services.AddTransient, IntegrationSync>(); - services.AddTransient, WorkflowSync>(); - return services; + return services + .AddTransient, LayoutSync>() + .AddTransient, WorkflowGroupSync>() + .AddTransient, IntegrationSync>() + .AddTransient, WorkflowSync>(); } } \ No newline at end of file diff --git a/src/Novu.Sync/Models/TemplateIntegration.cs b/src/Novu.Sync/Models/TemplateIntegration.cs index f27654d..793cf2f 100644 --- a/src/Novu.Sync/Models/TemplateIntegration.cs +++ b/src/Novu.Sync/Models/TemplateIntegration.cs @@ -1,5 +1,5 @@ -using Novu.Models.Integrations; -using Novu.Models.Subscribers.Preferences; +using Novu.Domain.Models.Integrations; +using Novu.Domain.Models.Subscribers.Preferences; namespace Novu.Sync.Models; diff --git a/src/Novu.Sync/Models/TemplateLayout.cs b/src/Novu.Sync/Models/TemplateLayout.cs index 3bb585e..6d25ede 100644 --- a/src/Novu.Sync/Models/TemplateLayout.cs +++ b/src/Novu.Sync/Models/TemplateLayout.cs @@ -1,4 +1,4 @@ -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.Models.Workflows.Step.Message; namespace Novu.Sync.Models; diff --git a/src/Novu.Sync/Models/TemplateWorkflow.cs b/src/Novu.Sync/Models/TemplateWorkflow.cs index 8732a5e..ec16150 100644 --- a/src/Novu.Sync/Models/TemplateWorkflow.cs +++ b/src/Novu.Sync/Models/TemplateWorkflow.cs @@ -1,5 +1,5 @@ -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; +using Novu.Domain.Models.Workflows; +using Novu.Domain.Models.Workflows.Step; namespace Novu.Sync.Models; diff --git a/src/Novu.Sync/Novu.Sync.csproj b/src/Novu.Sync/Novu.Sync.csproj index 3ce48a1..be57584 100644 --- a/src/Novu.Sync/Novu.Sync.csproj +++ b/src/Novu.Sync/Novu.Sync.csproj @@ -23,7 +23,8 @@ - + + diff --git a/src/Novu.Sync/Services/IntegrationSync.cs b/src/Novu.Sync/Services/IntegrationSync.cs index 5a20290..ed38aea 100644 --- a/src/Novu.Sync/Services/IntegrationSync.cs +++ b/src/Novu.Sync/Services/IntegrationSync.cs @@ -2,13 +2,13 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Novu.DTO.Integrations; -using Novu.Interfaces; -using Novu.Models; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.Integrations; +using Novu.Domain.Utils; using Novu.Sync.Comparers; using Novu.Sync.Models; using Novu.Sync.Utils; -using Novu.Utils; namespace Novu.Sync.Services; diff --git a/src/Novu.Sync/Services/LayoutSync.cs b/src/Novu.Sync/Services/LayoutSync.cs index 15b4907..7308653 100644 --- a/src/Novu.Sync/Services/LayoutSync.cs +++ b/src/Novu.Sync/Services/LayoutSync.cs @@ -2,9 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Novu.DTO; -using Novu.DTO.Layouts; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain.Models.Layouts; using Novu.Sync.Comparers; using Novu.Sync.Models; using Novu.Sync.Utils; diff --git a/src/Novu.Sync/Services/WorkflowGroupSync.cs b/src/Novu.Sync/Services/WorkflowGroupSync.cs index b86e130..c8f68f6 100644 --- a/src/Novu.Sync/Services/WorkflowGroupSync.cs +++ b/src/Novu.Sync/Services/WorkflowGroupSync.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Novu.DTO.WorkflowGroups; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain.Models.WorkflowGroups; using Novu.Sync.Comparers; using Novu.Sync.Models; using Novu.Sync.Utils; diff --git a/src/Novu.Sync/Services/WorkflowSync.cs b/src/Novu.Sync/Services/WorkflowSync.cs index 8187861..f8a0170 100644 --- a/src/Novu.Sync/Services/WorkflowSync.cs +++ b/src/Novu.Sync/Services/WorkflowSync.cs @@ -2,9 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Novu.DTO; -using Novu.DTO.Workflows; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain.Models.Workflows; using Novu.Sync.Comparers; using Novu.Sync.Models; using Novu.Sync.Utils; diff --git a/src/Novu.Tests/AcceptanceTests/IntegrationTests.cs b/src/Novu.Tests/AcceptanceTests/IntegrationTests.cs index ee4243b..8f96c44 100644 --- a/src/Novu.Tests/AcceptanceTests/IntegrationTests.cs +++ b/src/Novu.Tests/AcceptanceTests/IntegrationTests.cs @@ -2,20 +2,15 @@ using System.Linq; using System.Threading.Tasks; using FluentAssertions; -using Novu.DTO.Integrations; -using Novu.Models; -using Novu.Tests.IntegrationTests; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Tests.Factories; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.AcceptanceTests; -public class IntegrationTests : BaseIntegrationTest +public class IntegrationTests(IIntegrationClient integrationClient, IntegrationFactory integrationFactory) { - public IntegrationTests(ITestOutputHelper output) : base(output) - { - } - /// /// TODO: add more integrations to this list /// TODO: have integrations as an enumeration @@ -37,7 +32,7 @@ public IntegrationTests(ITestOutputHelper output) : base(output) public async Task AcceptanceTest( string provider) { - var integrations = await Integration.Get(); + var integrations = await integrationClient.Get(); // the understanding is that providers are always unique by provider id var existingIntegration = integrations.Data.SingleOrDefault(x => x.ProviderId == provider); @@ -45,25 +40,25 @@ public async Task AcceptanceTest( if (existingIntegration is not null) { // delete and not find - await Integration.Delete(existingIntegration.Id); - var deletedIntegration = await Integration.Get(existingIntegration.Id); + await integrationClient.Delete(existingIntegration.Id); + var deletedIntegration = await integrationClient.Get(existingIntegration.Id); deletedIntegration.Data.Should().BeNull(); // now remake - var newIntegration = await Make(providerId: provider); + var newIntegration = await integrationFactory.Make(providerId: provider); newIntegration.Active.Should().BeTrue(); // reinstate the integration given this might be a working test system - await Integration.Update(newIntegration.Id, existingIntegration.ToEditData()); + await integrationClient.Update(newIntegration.Id, existingIntegration.ToEditData()); } else { // create - var integration = await Make(providerId: provider); + var integration = await integrationFactory.Make(providerId: provider); integration.Active.Should().BeTrue(); // teardown here rather than in base - await Integration.Delete(integration.Id); + await integrationClient.Delete(integration.Id); } } } \ No newline at end of file diff --git a/src/Novu.Tests/AcceptanceTests/LayoutTests.cs b/src/Novu.Tests/AcceptanceTests/LayoutTests.cs index 1040608..1f574aa 100644 --- a/src/Novu.Tests/AcceptanceTests/LayoutTests.cs +++ b/src/Novu.Tests/AcceptanceTests/LayoutTests.cs @@ -1,18 +1,13 @@ using System.Linq; using System.Threading.Tasks; using FluentAssertions; -using Novu.Tests.IntegrationTests; +using Novu.Clients; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.AcceptanceTests; -public class LayoutTests : BaseIntegrationTest +public class LayoutTests(ILayoutClient layoutClient) { - public LayoutTests(ITestOutputHelper output) : base(output) - { - } - /// /// This is a flaky test because 'default' operates globally to the application /// @@ -20,22 +15,22 @@ public LayoutTests(ITestOutputHelper output) : base(output) public async Task Should_SetStatus() { // try and find the default layout—there should be one (but still be defensive) - var layouts = await Layout.Get(); + var layouts = await layoutClient.Get(); var originalDefault = layouts.Data.SingleOrDefault(x => x.IsDefault); // now, find another layout if there is none var layout = layouts.Data.FirstOrDefault(x => !x.IsDefault); if (layout is not null) { - await Layout.SetAsDefault(layout.Id); - var result = await Layout.Get(layout.Id); + await layoutClient.SetAsDefault(layout.Id); + var result = await layoutClient.Get(layout.Id); result.Data.IsDefault.Should().BeTrue(); } // cleanup to reinstate the original if (originalDefault is not null) { - await Layout.SetAsDefault(originalDefault.Id); + await layoutClient.SetAsDefault(originalDefault.Id); } } } \ No newline at end of file diff --git a/src/Novu.Tests/AcceptanceTests/NotificationTests.cs b/src/Novu.Tests/AcceptanceTests/NotificationTests.cs index 3dd208d..8a26e5c 100644 --- a/src/Novu.Tests/AcceptanceTests/NotificationTests.cs +++ b/src/Novu.Tests/AcceptanceTests/NotificationTests.cs @@ -1,48 +1,46 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using FluentAssertions; using Newtonsoft.Json; -using Novu.DTO; -using Novu.DTO.Events; -using Novu.DTO.Integrations; -using Novu.DTO.Notifications; -using Novu.DTO.Subscribers; -using Novu.DTO.Subscribers.Preferences; -using Novu.DTO.Topics; -using Novu.DTO.WorkflowGroups; -using Novu.DTO.Workflows; -using Novu.Interfaces; -using Novu.Models; -using Novu.Models.Subscribers.Preferences; -using Novu.Models.Triggers; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; -using Novu.Models.Workflows.Step.Message; -using Novu.Tests.IntegrationTests; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.Events; +using Novu.Domain.Models.Subscribers.Preferences; +using Novu.Domain.Models.Triggers; +using Novu.Domain.Models.WorkflowGroups; +using Novu.Domain.Models.Workflows; +using Novu.Domain.Models.Workflows.Step.Message; +using Novu.QueryParams; +using Novu.Tests.Factories; using ParkSquare.Testing.Generators; using Polly; using Xunit; -using Xunit.Abstractions; using Xunit.Sdk; -using TopicCreateData = Novu.DTO.Events.TopicCreateData; +using Step = Novu.Domain.Models.Workflows.Step.Step; +using Subscriber = Novu.Domain.Models.Subscribers.Subscriber; +using TopicCreateData = Novu.Domain.Models.Events.TopicCreateData; namespace Novu.Tests.AcceptanceTests; -public class NotificationTests : BaseIntegrationTest +public class NotificationTests( + IEventClient eventClient, + TopicFactory topicFactory, + INotificationsClient notificationsClient, + ISubscriberClient subscriberClient, + WorkflowGroupFactory workflowGroupFactory, + WorkflowFactory workflowFactory, + IIntegrationClient integrationClient, + IntegrationFactory integrationFactory, + SubscriberFactory subscriberFactory) { - public NotificationTests(ITestOutputHelper output) : base(output) - { - } - [RunnableInDebugOnly] public async Task E2E_InApp_Event_Test() { var (workflow, eventName) = await MakeInAppWorkflow(); var subscriber = await MakeSubscriberOnWorkflow(workflow); - var trigger = await Event.Trigger( + var trigger = await eventClient.Trigger( new EventCreateData { EventName = eventName, @@ -62,15 +60,15 @@ public async Task E2E_InApp_Topic_Test() var subscriber = await MakeSubscriberOnWorkflow(workflow); var subscriber2 = await MakeSubscriberOnWorkflow(workflow); - var topic = await Make( + var topic = await topicFactory.Make( subscriber: subscriber, - additionalSubscribers: new List { subscriber2 }); + additionalSubscribers: [subscriber2]); - var trigger = await Event.Create( + var trigger = await eventClient.Create( new TopicCreateData { EventName = eventName, - To = new[] { new TopicTrigger(topic.Key) }, + To = [new TopicTrigger(topic.Key)], Payload = new TestMessage(), }); @@ -92,8 +90,8 @@ private async Task VerifyNotifications(Subscriber subscriber) await retryPolicy.ExecuteAsync(async () => { // check, has it arrived? - var notificationsForSubscriber = await Get() - .Get(new NotificationQueryParams { SubscriberIds = new[] { subscriber.SubscriberId } }); + var notificationsForSubscriber = await notificationsClient + .Get(new NotificationQueryParams { SubscriberIds = [subscriber.SubscriberId] }); notificationsForSubscriber .Data @@ -126,10 +124,10 @@ await retryPolicy.ExecuteAsync(async () => await retryPolicy.ExecuteAsync(async () => { - var dataCount = (await Subscriber.GetInAppUnseen(subscriber.SubscriberId!)) + var dataCount = (await subscriberClient.GetInAppUnseen(subscriber.SubscriberId!)) .Data .Count; - var inAppMessages = await Subscriber.GetInApp(subscriber.SubscriberId); + var inAppMessages = await subscriberClient.GetInApp(subscriber.SubscriberId); dataCount .Should() .Be(1); @@ -142,11 +140,11 @@ await retryPolicy.ExecuteAsync(async () => private async Task<(Workflow, string)> MakeInAppWorkflow() { - var workflowGroup = await Make(new WorkflowGroupCreateData + var workflowGroup = await workflowGroupFactory.Make(new WorkflowGroupCreateData { Name = $"End2EndGroup ({StringGenerator.SequenceOfAlphaNumerics(5)})", }); - var workflow = await Make(new WorkflowCreateData + var workflow = await workflowFactory.Make(new WorkflowCreateData { Name = $"In-App [End2end {StringGenerator.SequenceOfAlphaNumerics(10)}]", Description = StringGenerator.LoremIpsum(5), @@ -155,27 +153,27 @@ await retryPolicy.ExecuteAsync(async () => { InApp = true, }, - Steps = new Step[] - { - new() + Steps = + [ + new Step { Name = $"In-App [End2end ({StringGenerator.SequenceOfAlphaNumerics(5)})]", Template = new InAppMessageTemplate { Content = "Fantastic move! {{message}}", - Variables = new[] - { + Variables = + [ new TemplateVariable { Name = "message", Type = TemplateVariableTypeEnum.String, Required = true, }, - }, + ], }, Active = true, }, - }, + ], Active = true, }); @@ -183,18 +181,18 @@ await retryPolicy.ExecuteAsync(async () => // Now, ensure that the integration is active. Otherwise, the trigger will not deliver // but reports that the subscriber has no active integrations where they problem is that // the system has none to offer even though the subscriber has registered - var existingIntegration = (await Integration.Get()) + var existingIntegration = (await integrationClient.Get()) .Data .SingleOrDefault(x => x.ProviderId == "novu"); if (existingIntegration is not null && !existingIntegration.Active) { - await Integration.Update( + await integrationClient.Update( existingIntegration.Id, existingIntegration.ToEditData(x => x.Active = true)); } else if (existingIntegration is null) { - await Make(providerId: "novu"); + await integrationFactory.Make(providerId: "novu"); } var eventName = workflow.Triggers.FirstOrDefault()?.Identifier; @@ -203,15 +201,15 @@ await Integration.Update( private async Task MakeSubscriberOnWorkflow(Workflow workflow) { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); // update subscriber preferences - var preferences = await Subscriber.GetPreferences(subscriber.SubscriberId!); + var preferences = await subscriberClient.GetPreferences(subscriber.SubscriberId!); // enable notification var templateId = preferences.Data.Single(x => x.Template.Name == workflow.Name).Template.Id; - await Subscriber.UpdatePreference( + await subscriberClient.UpdatePreference( subscriber.SubscriberId!, templateId, new SubscriberPreferenceEditData diff --git a/src/Novu.Tests/AcceptanceTests/Startup.cs b/src/Novu.Tests/AcceptanceTests/Startup.cs new file mode 100644 index 0000000..2f6d153 --- /dev/null +++ b/src/Novu.Tests/AcceptanceTests/Startup.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Novu.Sync; + +namespace Novu.Tests.AcceptanceTests; + +/// +/// Automatically bootstrapped through Xunit lifecycle +/// see https://github.com/pengweiqhca/Xunit.DependencyInjection +/// +public class Startup +{ + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + services + .ConfigureTestServices(context) + .RegisterNovuClientsWithExceptionHandler() + // .RegisterNovuClients() + .RegisterNovuSync() + .RegisterFactories(); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/AcceptanceTests/SyncEnvironmentTests.cs b/src/Novu.Tests/AcceptanceTests/SyncEnvironmentTests.cs index cda670f..513099e 100644 --- a/src/Novu.Tests/AcceptanceTests/SyncEnvironmentTests.cs +++ b/src/Novu.Tests/AcceptanceTests/SyncEnvironmentTests.cs @@ -2,21 +2,25 @@ using System.Linq; using System.Threading.Tasks; using FluentAssertions; -using Novu.DTO.Layouts; -using Novu.Interfaces; -using Novu.Models.Integrations; -using Novu.Models.Subscribers.Preferences; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; -using Novu.Sync; +using Novu.Clients; +using Novu.Domain.Models.Integrations; +using Novu.Domain.Models.Layouts; +using Novu.Domain.Models.Subscribers.Preferences; +using Novu.Domain.Models.Workflows; +using Novu.Domain.Models.Workflows.Step; using Novu.Sync.Models; using Novu.Sync.Services; +using Novu.Tests.Factories.Models; using Novu.Tests.IntegrationTests; -using Xunit.Abstractions; namespace Novu.Tests.AcceptanceTests; -public class SyncEnvironmentTests : BaseIntegrationTest +public class SyncEnvironmentTests( + INovuSync syncWorkflow, + INovuSync syncIntegration, + INovuSync syncWorkflowGroup, + INovuSync syncLayout, + IWorkflowGroupClient workflowGroupClient) { private static readonly TemplateIntegration NovuInApp = new() { @@ -68,9 +72,6 @@ public class SyncEnvironmentTests : BaseIntegrationTest }, }; - public SyncEnvironmentTests(ITestOutputHelper output) : base(output) - { - } /// /// WARNING: this test will synchronise your entire environment (that is it will delete existing resources) @@ -78,21 +79,20 @@ public SyncEnvironmentTests(ITestOutputHelper output) : base(output) [RunnableInDebugOnly] public async Task WorkflowTest() { - DeRegisterExceptionHandler(); + // DeRegisterExceptionHandler(); - await Get>().Sync( - new[] - { - NovuInApp, + await syncIntegration.Sync( + [ + NovuInApp, CustomEmail, AmazonSnsSms, - }); + ]); // depending on environment there can hidden workflow attached to layouts that this // test will continue on if it experiences a 409 try { - await Get>().Sync( + await syncLayout.Sync( new TemplateLayout { Name = "Default Layout", @@ -106,20 +106,20 @@ await Get>().Sync( // ignored } - await Get>().Sync( + await syncWorkflowGroup.Sync( new List { new() { Name = "Default WorkflowGroup [e2e test]" }, new() { Name = "Other WorkflowGroup [e2e test]" }, }); - var workflowGroups = await Get().Get(); + var workflowGroups = await workflowGroupClient.Get(); var workflowGroup = workflowGroups?.Data?.SingleOrDefault(x => x.Name.Equals("Other WorkflowGroup [e2e test]")); workflowGroup.Should().NotBeNull(); - await Get>().Sync( + await syncWorkflow.Sync( new TemplateWorkflow { Name = "Invite (e2e)", @@ -131,8 +131,8 @@ await Get>().Sync( Sms = true, Email = true, }, - Steps = new[] - { + Steps = + [ StepFactory.InApp(true), StepFactory.Sms(true), StepFactory.DigestRegular(true), @@ -142,7 +142,7 @@ await Get>().Sync( Template = MessageTemplateFactory.EmailMessageTemplate(), Active = true, }, - }, + ], Active = true, }); } diff --git a/src/Novu.Tests/Factories/FactorySetupTeardown.cs b/src/Novu.Tests/Factories/FactorySetupTeardown.cs new file mode 100644 index 0000000..b021efc --- /dev/null +++ b/src/Novu.Tests/Factories/FactorySetupTeardown.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Threading.Tasks; +using JetBrains.Annotations; + +namespace Novu.Tests.Factories; +/// +/// TODO: Requires v9 Xunit.DependencyInjection +/// +/// +public class FactorySetupTeardown(Tracker tracker) /*: Xunit.DependencyInjection.BeforeAfterTest*/ +{ + public /*override*/ async ValueTask AfterAsync([CanBeNull] object testClassInstance, MethodInfo methodUnderTest) + { + await tracker.RemoveAll(); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/FeedFactory.cs b/src/Novu.Tests/Factories/FeedFactory.cs new file mode 100644 index 0000000..f33cfe7 --- /dev/null +++ b/src/Novu.Tests/Factories/FeedFactory.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Feeds; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class FeedFactory(Tracker tracker, IFeedClient client) +{ + public async Task Make(FeedCreateData data = null) + { + var createData = data ?? new FeedCreateData + { + Name = StringGenerator.SequenceOfAlphaNumerics(50), + }; + + var feed = await client.Create(createData); + tracker.Feeds.Add(feed.Data); + return feed.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/IntegrationFactory.cs b/src/Novu.Tests/Factories/IntegrationFactory.cs new file mode 100644 index 0000000..3fdee6e --- /dev/null +++ b/src/Novu.Tests/Factories/IntegrationFactory.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Integrations; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class IntegrationFactory(IIntegrationClient client) +{ + public async Task Make(IntegrationCreateData data = null, string providerId = null, string channel = null) + { + var createData = data ?? new IntegrationCreateData + { + Name = StringGenerator.LoremIpsum(4), + ProviderId = providerId ?? "novu", + Channel = channel ?? "in_app", + Active = true, + }; + + var layout = await client.Create(createData); + + // do not manage integrations as other types. + + return layout.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/LayoutFactory.cs b/src/Novu.Tests/Factories/LayoutFactory.cs new file mode 100644 index 0000000..768fdb4 --- /dev/null +++ b/src/Novu.Tests/Factories/LayoutFactory.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Layouts; +using Novu.Domain.Models.Workflows.Step.Message; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class LayoutFactory(ILayoutClient client, Tracker tracker) +{ + public async Task Make( + LayoutCreateData data = null, + string content = null, + TemplateVariable[] variables = null) + + { + var createData = data ?? new LayoutCreateData + { + Name = StringGenerator.LoremIpsum(4), + Description = StringGenerator.LoremIpsum(10), + Content = content ?? "Test " + LayoutCreateData.BodyExpression + " expression", + Variables = variables ?? [], + }; + + var layout = await client.Create(createData); + tracker.Layouts.Add(layout.Data); + return layout.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/MessageTemplateFactory.cs b/src/Novu.Tests/Factories/Models/MessageTemplateFactory.cs similarity index 95% rename from src/Novu.Tests/IntegrationTests/MessageTemplateFactory.cs rename to src/Novu.Tests/Factories/Models/MessageTemplateFactory.cs index 5599a13..dcd5487 100644 --- a/src/Novu.Tests/IntegrationTests/MessageTemplateFactory.cs +++ b/src/Novu.Tests/Factories/Models/MessageTemplateFactory.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.Models.Workflows.Step.Message; -namespace Novu.Tests.IntegrationTests; +namespace Novu.Tests.Factories.Models; public static class MessageTemplateFactory { diff --git a/src/Novu.Tests/Factories/OrganizationFactory.cs b/src/Novu.Tests/Factories/OrganizationFactory.cs new file mode 100644 index 0000000..56d73af --- /dev/null +++ b/src/Novu.Tests/Factories/OrganizationFactory.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Organizations; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class OrganizationFactory(IOrganizationClient client) +{ + public async Task Make(OrganizationCreateData data = null) + { + var createData = data ?? new OrganizationCreateData + { + Name = StringGenerator.SequenceOfAlphaNumerics(50), + JobTitleEnum = JobTitleEnum.Other, + Domain = "example.com", + }; + + var organisation = await client.Create(createData); + // note: organizations cannot be deleted, so no tracking + return organisation.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/SubscriberFactory.cs b/src/Novu.Tests/Factories/SubscriberFactory.cs new file mode 100644 index 0000000..fcb20c4 --- /dev/null +++ b/src/Novu.Tests/Factories/SubscriberFactory.cs @@ -0,0 +1,44 @@ +using System; +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Subscribers; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class SubscriberFactory(Tracker tracker, ISubscriberClient client) +{ + public async Task Make(SubscriberCreateData data = null) + { + var createData = data ?? new SubscriberCreateData + { + SubscriberId = Guid.NewGuid().ToString(), + FirstName = NameGenerator.AnyForename(), + LastName = NameGenerator.AnySurname(), + Avatar = "https://avatars.githubusercontent.com/u/77433905?s=200&v=4", + Email = EmailAddressGenerator.AnyEmailAddress(), + Locale = "en-US", + Phone = TelephoneNumberGenerator.AnyTelephoneNumber(), + Data = + [ + new() + { + Key = "FRAMEWORK", + Value = ".NET", + }, + + new() + { + Key = "SMS_PREFERENCE", + Value = "EMERGENT-ONLY", + }, + ], + }; + + var subscriber = await client.Create(createData); + + tracker.Subscribers.Add(subscriber.Data); + + return subscriber.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/TenantFactory.cs b/src/Novu.Tests/Factories/TenantFactory.cs new file mode 100644 index 0000000..0fcb24a --- /dev/null +++ b/src/Novu.Tests/Factories/TenantFactory.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Tenants; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class TenantFactory(Tracker tracker, ITenantClient client) +{ + public async Task Make(TenantCreateData data = null) + { + var createData = data ?? new TenantCreateData + { + Name = NameGenerator.AnyName(), + Identifier = StringGenerator.SequenceOfAlphaNumerics(50), + }; + + var tenant = await client.Create(createData); + tracker.Tenants.Add(tenant.Data); + return tenant.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/TopicFactory.cs b/src/Novu.Tests/Factories/TopicFactory.cs new file mode 100644 index 0000000..5f9a257 --- /dev/null +++ b/src/Novu.Tests/Factories/TopicFactory.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.Subscribers; +using Novu.Domain.Models.Topics; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class TopicFactory(Tracker tracker, ITopicClient client) +{ + public async Task Make( + TopicCreateData data = null, + Subscriber subscriber = null, + List additionalSubscribers = null) + { + var createData = data ?? new TopicCreateData + { + Key = $"test:{NumberGenerator.RandomNumberBetween(600, 100000)}", + Name = StringGenerator.LoremIpsum(10), + }; + + var result = await client.Create(createData); + var topic = result.Data; + + if (subscriber is not null) + { + await AddSubscriber(topic, subscriber, additionalSubscribers); + } + + if (topic is not null) + { + tracker.Topics.Add(topic); + } + + return topic; + } + + public async Task AddSubscriber(Topic topic, + Subscriber subscriber, + List additionalSubscribers = null) + { + var subscribers = additionalSubscribers is not null + ? additionalSubscribers.Select(x => x.SubscriberId).Prepend(subscriber.SubscriberId).ToList() + : [subscriber.SubscriberId]; + + var subscriberList = new TopicSubscriberCreateData(subscribers); + var subscribersResults = await client.AddSubscriber(topic.Key, subscriberList); + tracker.Topics.Add(topic); + return subscribersResults.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/Tracker.cs b/src/Novu.Tests/Factories/Tracker.cs new file mode 100644 index 0000000..889cdd0 --- /dev/null +++ b/src/Novu.Tests/Factories/Tracker.cs @@ -0,0 +1,112 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Feeds; +using Novu.Domain.Models.Layouts; +using Novu.Domain.Models.Subscribers; +using Novu.Domain.Models.Tenants; +using Novu.Domain.Models.Topics; +using Novu.Domain.Models.WorkflowGroups; +using Novu.Domain.Models.WorkflowOverrides; +using Novu.Domain.Models.Workflows; + +namespace Novu.Tests.Factories; + +public class Tracker( + ISubscriberClient subscriberClient, + ITopicClient topicClient, + IWorkflowGroupClient workflowGroupClient, + IWorkflowClient workflowClient, + ILayoutClient layoutClient, + IFeedClient feedClient, + ITenantClient tenantClient, + IWorkflowOverrideClient overrideClient) +{ + public List Subscribers { get; } = []; + public List Topics { get; } = []; + public List WorkflowGroups { get; } = []; + public List Workflows { get; } = []; + public List Layouts { get; } = []; + public List Feeds { get; } = []; + public List Tenants { get; } = []; + public List WorkflowOverrides { get; } = []; + + public async Task RemoveAll() + { + // note: dispose buries errors like 404 Not Found + await TeardownWorkflowOverrides(); + await TeardownWorkflows(); + await TeardownWorkflowGroups(); + await TeardownTopics(); + await TeardownSubscribers(); + await TeardownLayouts(); + await TeardownTopics(); + await TeardownFeeds(); + await TeardownTenants(); + } + + private async Task TeardownSubscribers() + { + foreach (var subscriber in Subscribers.Where(subscriber => subscriber.SubscriberId is not null)) + { + await subscriberClient.DeleteSubscriber(subscriber.SubscriberId!); + } + } + + private async Task TeardownTopics() + { + foreach (var topic in Topics) + { + await topicClient.Delete(topic.Key); + } + } + + private async Task TeardownWorkflowGroups() + { + foreach (var workflowGroup in WorkflowGroups) + { + await workflowGroupClient.Delete(workflowGroup.Id); + } + } + + private async Task TeardownWorkflowOverrides() + { + foreach (var workflowOverride in WorkflowOverrides) + { + await overrideClient.Delete(workflowOverride.Id); + } + } + + private async Task TeardownWorkflows() + { + foreach (var workflow in Workflows) + { + await workflowClient.Delete(workflow.Id); + } + } + + private async Task TeardownLayouts() + { + foreach (var layout in Layouts) + { + await layoutClient.Delete(layout.Id); + } + } + + private async Task TeardownFeeds() + { + foreach (var feed in Feeds) + { + await feedClient.Delete(feed.Id); + } + } + + private async Task TeardownTenants() + { + foreach (var tenant in Tenants) + { + await tenantClient.Delete(tenant.Id); + } + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/WorkflowFactory.cs b/src/Novu.Tests/Factories/WorkflowFactory.cs new file mode 100644 index 0000000..0ddab87 --- /dev/null +++ b/src/Novu.Tests/Factories/WorkflowFactory.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Workflows; +using Novu.Domain.Models.Workflows.Step; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class WorkflowFactory(Tracker tracker, IWorkflowClient workflowClient, WorkflowGroupFactory workflowGroupFactory) +{ + public async Task Make( + WorkflowCreateData data = null, + Step[] steps = null, + bool active = false, + PreferenceChannels preferenceChannels = null) + { + // the simplest workflow is empty without steps and this returns a workflow with a trigger + var createData = data ?? new WorkflowCreateData + { + Name = StringGenerator.SequenceOfAlphaNumerics(10), + Description = StringGenerator.LoremIpsum(5), + PreferenceSettings = new PreferenceChannels(), + Steps = steps ?? [], + Active = active, + }; + + if (string.IsNullOrWhiteSpace(createData.WorkflowGroupId)) + { + var group = await workflowGroupFactory.Make(); + createData.WorkflowGroupId = group.Id; + } + + var workflow = await workflowClient.Create(createData); + tracker.Workflows.Add(workflow.Data); + return workflow.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/WorkflowGroupFactory.cs b/src/Novu.Tests/Factories/WorkflowGroupFactory.cs new file mode 100644 index 0000000..f76a0fb --- /dev/null +++ b/src/Novu.Tests/Factories/WorkflowGroupFactory.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.WorkflowGroups; +using ParkSquare.Testing.Generators; + +namespace Novu.Tests.Factories; + +public class WorkflowGroupFactory(Tracker tracker, IWorkflowGroupClient client) +{ + public async Task Make(WorkflowGroupCreateData data = null) + { + var createData = data ?? new WorkflowGroupCreateData + { + Name = StringGenerator.LoremIpsum(10), + }; + + var workflowGroup = await client.Create(createData); + tracker.WorkflowGroups.Add(workflowGroup.Data); + return workflowGroup.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Factories/WorkflowOverrideFactory.cs b/src/Novu.Tests/Factories/WorkflowOverrideFactory.cs new file mode 100644 index 0000000..a9fef88 --- /dev/null +++ b/src/Novu.Tests/Factories/WorkflowOverrideFactory.cs @@ -0,0 +1,38 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Novu.Domain.Models.Tenants; +using Novu.Domain.Models.WorkflowOverrides; +using Novu.Domain.Models.Workflows; + +namespace Novu.Tests.Factories; + +public class WorkflowOverrideFactory( + Tracker tracker, + IWorkflowOverrideClient client, + TenantFactory tenantFactory, + WorkflowFactory workflowFactory) +{ + public async Task Make( + Tenant tenant = null, + Workflow workflow = null, + WorkflowOverrideCreateData data = null) + { + tenant ??= await tenantFactory.Make(); + workflow ??= await workflowFactory.Make(); + + var createData = data ?? new WorkflowOverrideCreateData + { + Active = false, + PreferenceSettings = new PreferenceChannels() + { + InApp = true, + }, + TenantId = tenant.Id, + WorkflowId = workflow.Id, + }; + + var workflowOverrides = await client.Create(createData); + tracker.WorkflowOverrides.Add(workflowOverrides.Data); + return workflowOverrides.Data; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/BaseIntegrationTest.cs b/src/Novu.Tests/IntegrationTests/BaseIntegrationTest.cs deleted file mode 100644 index d7dbd4a..0000000 --- a/src/Novu.Tests/IntegrationTests/BaseIntegrationTest.cs +++ /dev/null @@ -1,367 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using Novu.DTO; -using Novu.DTO.Integrations; -using Novu.DTO.Layouts; -using Novu.DTO.Subscribers; -using Novu.DTO.Topics; -using Novu.DTO.WorkflowGroups; -using Novu.DTO.Workflows; -using Novu.Extensions; -using Novu.Interfaces; -using Novu.Models.Subscribers; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step.Message; -using Novu.Sync; -using ParkSquare.Testing.Generators; -using Refit; -using Xunit; -using Xunit.Abstractions; -using Step = Novu.Models.Workflows.Step.Step; - -namespace Novu.Tests.IntegrationTests; - -public abstract class BaseIntegrationTest : IDisposable -{ - private readonly IConfigurationRoot _configurationRoot; - private readonly ServiceCollection _services; - private IServiceProvider _serviceProvider; - - protected BaseIntegrationTest(ITestOutputHelper output) - { - Output = output; - - _services = new ServiceCollection(); - - // set environment variable to pickup correct configuration - Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Integration"); - _configurationRoot = Settings.FileName.CreateConfigurationRoot(); - - RegisterExceptionHandler(); - } - - public ITestOutputHelper Output { get; set; } - - private List Subscribers { get; } = new(); - private List Topics { get; } = new(); - private List WorkflowGroups { get; } = new(); - private List Workflows { get; } = new(); - private List Layouts { get; } = new(); - - protected INovuClient Client => Get(); - protected ISubscriberClient Subscriber => Get(); - protected IEventClient Event => Get(); - protected ITopicClient Topic => Get(); - protected IWorkflowGroupClient WorkflowGroup => Get(); - protected IWorkflowClient Workflow => Get(); - protected ILayoutClient Layout => Get(); - protected IIntegrationClient Integration => Get(); - protected INotificationsClient Notifications => Get(); - protected IMessageClient Messages => Get(); - - public async void Dispose() - { - // note: dispose buries errors like 404 Not Found - await TeardownWorkflows(); - await TeardownWorkflowGroups(); - await TeardownTopics(); - await TeardownSubscribers(); - await TeardownLayouts(); - await TeardownTopics(); - } - - protected void DeRegisterExceptionHandler() - { - Register(services => services.RegisterNovuClients(_configurationRoot)); - } - - protected void RegisterExceptionHandler() - { - var defaultSerializerSettings = NovuClient.DefaultSerializerSettings; - - // setup in-memory logging for - // see https://www.newtonsoft.com/json/help/html/SerializationTracing.htm - // TODO: make this more injectable/configurable for ad hoc diagnosis - TraceWriter = new MemoryTraceWriter(); - defaultSerializerSettings.TraceWriter = TraceWriter; - - var refitSettings = new RefitSettings - { - ContentSerializer = new NewtonsoftJsonContentSerializer(defaultSerializerSettings), - ExceptionFactory = TestExceptionFactory, - }; - - Register(services => - services - .RegisterNovuClients(_configurationRoot, refitSettings) - .RegisterNovuSync()); - - // Reports the client errors up to the tests for diagnosis - async Task TestExceptionFactory(HttpResponseMessage message) - { - if (!message.IsSuccessStatusCode) - { - switch (message.StatusCode) - { - case HttpStatusCode.NotFound: - return default; - } - - var content = await message.Content.ReadAsStringAsync(); - // don't catch any errors because we need to see errors in tests - try - { - var error = JsonConvert.DeserializeObject(content); - if (error is not null) - { - Output.WriteLine("================================="); - Output.WriteLine(TraceWriter.ToString()); - Output.WriteLine("================================="); - Assert.Fail($"[{error.Code}: '{error.Status}'] '{string.Join("; ", error.Message)}'"); - } - } - catch (JsonReaderException e) - { - Output.WriteLine("================================="); - Output.WriteLine(TraceWriter.ToString()); - Output.WriteLine("================================="); - Assert.Fail($"Cannot convert error message '{e.GetType()}' {content}"); - } - } - - return default; - } - } - - protected ITraceWriter TraceWriter { get; set; } - - private async Task TeardownSubscribers() - { - foreach (var subscriber in Subscribers) - { - if (subscriber.SubscriberId is not null) - { - await Subscriber.DeleteSubscriber(subscriber.SubscriberId); - } - } - } - - private async Task TeardownTopics() - { - foreach (var topic in Topics) - { - await Topic.Delete(topic.Key); - } - } - - private async Task TeardownWorkflowGroups() - { - foreach (var workflowGroup in WorkflowGroups) - { - await WorkflowGroup.Delete(workflowGroup.Id); - } - } - - private async Task TeardownWorkflows() - { - foreach (var workflow in Workflows) - { - await Workflow.Delete(workflow.Id); - } - } - - private async Task TeardownLayouts() - { - foreach (var layout in Layouts) - { - await Layout.Delete(layout.Id); - } - } - - /// - /// Resolves the already registered service required for the test - /// - protected T Get() where T : class - { - return _serviceProvider.GetService(); - } - - /// - /// Ad hoc registration of services used particularly for overrides - /// - /// - protected void Register(Action iocRegistration) - { - iocRegistration(_services); - _serviceProvider = _services.BuildServiceProvider(); - } - - protected void Register(Action iocRegistration) - { - iocRegistration(_services, _configurationRoot); - _serviceProvider = _services.BuildServiceProvider(); - } - - protected async Task Make(SubscriberCreateData data = null) where T : Subscriber - { - var createData = data ?? new SubscriberCreateData - { - SubscriberId = Guid.NewGuid().ToString(), - FirstName = NameGenerator.AnyForename(), - LastName = NameGenerator.AnySurname(), - Avatar = "https://avatars.githubusercontent.com/u/77433905?s=200&v=4", - Email = EmailAddressGenerator.AnyEmailAddress(), - Locale = "en-US", - Phone = TelephoneNumberGenerator.AnyTelephoneNumber(), - Data = new List - { - new() - { - Key = "FRAMEWORK", - Value = ".NET", - }, - new() - { - Key = "SMS_PREFERENCE", - Value = "EMERGENT-ONLY", - }, - }, - }; - - var subscriber = await Subscriber.Create(createData); - - Subscribers.Add(subscriber.Data); - - return subscriber.Data as T; - } - - protected async Task Make( - TopicCreateData data = null, - Subscriber subscriber = null, - List additionalSubscribers = null) - where T : Topic - { - var createData = data ?? new TopicCreateData - { - Key = $"test:{NumberGenerator.RandomNumberBetween(600, 100000)}", - Name = StringGenerator.LoremIpsum(10), - }; - - var result = await Topic.Create(createData); - var topic = result.Data; - - if (subscriber is not null) - { - await Add(subscriber, topic, additionalSubscribers); - } - - if (topic is not null) - { - Topics.Add(topic); - } - - return topic as T; - } - - protected async Task Make(WorkflowGroupCreateData data = null) - where T : WorkflowGroup - { - var createData = data ?? new WorkflowGroupCreateData - { - Name = StringGenerator.LoremIpsum(10), - }; - - var workflowGroup = await WorkflowGroup.Create(createData); - WorkflowGroups.Add(workflowGroup.Data); - return workflowGroup.Data as T; - } - - protected async Task Make( - LayoutCreateData data = null, - string content = null, - TemplateVariable[] variables = null) - where T : Layout - { - var createData = data ?? new LayoutCreateData - { - Name = StringGenerator.LoremIpsum(4), - Description = StringGenerator.LoremIpsum(10), - Content = content ?? "Test " + LayoutCreateData.BodyExpression + " expression", - Variables = variables ?? Array.Empty(), - }; - - var layout = await Layout.Create(createData); - Layouts.Add(layout.Data); - return layout.Data as T; - } - - protected async Task Make(IntegrationCreateData data = null, string providerId = null, string channel = null) - where T : Integration - { - var createData = data ?? new IntegrationCreateData - { - Name = StringGenerator.LoremIpsum(4), - ProviderId = providerId ?? "novu", - Channel = channel ?? "in_app", - Active = true, - }; - - var layout = await Integration.Create(createData); - - // do not manage integrations as other types. - - return layout.Data as T; - } - - protected async Task Make( - WorkflowCreateData data = null, - Step[] steps = null, - bool active = false, - PreferenceChannels preferenceChannels = null) - where T : Workflow - { - // the simplest workflow is empty without steps and this returns a workflow with a trigger - var createData = data ?? new WorkflowCreateData - { - Name = StringGenerator.SequenceOfAlphaNumerics(10), - Description = StringGenerator.LoremIpsum(5), - PreferenceSettings = new PreferenceChannels(), - Steps = steps ?? Array.Empty(), - Active = active, - }; - - if (string.IsNullOrWhiteSpace(createData.WorkflowGroupId)) - { - var group = await Make(); - createData.WorkflowGroupId = group.Id; - } - - var workflow = await Workflow.Create(createData); - Workflows.Add(workflow.Data); - return workflow.Data as T; - } - - protected async Task Add( - Subscriber subscriber, - Topic topic, - List additionalSubscribers = null) - where T : SucceedData - { - var subscribers = additionalSubscribers is not null - ? additionalSubscribers.Select(x => x.SubscriberId).Prepend(subscriber.SubscriberId).ToList() - : new List { subscriber.SubscriberId }; - - var subscriberList = new TopicSubscriberCreateData(subscribers); - var topicSubscriberAdditionResponseDto = await Topic.AddSubscriber(topic.Key, subscriberList); - Topics.Add(topic); - return topicSubscriberAdditionResponseDto.Data as T; - } -} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/ChangeTests.cs b/src/Novu.Tests/IntegrationTests/ChangeTests.cs new file mode 100644 index 0000000..042a42d --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/ChangeTests.cs @@ -0,0 +1,53 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Domain.Models.Changes; +using Xunit; +using Xunit.Sdk; + +namespace Novu.Tests.IntegrationTests; + +public class ChangeTests(IChangeClient changeClient) +{ + [Fact] + public async Task Should_Return_Change_List() + { + var listOfChanges = await changeClient.Get(1, 1); + + listOfChanges.Page.Should().Be(1); + listOfChanges.Data.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Return_Change_Count() + { + (await changeClient.GetCount()).Data + .Should() + .BeGreaterThan(-1); + } + + + [Fact] + public async Task Should_Add_Changes_NotFound() + { + // TODO: no idea about how this actually works + await Assert.ThrowsAsync(async () => + { + var novuResponse = await changeClient.Create(new ChangesCreateData + { + ChangeIds = ["1", "2"], + }); + }); + } + + [Fact] + public async Task Should_Add_Change_NotFound() + { + // TODO: no idea about how this actually works + await Assert.ThrowsAsync(async () => + { + var novuResponse = await changeClient.Create("1"); + novuResponse.Data.Should().BeNull(); + }); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/EnvironmentTests.cs b/src/Novu.Tests/IntegrationTests/EnvironmentTests.cs new file mode 100644 index 0000000..2f7e2db --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/EnvironmentTests.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class EnvironmentTests(IEnvironmentClient environmentClient) +{ + [Fact] + public async Task Should_Return_Environment_Me() + { + var me = await environmentClient.Me(); + + me.Data.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Return_Environment_List() + { + var listOfEnvironments = await environmentClient.Get(); + + listOfEnvironments.Should().NotBeNull(); + listOfEnvironments.Data.Should().NotBeEmpty(); + } + + [Fact] + public async Task Should_Return_Environment_ApiKeys_List() + { + var apiKeys = await environmentClient.ApiKeys(); + + apiKeys.Should().NotBeNull(); + apiKeys.Data.Should().NotBeEmpty(); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/EventTests.cs b/src/Novu.Tests/IntegrationTests/EventTests.cs index ca2ffc9..5451b60 100644 --- a/src/Novu.Tests/IntegrationTests/EventTests.cs +++ b/src/Novu.Tests/IntegrationTests/EventTests.cs @@ -2,32 +2,58 @@ using System.Threading.Tasks; using FluentAssertions; using Newtonsoft.Json; -using Novu.DTO.Events; -using Novu.DTO.Subscribers; -using Novu.DTO.Workflows; +using Novu.Clients; +using Novu.Domain.Models.Events; +using Novu.Tests.Factories; using ParkSquare.Testing.Generators; using Refit; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class EventTests : BaseIntegrationTest +public class EventTests(SubscriberFactory subscriberFactory, WorkflowFactory workflowFactory, IEventClient eventClient) { - public EventTests(ITestOutputHelper output) : base(output) + [Fact] + public async Task Should_Trigger_Event() { + var subscriber = await subscriberFactory.Make(); + + var trigger = await eventClient.Trigger( + new EventCreateData + { + EventName = await GetActiveEvent(), + To = { SubscriberId = subscriber?.SubscriberId! }, + Payload = new TestPayload(), + }); + trigger.Data.Acknowledged.Should().BeTrue(); + + // TODO: how to detect success for a subscriber } [Fact] - public async void Should_Trigger_Event() + public async Task Should_Create_Subscriber_And_Trigger_Event() { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); - var trigger = await Event.Trigger( + var trigger = await eventClient.Trigger( new EventCreateData { EventName = await GetActiveEvent(), - To = { SubscriberId = subscriber?.SubscriberId! }, + To = + { + SubscriberId = subscriber?.SubscriberId! + "-new", + Email = subscriber?.Email + ".changed", + FirstName = subscriber?.FirstName + " Changed", + LastName = subscriber?.FirstName + " Changed", + Phone = "+777" + subscriber?.Phone, + Avatar = subscriber?.Avatar + "?changed=1", + Locale = subscriber?.Locale + ",ro-RO", + Data = new + { + EMAIL_PREFERENCE = "NONE", + ADDITIONAL_PROPERTIES = new { IS_TEST_SUBSCRIBER = true }, + }, + }, Payload = new TestPayload(), }); trigger.Data.Acknowledged.Should().BeTrue(); @@ -36,9 +62,9 @@ public async void Should_Trigger_Event() } [Fact] - public async void Should_Trigger_Bulk_Event() + public async Task Should_Trigger_Bulk_Event() { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); var eventName = await GetActiveEvent(); var dto = new BulkEventCreateData( @@ -51,7 +77,7 @@ public async void Should_Trigger_Bulk_Event() }) .ToList()); - var trigger = await Event.CreateBulk(dto); + var trigger = await eventClient.CreateBulk(dto); trigger.Data.Should().HaveCount(2); trigger.Data.Should().AllSatisfy(triggerPayload => Assert.True(triggerPayload.Acknowledged)); @@ -60,7 +86,7 @@ public async void Should_Trigger_Bulk_Event() } [Fact] - public async void Should_Trigger_Broadcast_Event() + public async Task Should_Trigger_Broadcast_Event() { var dto = new BroadcastEventCreateData { @@ -68,22 +94,23 @@ public async void Should_Trigger_Broadcast_Event() Payload = new TestPayload(), }; - var trigger = await Event.CreateBroadcast(dto); + var trigger = await eventClient.CreateBroadcast(dto); trigger.Data.Acknowledged.Should().BeTrue(); // TODO: how to detect success for a subscriber } - [Fact] - public async void Should_Trigger_Broadcast_Event_FAILS() + [Fact(Skip = "Not implemented for deregister exception handler")] + public async Task Should_Trigger_Broadcast_Event_FAILS() { // allow for exception to asserted - DeRegisterExceptionHandler(); + // DeRegisterExceptionHandler(); // // WARN: A non-active workflow throws 500 error // - var workflow = await Make( /*steps: new[] { StepFactory.InApp(true) }, active: true*/); + var workflow = + await workflowFactory.Make( /*steps: new[] { StepFactory.InApp(true) }, active: true*/); var eventName = workflow.Triggers.FirstOrDefault()?.Identifier; eventName.Should().NotBeNull(); @@ -93,13 +120,13 @@ public async void Should_Trigger_Broadcast_Event_FAILS() Payload = new TestPayload(), }; - await Assert.ThrowsAsync(async () => { await Event.CreateBroadcast(dto); }); + await Assert.ThrowsAsync(async () => { await eventClient.CreateBroadcast(dto); }); } /* [Fact] - public async void Should_Trigger_Topic() + public async Task Should_Trigger_Topic() { var topic = await Make(); @@ -117,18 +144,18 @@ public async void Should_Trigger_Topic() */ [Fact] - public async void Should_Trigger_Cancel_Event() + public async Task Should_Trigger_Cancel_Event() { var dto = new BroadcastEventCreateData { Name = await GetActiveEvent(), Payload = new TestPayload(), }; - var trigger = await Event.CreateBroadcast(dto); + var trigger = await eventClient.CreateBroadcast(dto); trigger.Data.Acknowledged.Should().BeTrue(); - await Event.Cancel(trigger.Data.TransactionId); + await eventClient.Cancel(trigger.Data.TransactionId); // TODO: how to detect success for a subscriber } @@ -138,7 +165,7 @@ public async void Should_Trigger_Cancel_Event() /// private async Task GetActiveEvent() { - var workflow = await Make(steps: new[] { StepFactory.InApp(true) }, active: true); + var workflow = await workflowFactory.Make(steps: [StepFactory.InApp(true)], active: true); var eventName = workflow.Triggers.FirstOrDefault()?.Identifier; eventName.Should().NotBeNull(); return eventName; diff --git a/src/Novu.Tests/IntegrationTests/ExecutionDetailsTests.cs b/src/Novu.Tests/IntegrationTests/ExecutionDetailsTests.cs index 42c14b9..72cd3c8 100644 --- a/src/Novu.Tests/IntegrationTests/ExecutionDetailsTests.cs +++ b/src/Novu.Tests/IntegrationTests/ExecutionDetailsTests.cs @@ -1,18 +1,16 @@ using System.Linq; using System.Threading.Tasks; -using FluentAssertions; -using Novu.Interfaces; +using Microsoft.Extensions.Logging; +using Novu.Clients; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class ExecutionDetailsTests : BaseIntegrationTest +public class ExecutionDetailsTests( + INotificationsClient notificationsClient, + IExecutionDetailsClient executionDetailsClient, + ILogger log) { - public ExecutionDetailsTests(ITestOutputHelper output) : base(output) - { - } - [Fact] public async Task Should_Get_Messages() { @@ -21,23 +19,23 @@ public async Task Should_Get_Messages() // // fingers cross there are some notifications to check serialisation - var notifications = await Notifications.Get(); + var notifications = await notificationsClient.Get(); var notification = notifications.Data.FirstOrDefault(x => x.Jobs.Any(y => y.ExecutionDetails.Any())); if (notification is not null) { if (notification.Subscriber is not null) { - await Get().Get(notification.Id, notification.Subscriber.Id); + await executionDetailsClient.Get(notification.Id, notification.Subscriber.Id); } else { - Output.WriteLine("No real test was run as there is no subscriber on the data"); + log.LogWarning("No real test was run as there is no subscriber on the data"); } } else { - Output.WriteLine("No real test was run as there is no notification data"); + log.LogError("No real test was run as there is no notification data"); } } } \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/FeedTests.cs b/src/Novu.Tests/IntegrationTests/FeedTests.cs new file mode 100644 index 0000000..3571ce8 --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/FeedTests.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Tests.Factories; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class FeedTests(FeedFactory feedFactory, IFeedClient feedClient) +{ + [Fact] + public async Task Should_Create_Feed() + { + var feed = await feedFactory.Make(); + feed.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Return_Feed_List() + { + await feedFactory.Make(); + var listOfFeeds = await feedClient.Get(); + + Assert.NotNull(listOfFeeds); + Assert.NotEmpty(listOfFeeds.Data); + } + + [Fact] + public async Task Should_Delete_Feed() + { + var feed = await feedFactory.Make(); + await feedClient.Delete(feed.Id); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/FeeddTests.cs b/src/Novu.Tests/IntegrationTests/FeeddTests.cs new file mode 100644 index 0000000..b1d1320 --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/FeeddTests.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Novu.Clients; +using Xunit; +using Xunit.Sdk; + +namespace Novu.Tests.IntegrationTests; + +public class BlueprintTests(IBlueprintClient blueprintClient) +{ + [Fact] + public async Task Should_Return_Blueprint() + { + var listOfBlueprints = await blueprintClient.Get(); + + Assert.NotNull(listOfBlueprints); + } + + [Fact] + public async Task Should_Return_Blueprint_By_Id_Is_Broken() + { + await Assert.ThrowsAsync(async () => + { + await blueprintClient.Get("not found"); + }); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/IntegrationTests.cs b/src/Novu.Tests/IntegrationTests/IntegrationTests.cs index 3f8555a..6c4143f 100644 --- a/src/Novu.Tests/IntegrationTests/IntegrationTests.cs +++ b/src/Novu.Tests/IntegrationTests/IntegrationTests.cs @@ -1,30 +1,27 @@ using System.Threading.Tasks; using FluentAssertions; using Newtonsoft.Json; -using Novu.Models.Integrations; +using Novu.Clients; +using Novu.Domain; +using Novu.Domain.Models.Integrations; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class IntegrationTests : BaseIntegrationTest +public class IntegrationTests(IIntegrationClient integrationClient) { - public IntegrationTests(ITestOutputHelper output) : base(output) - { - } - [Fact] public async Task Should_Get_Integrations() { - var integrations = await Integration.Get(); + var integrations = await integrationClient.Get(); integrations.Should().NotBeNull(); - integrations.Data.Should().NotBeEmpty(); + // integrations.Data.Should().NotBeEmpty(); } [Fact] public void Should_Serialize_Credentials_WithNulls_IsEmpty() { - JsonConvert.SerializeObject(new Credentials(), NovuClient.DefaultSerializerSettings) + JsonConvert.SerializeObject(new Credentials(), NovuJsonSettings.DefaultSerializerSettings) .Should() .Be("{}"); } diff --git a/src/Novu.Tests/IntegrationTests/MessageTests.cs b/src/Novu.Tests/IntegrationTests/MessageTests.cs index f18155c..7c02360 100644 --- a/src/Novu.Tests/IntegrationTests/MessageTests.cs +++ b/src/Novu.Tests/IntegrationTests/MessageTests.cs @@ -1,24 +1,21 @@ using System.Linq; using System.Threading.Tasks; using FluentAssertions; +using Novu.Clients; using Xunit; using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class MessageTests : BaseIntegrationTest +public class MessageTests(IMessageClient messageClient) { - public MessageTests(ITestOutputHelper output) : base(output) - { - } - - [Fact] + [Fact] public async Task Should_Get_Messages() { // TODO: should really setup its own messages - var messages = await Messages.Get(); + var messages = await messageClient.Get(); messages.Should().NotBeNull(); - messages.Data.Should().NotBeEmpty(); + // messages.Data.Should().NotBeEmpty(); } [RunnableInDebugOnly] @@ -26,11 +23,11 @@ public async Task Should_Get_Delete() { // TODO: should really setup its own messages as in a new system this breaks - var messages = await Messages.Get(); + var messages = await messageClient.Get(); var message = messages.Data.FirstOrDefault(); if (message is not null) { - var response = await Messages.Delete(message.Id); + var response = await messageClient.Delete(message.Id); response.Data.Acknowledged.Should().BeTrue(); } } diff --git a/src/Novu.Tests/IntegrationTests/MxRecor.cs b/src/Novu.Tests/IntegrationTests/MxRecor.cs new file mode 100644 index 0000000..d6c6863 --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/MxRecor.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class MxRecordTests(IMxRecordClient mxRecordClient) +{ + [Fact] + public async Task Should_Return_False_Because_MX_Is_Not_Set() + { + var status = await mxRecordClient.Get(); + status.Data.MxRecordConfigured.Should().BeFalse(); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/NotificationTests.cs b/src/Novu.Tests/IntegrationTests/NotificationTests.cs index a91d483..171a3ae 100644 --- a/src/Novu.Tests/IntegrationTests/NotificationTests.cs +++ b/src/Novu.Tests/IntegrationTests/NotificationTests.cs @@ -1,20 +1,16 @@ using System.Threading.Tasks; using FluentAssertions; +using Novu.Clients; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class NotificationTests : BaseIntegrationTest +public class NotificationTests(INotificationsClient notificationsClient) { - public NotificationTests(ITestOutputHelper output) : base(output) - { - } - [Fact] public async Task Should_Get_Notifications() { - var integrations = await Notifications.Get(); + var integrations = await notificationsClient.Get(); integrations.Should().NotBeNull(); integrations.Data.Should().NotBeEmpty(); } @@ -22,14 +18,14 @@ public async Task Should_Get_Notifications() [Fact] public async Task Should_Get_NotificationsStats() { - var integrations = await Notifications.GetStats(); + var integrations = await notificationsClient.GetStats(); integrations.Should().NotBeNull(); } [Fact] public async Task Should_Get_NotificationsGraphStats() { - var integrations = await Notifications.GetGraphStats(); + var integrations = await notificationsClient.GetGraphStats(); integrations.Should().NotBeNull(); } } \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/OrganizationBrandTests.cs b/src/Novu.Tests/IntegrationTests/OrganizationBrandTests.cs new file mode 100644 index 0000000..76cb72c --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/OrganizationBrandTests.cs @@ -0,0 +1,29 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Domain.Models.Organizations; +using ParkSquare.Testing.Generators; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class OrganizationBrandTests( + IOrganizationBrandClient organizationBrandClient, + IOrganizationClient organizationClient) +{ + /// + /// There is no need to create an organization because the update is always made on the + /// organization tenanted on the apikey provided + /// + [Fact] + public async Task Should_Update_Organisation_Branding() + { + var color = $"#f4737{NumberGenerator.RandomNumberBetween(0, 9)}"; + await organizationBrandClient.Update(new BrandingEditData + { + Color = color, + }); + var updatedOrganisation = await organizationClient.Me(); + updatedOrganisation.Data.Branding.Color.Should().Be(color); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/OrganizationMemberTests.cs b/src/Novu.Tests/IntegrationTests/OrganizationMemberTests.cs new file mode 100644 index 0000000..a043d3f --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/OrganizationMemberTests.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class OrganizationMemberTests(IOrganizationMemberClient organizationMemberClient) +{ + /// + /// There is no need to create an organization because the update is always made on the + /// organization tenanted on the apikey provided + /// + [Fact] + public async Task Should_Get_All_Members() + { + var members = await organizationMemberClient.Get(); + members.Should().NotBeNull(); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/OrganizationTests.cs b/src/Novu.Tests/IntegrationTests/OrganizationTests.cs new file mode 100644 index 0000000..ca89abc --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/OrganizationTests.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Tests.Factories; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class OrganizationTests(OrganizationFactory organizationFactory, IOrganizationClient organizationClient) +{ + [Fact] + public async Task Should_Create_Organisation() + { + var organisation = await organizationFactory.Make(); + organisation.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Return_Organisation_List() + { + await organizationFactory.Make(); + var listOfOrganisations = await organizationClient.Get(); + + Assert.NotNull(listOfOrganisations); + Assert.NotEmpty(listOfOrganisations.Data); + } + + [Fact] + public async Task Should_Return_Organisation_Me() + { + await organizationFactory.Make(); + var organization = await organizationClient.Me(); + + Assert.NotNull(organization); + Assert.NotNull(organization.Data.Name); + } + + [Fact(Skip = "Organization cannot be deleted")] + public Task Should_Delete_Organisation() + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/Startup.cs b/src/Novu.Tests/IntegrationTests/Startup.cs new file mode 100644 index 0000000..1f04893 --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/Startup.cs @@ -0,0 +1,19 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Novu.Tests.IntegrationTests; + +/// +/// Automatically bootstrapped through Xunit lifecycle +/// see https://github.com/pengweiqhca/Xunit.DependencyInjection +/// +public class Startup +{ + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + services + .ConfigureTestServices(context) + .RegisterNovuClientsWithExceptionHandler() + .RegisterFactories(); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/StepFactory.cs b/src/Novu.Tests/IntegrationTests/StepFactory.cs index cda8c9f..6a95b7b 100644 --- a/src/Novu.Tests/IntegrationTests/StepFactory.cs +++ b/src/Novu.Tests/IntegrationTests/StepFactory.cs @@ -1,4 +1,5 @@ -using Novu.Models.Workflows.Step; +using Novu.Domain.Models.Workflows.Step; +using Novu.Tests.Factories.Models; using ParkSquare.Testing.Generators; namespace Novu.Tests.IntegrationTests; @@ -21,7 +22,7 @@ public static Step DigestScheduleEachMonth() AtTime = "18:05", MonthlyType = MonthlyTypeEnum.Each, OrdinalValue = OrdinalValueEnum.Day, - MonthDays = new[] { 5, 10 }, + MonthDays = [5, 10], }, Amount = 1, Unit = UnitEnum.Weeks, @@ -107,7 +108,7 @@ public static Step DigestScheduleEveryWeekdayAtTime() Timed = new TimedConfig { AtTime = "18:05", - WeekDays = new[] { DaysEnum.Monday, DaysEnum.Thursday }, + WeekDays = [DaysEnum.Monday, DaysEnum.Thursday], }, Amount = 1, Unit = UnitEnum.Weeks, diff --git a/src/Novu.Tests/IntegrationTests/SubscriberPreferenceTests.cs b/src/Novu.Tests/IntegrationTests/SubscriberPreferenceTests.cs index ed807de..07ae8a0 100644 --- a/src/Novu.Tests/IntegrationTests/SubscriberPreferenceTests.cs +++ b/src/Novu.Tests/IntegrationTests/SubscriberPreferenceTests.cs @@ -1,54 +1,51 @@ using System.Linq; +using System.Threading.Tasks; using FluentAssertions; -using Novu.DTO; -using Novu.DTO.Subscribers; -using Novu.DTO.Subscribers.Preferences; -using Novu.DTO.Workflows; -using Novu.Models.Subscribers.Preferences; -using Novu.Models.Workflows; +using Novu.Clients; +using Novu.Domain.Models.Subscribers.Preferences; +using Novu.Domain.Models.Workflows; +using Novu.Tests.Factories; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class SubscriberPreferencesTests : BaseIntegrationTest +public class SubscriberPreferencesTests( + ISubscriberClient subscriberClient, + SubscriberFactory subscriberFactory, + WorkflowFactory workflowFactory) { - public SubscriberPreferencesTests(ITestOutputHelper output) : base(output) - { - } - [Fact] - public async void Should_Get_Preferences() + public async Task Should_Get_Preferences() { // a preference requires a workflow (so if the system was clean no preferences would be returned) - await Make(steps: new[] { StepFactory.InApp() }); + await workflowFactory.Make(steps: [StepFactory.InApp()]); - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); subscriber.SubscriberId.Should().NotBeNull(); - var preferences = await Subscriber.GetPreferences(subscriber.SubscriberId!); + var preferences = await subscriberClient.GetPreferences(subscriber.SubscriberId!); // fire forget test, that it returns something preferences.Data.Should().NotBeNull(); } [Fact] - public async void Should_Update_Preference_InApp() + public async Task Should_Update_Preference_InApp() { // a preference requires a workflow (so if the system was clean no preferences would be returned) // The workflow must: // - have the channel // - be ACTIVE - var workflow = await Make( - steps: new[] { StepFactory.InApp() }, + var workflow = await workflowFactory.Make( + steps: [StepFactory.InApp()], active: true, preferenceChannels: new PreferenceChannels { InApp = true, }); - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); subscriber.SubscriberId.Should().NotBeNull(); - var preferences = await Subscriber.GetPreferences(subscriber.SubscriberId!); + var preferences = await subscriberClient.GetPreferences(subscriber.SubscriberId!); // The current workflow, get its setting var inAppPreference = preferences.Data.SingleOrDefault(x => x.Template.Name == workflow.Name); @@ -62,7 +59,7 @@ public async void Should_Update_Preference_InApp() // update to ON inAppPreference.Preference.Channels.InApp.Value.Should().BeTrue(); - await Subscriber.UpdatePreference( + await subscriberClient.UpdatePreference( subscriber.SubscriberId!, inAppPreference.Template.Id, new SubscriberPreferenceEditData @@ -74,7 +71,7 @@ await Subscriber.UpdatePreference( }, }); - (await Subscriber.GetPreferences(subscriber.SubscriberId!)) + (await subscriberClient.GetPreferences(subscriber.SubscriberId!)) .Data .SingleOrDefault(x => x.Preference.Channels.InApp is true && x.Template.Name == workflow.Name) .Should() @@ -82,22 +79,22 @@ await Subscriber.UpdatePreference( } [Fact] - public async void Should_Get_InApp_Unseen() + public async Task Should_Get_InApp_Unseen() { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); subscriber.SubscriberId.Should().NotBeNull(); - var messagesCount = await Subscriber.GetInAppUnseen(subscriber.SubscriberId!); + var messagesCount = await subscriberClient.GetInAppUnseen(subscriber.SubscriberId!); // fire forget test, that it returns something messagesCount.Data.Count.Should().BeGreaterOrEqualTo(0); } [Fact] - public async void Should_Get_InApp() + public async Task Should_Get_InApp() { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); subscriber.SubscriberId.Should().NotBeNull(); - var messages = await Subscriber.GetInApp(subscriber.SubscriberId!); + var messages = await subscriberClient.GetInApp(subscriber.SubscriberId!); // fire forget test, that it returns something messages.Data.Should().HaveCountGreaterOrEqualTo(0); diff --git a/src/Novu.Tests/IntegrationTests/SubscriberTests.cs b/src/Novu.Tests/IntegrationTests/SubscriberTests.cs index ad5abb4..7fdcf58 100644 --- a/src/Novu.Tests/IntegrationTests/SubscriberTests.cs +++ b/src/Novu.Tests/IntegrationTests/SubscriberTests.cs @@ -1,37 +1,37 @@ using System.Collections.Generic; using System.Threading.Tasks; using FluentAssertions; -using Novu.DTO.Subscribers; +using Microsoft.Extensions.DependencyInjection; +using Novu.Clients; +using Novu.Domain.Models.Subscribers; +using Novu.Extensions; +using Novu.Tests.Factories; using Refit; using Xunit; -using Xunit.Abstractions; +using Xunit.DependencyInjection; namespace Novu.Tests.IntegrationTests; -public class SubscriberTests : BaseIntegrationTest +public class SubscriberTests(SubscriberFactory subscriberFactory, ISubscriberClient subscriberClient) { - public SubscriberTests(ITestOutputHelper output) : base(output) - { - } - [Fact] - public async void Should_Create_Subscriber() + public async Task Should_Create_Subscriber() { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); Assert.NotNull(subscriber); } [Fact] - public async void Should_Get_One_Subscriber() + public async Task Should_Get_One_Subscriber() { - var testSub = await Make(); - var subscriber = await Subscriber.Get(testSub.SubscriberId!); + var testSub = await subscriberFactory.Make(); + var subscriber = await subscriberClient.Get(testSub.SubscriberId!); Assert.Equal(subscriber.Data.SubscriberId, testSub.SubscriberId); } [Fact] - public async void Should_Get_All_Subscribers() + public async Task Should_Get_All_Subscribers() { async Task> GetAllSubscribers( int page = 0, @@ -39,7 +39,7 @@ async Task> GetAllSubscribers( IList subscribers = null) { subscribers ??= new List(); - var next = await Subscriber.Get(page, limit); + var next = await subscriberClient.Get(page, limit); foreach (var dto in next.Data) { @@ -61,14 +61,14 @@ async Task> GetAllSubscribers( } [Fact] - public async void Should_Update_Subscriber() + public async Task Should_Update_Subscriber() { - var subToUpdate = await Make(); + var subToUpdate = await subscriberFactory.Make(); subToUpdate.FirstName += " Updated"; subToUpdate.LastName += " Update"; - var updatedSub = await Subscriber.Update(subToUpdate.SubscriberId!, new SubscriberEditData + var updatedSub = await subscriberClient.Update(subToUpdate.SubscriberId!, new SubscriberEditData { Data = subToUpdate.Data, FirstName = subToUpdate.FirstName, @@ -102,43 +102,47 @@ public async void Should_Update_Subscriber() } [Fact] - public async void Should_Delete_Subscriber() + public async Task Should_Delete_Subscriber() { - var subscriber = await Make(); - var deleteResponse = await Subscriber.DeleteSubscriber(subscriber.SubscriberId!); + var subscriber = await subscriberFactory.Make(); + var deleteResponse = await subscriberClient.DeleteSubscriber(subscriber.SubscriberId!); deleteResponse.Data.Acknowledged.Should().BeTrue(); } [Fact] - public async void Should_Delete_Subscriber_DoesNotThrowOnGet() + public async Task Should_Delete_Subscriber_DoesNotThrowOnGet() { - var subscriber = await Make(); + var subscriber = await subscriberFactory.Make(); subscriber.SubscriberId.Should().NotBeNull(); - await Subscriber.DeleteSubscriber(subscriber.SubscriberId!); - var response = await Subscriber.Get(subscriber.SubscriberId); + await subscriberClient.DeleteSubscriber(subscriber.SubscriberId!); + var response = await subscriberClient.Get(subscriber.SubscriberId); // note: return subscriber with null values response.Data.Should().BeNull(); } - [Fact] - public async void Should_Delete_Twice_Returns_NotFound() + [Theory(Skip = "Implement de-register exception handler")] + [InlineData(null)] + public async Task Should_Delete_Twice_Returns_NotFound([FromServices] IServiceCollection services) { + services.RegisterNovuClients(ConfigurationExtensions.GetConfiguration("Integration")); + services.BuildServiceProvider(); + // override the base exception trap to expose 404 - DeRegisterExceptionHandler(); + // DeRegisterExceptionHandler(); - var subscriber = await Make(); - var deleteResponse = await Subscriber.DeleteSubscriber(subscriber.SubscriberId!); + var subscriber = await subscriberFactory.Make(); + var deleteResponse = await subscriberClient.DeleteSubscriber(subscriber.SubscriberId!); deleteResponse.Data.Acknowledged.Should().BeTrue(); await Assert.ThrowsAsync(async () => - await Subscriber.DeleteSubscriber(subscriber.SubscriberId)); + await subscriberClient.DeleteSubscriber(subscriber.SubscriberId)); } [Fact] - public async void Should_Update_Online_Status() + public async Task Should_Update_Online_Status() { - var subscriber = await Make(); - var response = await Subscriber.UpdateOnlineStatus( + var subscriber = await subscriberFactory.Make(); + var response = await subscriberClient.UpdateOnlineStatus( subscriber.SubscriberId!, new SubscriberOnlineEditData { diff --git a/src/Novu.Tests/IntegrationTests/TenantTests.cs b/src/Novu.Tests/IntegrationTests/TenantTests.cs new file mode 100644 index 0000000..740c23b --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/TenantTests.cs @@ -0,0 +1,50 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Domain.Models.Tenants; +using Novu.Tests.Factories; +using ParkSquare.Testing.Generators; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class TenantTests(TenantFactory tenantFactory, ITenantClient tenantClient) +{ + [Fact] + public async Task Should_Create_Tenant() + { + var tenant = await tenantFactory.Make(); + tenant.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Return_Tenant_List() + { + await tenantFactory.Make(); + var listOfTenants = await tenantClient.Get(); + + Assert.NotNull(listOfTenants); + Assert.NotEmpty(listOfTenants.Data); + } + + [Fact] + public async Task Should_Delete_Tenant() + { + var tenant = await tenantFactory.Make(); + await tenantClient.Delete(tenant.Identifier); + } + + [Fact] + public async Task Should_Update_Tenant() + { + var tenant = await tenantFactory.Make(); + + await tenantClient.Update( + tenant.Identifier, + new TenantEditData + { + Name = NameGenerator.AnyName(), + Identifier = tenant.Identifier, + }); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/TopicTests.cs b/src/Novu.Tests/IntegrationTests/TopicTests.cs index e9fa362..1d63a0f 100644 --- a/src/Novu.Tests/IntegrationTests/TopicTests.cs +++ b/src/Novu.Tests/IntegrationTests/TopicTests.cs @@ -1,94 +1,104 @@ -using System.Collections.Generic; +using System.Threading.Tasks; using FluentAssertions; -using Novu.DTO; -using Novu.DTO.Subscribers; -using Novu.DTO.Topics; +using Novu.Clients; +using Novu.Domain.Models.Topics; +using Novu.Tests.Factories; using ParkSquare.Testing.Generators; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class TopicTests : BaseIntegrationTest +public class TopicTests( + TopicFactory topicFactory, + SubscriberFactory subscriberFactory, + ITopicClient topicClient, + Tracker tracker) + : IAsyncLifetime { - public TopicTests(ITestOutputHelper output) : base(output) + public Task InitializeAsync() { + return Task.CompletedTask; + } + + public async Task DisposeAsync() + { + await tracker.RemoveAll(); } [Fact] - public async void Should_Create_Topic() + public async Task Should_Create_Topic() { - var topic = await Make(); + var topic = await topicFactory.Make(); topic.Key.Should().NotBeNull(); } [Fact] - public async void Should_Add_Subscriber_To_Topic() + public async Task Should_Add_Subscriber_To_Topic() { - var subscriber = await Make(); - var topic = await Make(); - var addSubscribers = await Add(subscriber, topic); + var subscriber = await subscriberFactory.Make(); + var topic = await topicFactory.Make(); + var addSubscribers = await topicFactory.AddSubscriber(topic, subscriber); addSubscribers.Succeeded.Should().ContainSingle(); addSubscribers.Succeeded.Should().Contain(x => x == subscriber.SubscriberId); } [Fact] - public async void Should_List_Topics() + public async Task Should_List_Topics() { - await Make(); - var topics = await Topic.Get(); + await topicFactory.Make(); + var topics = await topicClient.Get(); topics.Data.Should().NotBeEmpty(); // because of paging, it needs to look through more // topics.Data.Should().Contain(dto => dto.Key == topic.Key); } [Fact] - public async void Should_Validate_Topic_Subscriber() + public async Task Should_Validate_Topic_Subscriber() { - var subscriber = await Make(); - var topic = await Make(null, subscriber); + var subscriber = await subscriberFactory.Make(); + var topic = await topicFactory.Make(null, subscriber); - await Topic.Verify(topic.Key, subscriber.SubscriberId!); + await topicClient.Verify(topic.Key, subscriber.SubscriberId!); } [Fact] - public async void Should_Remove_Subscriber_From_Topic() + public async Task Should_Remove_Subscriber_From_Topic() { - var subscriber = await Make(); - var topic = await Make(null, subscriber); + var subscriber = await subscriberFactory.Make(); + var topic = await topicFactory.Make(null, subscriber); - await Topic.RemoveSubscriber( + await topicClient.RemoveSubscriber( topic.Key, - new TopicSubscriberCreateData(new List { subscriber.SubscriberId })); + new TopicSubscriberCreateData([subscriber.SubscriberId])); } [Fact] - public async void Should_Delete_Topic() + public async Task Should_Delete_Topic() { - var topic = await Make(); - await Topic.Delete(topic.Key); - var result = await Topic.Get(topic.Key); + var topic = await topicFactory.Make(); + await topicClient.Delete(topic.Key); + var result = await topicClient.Get(topic.Key); result.Data.Should().BeNull(); } [Fact] - public async void Should_Get_Single_Topic() + public async Task Should_Get_Single_Topic() { - var topic = await Make(); + var topic = await topicFactory.Make(); - var result = await Topic.Get(topic.Key); + var result = await topicClient.Get(topic.Key); result.Data.Should().NotBeNull(); result.Data.Key.Should().Be(topic.Key); } [Fact] - public async void Should_Rename_Topic() + public async Task Should_Rename_Topic() { - var topic = await Make(); + var topic = await topicFactory.Make(); var newTopicName = $"topic:test:rename-{StringGenerator.LoremIpsum(10)}"; - var result = await Topic.Rename(topic.Key, new TopicEditData(newTopicName)); + var result = await topicClient.Rename(topic.Key, new TopicEditData(newTopicName)); result.Data.Name.Should().Be(newTopicName); } diff --git a/src/Novu.Tests/IntegrationTests/WorkflowGroupTests.cs b/src/Novu.Tests/IntegrationTests/WorkflowGroupTests.cs index ecc7a9d..628823e 100644 --- a/src/Novu.Tests/IntegrationTests/WorkflowGroupTests.cs +++ b/src/Novu.Tests/IntegrationTests/WorkflowGroupTests.cs @@ -1,37 +1,34 @@ -using FluentAssertions; -using Novu.DTO.WorkflowGroups; +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Tests.Factories; using Xunit; -using Xunit.Abstractions; namespace Novu.Tests.IntegrationTests; -public class WorkflowGroupTests : BaseIntegrationTest +public class WorkflowGroupTests(WorkflowGroupFactory workflowGroupFactory, IWorkflowGroupClient workflowGroupClient) { - public WorkflowGroupTests(ITestOutputHelper output) : base(output) - { - } - [Fact] - public async void Should_Create_WorkflowGroup() + public async Task Should_Create_WorkflowGroup() { - var workflowGroup = await Make(); + var workflowGroup = await workflowGroupFactory.Make(); workflowGroup.Should().NotBeNull(); } [Fact] - public async void Should_Return_WorkflowGroup_List() + public async Task Should_Return_WorkflowGroup_List() { - await Make(); - var listOfWorkflowGroups = await WorkflowGroup.Get(); + await workflowGroupFactory.Make(); + var listOfWorkflowGroups = await workflowGroupClient.Get(); Assert.NotNull(listOfWorkflowGroups); Assert.NotEmpty(listOfWorkflowGroups.Data); } [Fact] - public async void Should_Delete_WorkflowGroup() + public async Task Should_Delete_WorkflowGroup() { - var workflowGroup = await Make(); - await WorkflowGroup.Delete(workflowGroup.Id); + var workflowGroup = await workflowGroupFactory.Make(); + await workflowGroupClient.Delete(workflowGroup.Id); } } \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/WorkflowOverrideTests.cs b/src/Novu.Tests/IntegrationTests/WorkflowOverrideTests.cs new file mode 100644 index 0000000..172c024 --- /dev/null +++ b/src/Novu.Tests/IntegrationTests/WorkflowOverrideTests.cs @@ -0,0 +1,78 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Novu.Clients; +using Novu.Domain.Models.WorkflowOverrides; +using Novu.Tests.Factories; +using Xunit; + +namespace Novu.Tests.IntegrationTests; + +public class WorkflowOverridesTests( + Tracker tracker, + WorkflowOverrideFactory workflowOverrideFactory, + IWorkflowOverrideClient workflowOverrideClient) : IAsyncLifetime +{ + public Task InitializeAsync() + { + return Task.CompletedTask; + } + + public async Task DisposeAsync() + { + await tracker.RemoveAll(); + } + + [Fact] + public async Task Should_Create_WorkflowOverrides() + { + var workflowOverrides = await workflowOverrideFactory.Make(); + workflowOverrides.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Return_WorkflowOverrides_List() + { + var workflowOverride = await workflowOverrideFactory.Make(); + var returnOverride = await workflowOverrideClient.Get(); + returnOverride.Data.Should().NotBeEmpty(); + } + + [Fact] + public async Task Should_Return_WorkflowOverride() + { + var workflowOverride = await workflowOverrideFactory.Make(); + var returnOverride = await workflowOverrideClient.Get(workflowOverride.WorkflowId, workflowOverride.TenantId); + returnOverride.Data.Should().NotBeNull(); + } + + [Fact] + public async Task Should_Update_WorkflowOverride_On_Id() + { + var workflowOverride = await workflowOverrideFactory.Make(); + var returnOverride = await workflowOverrideClient.Update(workflowOverride.Id, new WorkflowOverrideEditData() + { + Active = true, + }); + returnOverride.Data.Should().NotBeNull(); + returnOverride.Data.Active.Should().BeTrue(); + } + + [Fact] + public async Task Should_Update_WorkflowOverride_On_Workflow_Tenant() + { + var workflowOverride = await workflowOverrideFactory.Make(); + var returnOverride = await workflowOverrideClient.Update(workflowOverride.WorkflowId, workflowOverride.TenantId, new WorkflowOverrideEditData() + { + Active = true, + }); + returnOverride.Data.Should().NotBeNull(); + returnOverride.Data.Active.Should().BeTrue(); + } + + [Fact] + public async Task Should_Delete_WorkflowOverrides() + { + var workflowOverrides = await workflowOverrideFactory.Make(); + await workflowOverrideClient.Delete(workflowOverrides.Id); + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IntegrationTests/WorkflowTests.cs b/src/Novu.Tests/IntegrationTests/WorkflowTests.cs index 54e1ce7..e5bb2df 100644 --- a/src/Novu.Tests/IntegrationTests/WorkflowTests.cs +++ b/src/Novu.Tests/IntegrationTests/WorkflowTests.cs @@ -3,26 +3,20 @@ using System.Linq; using System.Threading.Tasks; using FluentAssertions; -using Novu.DTO; -using Novu.DTO.Layouts; -using Novu.DTO.Workflows; +using Novu.Clients; +using Novu.Domain.Models.Workflows; +using Novu.Domain.Models.Workflows.Step; using Novu.Extensions; -using Novu.Models.Workflows; -using Novu.Models.Workflows.Step; +using Novu.Tests.Factories; using ParkSquare.Testing.Generators; using Polly; using Xunit; -using Xunit.Abstractions; using Xunit.Sdk; namespace Novu.Tests.IntegrationTests; -public class WorkflowTests : BaseIntegrationTest +public class WorkflowTests(WorkflowFactory workflowFactory, IWorkflowClient workflowClient, ILayoutClient layoutClient) { - public WorkflowTests(ITestOutputHelper output) : base(output) - { - } - public static IEnumerable Data => new List { @@ -66,7 +60,7 @@ public void Should_Validate_Model(string test, Step[] steps, int stepsCount) Name = StringGenerator.SequenceOfAlphaNumerics(10), Description = StringGenerator.LoremIpsum(5), PreferenceSettings = new PreferenceChannels(), - Steps = steps ?? Array.Empty(), + Steps = steps ?? [], WorkflowGroupId = StringGenerator.SequenceOfAlphaNumerics(20), }; if (!createData.IsValid(out var results)) @@ -79,7 +73,7 @@ public void Should_Validate_Model(string test, Step[] steps, int stepsCount) [MemberData(nameof(Data))] public async Task Should_Create_Steps(string test, Step[] steps, int stepsCount) { - var workflow = await Make(steps: steps); + var workflow = await workflowFactory.Make(steps: steps); workflow.Should().NotBeNull(); workflow.Steps.Should().HaveCount(stepsCount); workflow.Triggers.Should().HaveCount(1); @@ -90,12 +84,12 @@ public async Task Should_Create_Steps(string test, Step[] steps, int stepsCount) public async Task Should_Create_Step_With_LayoutSet() { // we know there is always a default layout - var layout = (await Layout.Get()) + var layout = (await layoutClient.Get()) .Data .Single(x => x.IsDefault); var steps = new[] { StepFactory.Email(layoutId: layout.Id) }; - var workflow = await Make(steps: steps); + var workflow = await workflowFactory.Make(steps: steps); workflow.Should().NotBeNull(); workflow.Triggers.Should().HaveCount(1); workflow.Steps.First().Template.LayoutId.Should().Be(layout.Id); @@ -104,7 +98,7 @@ public async Task Should_Create_Step_With_LayoutSet() [Fact] public async Task Should_Get_Workflows() { - var workflows = await Workflow.Get(); + var workflows = await workflowClient.Get(); workflows.Should().NotBeNull(); workflows.Page.Should().Be(0); workflows.Data.Should().NotBeEmpty(); @@ -113,8 +107,8 @@ public async Task Should_Get_Workflows() [Fact] public async Task Should_Get_Workflow() { - var workflow = await Make(); - var result = await Workflow.Get(workflow.Id); + var workflow = await workflowFactory.Make(); + var result = await workflowClient.Get(workflow.Id); result.Data.Should().NotBeNull(); result.Data.Id.Should().Be(workflow.Id); } @@ -122,9 +116,9 @@ public async Task Should_Get_Workflow() [Fact] public async Task Should_Delete_Workflow() { - var workflow = await Make(); - await Workflow.Delete(workflow.Id); - var result = await Workflow.Get(workflow.Id); + var workflow = await workflowFactory.Make(); + await workflowClient.Delete(workflow.Id); + var result = await workflowClient.Get(workflow.Id); result.Data.Should().BeNull(); } @@ -134,7 +128,7 @@ public async Task Should_Delete_Workflow() [Fact] public async Task Should_SetStatus() { - var workflows = await Workflow.Get(); + var workflows = await workflowClient.Get(); var workflow = workflows.Data.First(); // WAIT for system to catch up given it is async @@ -145,7 +139,7 @@ public async Task Should_SetStatus() await retryPolicy.ExecuteAsync(async () => { - var result = await Workflow.UpdateStatus( + var result = await workflowClient.UpdateStatus( workflow.Id, new WorkflowStatusEditData { diff --git a/src/Novu.Tests/IocModelFactoriesRegistrationExtensions.cs b/src/Novu.Tests/IocModelFactoriesRegistrationExtensions.cs new file mode 100644 index 0000000..ebbee3f --- /dev/null +++ b/src/Novu.Tests/IocModelFactoriesRegistrationExtensions.cs @@ -0,0 +1,100 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Novu.Domain; +using Novu.Domain.Models; +using Novu.Extensions; +using Novu.Tests.Factories; +using Refit; +using Xunit; +using ConfigurationExtensions = Novu.Extensions.ConfigurationExtensions; + +namespace Novu.Tests; + +public static class IocModelFactoriesRegistrationExtensions +{ + /// + /// Register all the model factories for tests + /// + public static IServiceCollection RegisterFactories(this IServiceCollection services) + { + return services + .AddTransient() + // all the factories that manage models in Novu + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + // test helpers for injection setup/teardown + // .AddScoped() + // IServiceCollection—this service collection for the ability to swap out for mocks + .AddScoped(_ => services); + } + + public static IServiceCollection RegisterNovuClientsWithExceptionHandler(this IServiceCollection services) + { + var refitSettings = RefitSettingsWithExceptionHandler(); + return services + .RegisterNovuClients(ConfigurationExtensions.GetConfiguration("Integration"), refitSettings); + } + + public static RefitSettings RefitSettingsWithExceptionHandler() + { + var defaultSerializerSettings = NovuJsonSettings.DefaultSerializerSettings; + + // setup in-memory logging for + // see https://www.newtonsoft.com/json/help/html/SerializationTracing.htm + // TODO: make this more injectable/configurable for ad hoc diagnosis + var traceWriter = new MemoryTraceWriter(); + defaultSerializerSettings.TraceWriter = traceWriter; + + var refitSettings = new RefitSettings + { + ContentSerializer = new NewtonsoftJsonContentSerializer(defaultSerializerSettings), + ExceptionFactory = TestExceptionFactory, + }; + + + // Reports the client errors up to the tests for diagnosis + async Task TestExceptionFactory(HttpResponseMessage message) + { + if (!message.IsSuccessStatusCode) + { + switch (message.StatusCode) + { + case HttpStatusCode.NotFound: + return null; + } + + var content = await message.Content.ReadAsStringAsync(); + // don't catch any errors because we need to see errors in tests + try + { + var error = JsonConvert.DeserializeObject(content); + if (error is not null) + { + Assert.Fail($"[{error.Code}: '{error.Status}'] '{string.Join("; ", error.Message)}'"); + } + } + catch (JsonReaderException e) + { + Assert.Fail($"Cannot convert error message '{e.GetType()}' {content}"); + } + } + + return null; + } + + return refitSettings; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/IocRegistrationExtensions.cs b/src/Novu.Tests/IocRegistrationExtensions.cs deleted file mode 100644 index 5090b81..0000000 --- a/src/Novu.Tests/IocRegistrationExtensions.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; - -namespace Novu.Tests; - -public static class IocRegistrationExtensions -{ - /// - /// Removes all registered registrations of and adds a - /// new registration which uses the . - /// - /// The type of service interface which needs to be placed. - /// - /// The implementation factory for the specified type. - /// - /// from https://adamstorr.azurewebsites.net/blog/integration-testing-with-aspnetcore-3-1-swapping-dependency-with-moq - /// - public static void SwapTransient( - this IServiceCollection services, - Func implementationFactory) - { - if (services.Any(x => x.ServiceType == typeof(TService) && x.Lifetime == ServiceLifetime.Transient)) - { - var serviceDescriptors = services - .Where(x => x.ServiceType == typeof(TService) && x.Lifetime == ServiceLifetime.Transient).ToList(); - foreach (var serviceDescriptor in serviceDescriptors) - { - services.Remove(serviceDescriptor); - } - } - - services.AddTransient(typeof(TService), sp => implementationFactory(sp)); - } -} \ No newline at end of file diff --git a/src/Novu.Tests/MicroTests/JsonConverters/MetaDataConverterTests.cs b/src/Novu.Tests/MicroTests/JsonConverters/MetaDataConverterTests.cs index 5c34aaa..b2e86cd 100644 --- a/src/Novu.Tests/MicroTests/JsonConverters/MetaDataConverterTests.cs +++ b/src/Novu.Tests/MicroTests/JsonConverters/MetaDataConverterTests.cs @@ -3,8 +3,8 @@ using System.IO; using FluentAssertions; using Newtonsoft.Json; -using Novu.JsonConverters; -using Novu.Models.Workflows.Step; +using Novu.Domain.JsonConverters; +using Novu.Domain.Models.Workflows.Step; using Xunit; namespace Novu.Tests.MicroTests.JsonConverters; diff --git a/src/Novu.Tests/MicroTests/JsonConverters/TypeorStringConverterTests.cs b/src/Novu.Tests/MicroTests/JsonConverters/TypeorStringConverterTests.cs index d7bd6a9..91a16db 100644 --- a/src/Novu.Tests/MicroTests/JsonConverters/TypeorStringConverterTests.cs +++ b/src/Novu.Tests/MicroTests/JsonConverters/TypeorStringConverterTests.cs @@ -3,8 +3,8 @@ using System.IO; using FluentAssertions; using Newtonsoft.Json; -using Novu.JsonConverters; -using Novu.Models.Workflows.Step.Message; +using Novu.Domain.JsonConverters; +using Novu.Domain.Models.Workflows.Step.Message; using Xunit; namespace Novu.Tests.MicroTests.JsonConverters; diff --git a/src/Novu.Tests/MicroTests/Sync/SyncIntegrationTests.cs b/src/Novu.Tests/MicroTests/Sync/SyncIntegrationTests.cs index 8d406f4..0e990ed 100644 --- a/src/Novu.Tests/MicroTests/Sync/SyncIntegrationTests.cs +++ b/src/Novu.Tests/MicroTests/Sync/SyncIntegrationTests.cs @@ -1,22 +1,25 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Moq; -using Novu.DTO; -using Novu.DTO.Integrations; -using Novu.Interfaces; -using Novu.Models.Integrations; -using Novu.Models.Subscribers.Preferences; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.Integrations; +using Novu.Domain.Models.Subscribers.Preferences; +using Novu.Domain.Utils; +using Novu.Sync; using Novu.Sync.Models; using Novu.Sync.Services; -using Novu.Tests.IntegrationTests; -using Novu.Utils; using Xunit; using Xunit.Abstractions; +using Xunit.DependencyInjection; namespace Novu.Tests.MicroTests.Sync; -public class SyncIntegrationTests : BaseIntegrationTest +public class SyncIntegrationTests(INovuSync syncClient, ITestOutputHelper output, ILogger log) { private static readonly TemplateIntegration NovuInAppTemplateIntegration = new() { @@ -31,18 +34,6 @@ public class SyncIntegrationTests : BaseIntegrationTest }, }; - private readonly Mock _integrationClient; - - public SyncIntegrationTests(ITestOutputHelper output) : base(output) - { - _integrationClient = new Mock(); - - // looks to be a need to registered the swapped out implementations before any are - // instantiated. Expectations are set in the tests. - Register( - services => { services.SwapTransient(_ => _integrationClient.Object); }); - } - public static IEnumerable Data => new List { new object[] @@ -54,6 +45,7 @@ public SyncIntegrationTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -67,6 +59,7 @@ public SyncIntegrationTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -91,6 +84,7 @@ public SyncIntegrationTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -118,6 +112,7 @@ public SyncIntegrationTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Once, (Func)Times.Never, + null, }, new object[] { @@ -139,6 +134,7 @@ public SyncIntegrationTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Once, + null, }, }; @@ -152,22 +148,43 @@ public async Task Tests( Func getCalls, Func createCalls, Func updateCalls, - Func deleteCalls + Func deleteCalls, + [FromServices] Mock client ) { - Output.WriteLine(test); + log.LogInformation("{0}", test); - _integrationClient + client.Reset(); + client .Setup(x => x.Get()) .ReturnsAsync(new NovuResponse>(currentSetAtDestination)); - var syncClient = Get>(); - await syncClient.Sync(templateIntegrations); - _integrationClient.Verify(x => x.Get(), getCalls); - _integrationClient.Verify(x => x.Create(It.IsAny()), createCalls); - _integrationClient.Verify(x => x.Update(It.IsAny(), It.IsAny()), updateCalls); - _integrationClient.Verify(x => x.Delete(It.IsAny()), deleteCalls); + client.Verify(x => x.Get(), getCalls); + client.Verify(x => x.Create(It.IsAny()), createCalls); + client.Verify(x => x.Update(It.IsAny(), It.IsAny()), updateCalls); + client.Verify(x => x.Delete(It.IsAny()), deleteCalls); + } + + + /// + /// Automatically bootstrapped through Xunit lifecycle + /// see https://github.com/pengweiqhca/Xunit.DependencyInjection + /// + public class Startup + { + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + var client = new Mock(); + + services + .ConfigureTestServices(context) + .RegisterNovuSync() + // inject the mock into each test + .AddScoped(typeof(Mock), _ => client) + // override the registered service with a mock + .AddScoped(_ => client.Object); + } } } \ No newline at end of file diff --git a/src/Novu.Tests/MicroTests/Sync/SyncLayoutTests.cs b/src/Novu.Tests/MicroTests/Sync/SyncLayoutTests.cs index 3531f6c..6750a7d 100644 --- a/src/Novu.Tests/MicroTests/Sync/SyncLayoutTests.cs +++ b/src/Novu.Tests/MicroTests/Sync/SyncLayoutTests.cs @@ -2,33 +2,25 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Moq; -using Novu.DTO; -using Novu.DTO.Layouts; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.Layouts; +using Novu.QueryParams; +using Novu.Sync; using Novu.Sync.Models; using Novu.Sync.Services; -using Novu.Tests.IntegrationTests; using ParkSquare.Testing.Generators; using Xunit; -using Xunit.Abstractions; +using Xunit.DependencyInjection; namespace Novu.Tests.MicroTests.Sync; -public class SyncLayoutTests : BaseIntegrationTest +public class SyncLayoutTests(INovuSync syncClient, ILogger log) { - private readonly Mock _layoutClient; - - public SyncLayoutTests(ITestOutputHelper output) : base(output) - { - _layoutClient = new Mock(); - - // looks to be a need to registered the swapped out implementations before any are - // instantiated. Expectations are set in the tests. - Register( - services => { services.SwapTransient(_ => _layoutClient.Object); }); - } - public static IEnumerable Data => new List { new object[] @@ -40,6 +32,7 @@ public SyncLayoutTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -57,6 +50,7 @@ public SyncLayoutTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -81,6 +75,7 @@ public SyncLayoutTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -105,6 +100,7 @@ public SyncLayoutTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Once, (Func)Times.Never, + null, }, new object[] { @@ -122,6 +118,7 @@ public SyncLayoutTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Once, + null, }, }; @@ -135,12 +132,14 @@ public async Task Tests( Func getCalls, Func createCalls, Func updateCalls, - Func deleteCalls + Func deleteCalls, + [FromServices] Mock client ) { - Output.WriteLine(test); + log.LogInformation(test); - _layoutClient + client.Reset(); + client .Setup(x => x.Get(It.IsAny())) .ReturnsAsync(new NovuPaginatedResponse { @@ -148,13 +147,32 @@ Func deleteCalls Data = currentSetAtDestination.ToArray(), }); - var syncClient = Get>(); await syncClient.Sync(templateLayouts); - _layoutClient.Verify(x => x.Get(It.IsAny()), getCalls); - _layoutClient.Verify(x => x.Create(It.IsAny()), createCalls); - _layoutClient.Verify(x => x.Update(It.IsAny(), It.IsAny()), updateCalls); - _layoutClient.Verify(x => x.Delete(It.IsAny()), deleteCalls); + client.Verify(x => x.Get(It.IsAny()), getCalls); + client.Verify(x => x.Create(It.IsAny()), createCalls); + client.Verify(x => x.Update(It.IsAny(), It.IsAny()), updateCalls); + client.Verify(x => x.Delete(It.IsAny()), deleteCalls); + } + + /// + /// Automatically bootstrapped through Xunit lifecycle + /// see https://github.com/pengweiqhca/Xunit.DependencyInjection + /// + public class Startup + { + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + var client = new Mock(); + + services + .ConfigureTestServices(context) + .RegisterNovuSync() + // inject the mock into each test + .AddScoped(typeof(Mock), _ => client) + // override the registered service with a mock + .AddScoped(_ => client.Object); + } } } \ No newline at end of file diff --git a/src/Novu.Tests/MicroTests/Sync/SyncWorkflowGroupTests.cs b/src/Novu.Tests/MicroTests/Sync/SyncWorkflowGroupTests.cs index a45387a..b5928ab 100644 --- a/src/Novu.Tests/MicroTests/Sync/SyncWorkflowGroupTests.cs +++ b/src/Novu.Tests/MicroTests/Sync/SyncWorkflowGroupTests.cs @@ -2,33 +2,24 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Moq; -using Novu.DTO; -using Novu.DTO.WorkflowGroups; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.WorkflowGroups; +using Novu.Sync; using Novu.Sync.Models; using Novu.Sync.Services; -using Novu.Tests.IntegrationTests; using ParkSquare.Testing.Generators; using Xunit; -using Xunit.Abstractions; +using Xunit.DependencyInjection; namespace Novu.Tests.MicroTests.Sync; -public class SyncWorkflowGroupTests : BaseIntegrationTest +public class SyncWorkflowGroupTests(INovuSync syncClient, ILogger log) { - private readonly Mock _workflowGroupClient; - - public SyncWorkflowGroupTests(ITestOutputHelper output) : base(output) - { - _workflowGroupClient = new Mock(); - - // looks to be a need to registered the swapped out implementations before any are - // instantiated. Expectations are set in the tests. - Register( - services => { services.SwapTransient(_ => _workflowGroupClient.Object); }); - } - public static IEnumerable Data => new List { new object[] @@ -39,6 +30,7 @@ public SyncWorkflowGroupTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -54,6 +46,7 @@ public SyncWorkflowGroupTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Once, (Func)Times.Never, + null, }, new object[] { @@ -75,6 +68,7 @@ public SyncWorkflowGroupTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -97,6 +91,7 @@ public SyncWorkflowGroupTests(ITestOutputHelper output) : base(output) // an update is a delete and create (Func)Times.Once, (Func)Times.Once, + null, }, new object[] { @@ -112,6 +107,7 @@ public SyncWorkflowGroupTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Never, (Func)Times.Once, + null, }, }; @@ -124,21 +120,42 @@ public async Task Tests( IList currentSetAtDestination, Func getCalls, Func createCalls, - Func deleteCalls + Func deleteCalls, + [FromServices] Mock client ) { - Output.WriteLine(test); + log.LogInformation(test); - _workflowGroupClient + client.Reset(); + client .Setup(x => x.Get()) .ReturnsAsync(new NovuResponse>(currentSetAtDestination.ToList())); - var syncClient = Get>(); await syncClient.Sync(templateWorkflowGroups); - _workflowGroupClient.Verify(x => x.Get(), getCalls); - _workflowGroupClient.Verify(x => x.Create(It.IsAny()), createCalls); - _workflowGroupClient.Verify(x => x.Delete(It.IsAny()), deleteCalls); + client.Verify(x => x.Get(), getCalls); + client.Verify(x => x.Create(It.IsAny()), createCalls); + client.Verify(x => x.Delete(It.IsAny()), deleteCalls); + } + + /// + /// Automatically bootstrapped through Xunit lifecycle + /// see https://github.com/pengweiqhca/Xunit.DependencyInjection + /// + public class Startup + { + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + var client = new Mock(); + + services + .ConfigureTestServices(context) + .RegisterNovuSync() + // inject the mock into each test + .AddScoped(typeof(Mock), _ => client) + // override the registered service with a mock + .AddScoped(_ => client.Object); + } } } \ No newline at end of file diff --git a/src/Novu.Tests/MicroTests/Sync/SyncWorkflowTests.cs b/src/Novu.Tests/MicroTests/Sync/SyncWorkflowTests.cs index 1ed4e26..d4ed14c 100644 --- a/src/Novu.Tests/MicroTests/Sync/SyncWorkflowTests.cs +++ b/src/Novu.Tests/MicroTests/Sync/SyncWorkflowTests.cs @@ -2,20 +2,24 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using Moq; -using Novu.DTO; -using Novu.DTO.Workflows; -using Novu.Interfaces; -using Novu.Models.Workflows; +using Novu.Clients; +using Novu.Domain.Models; +using Novu.Domain.Models.Workflows; +using Novu.QueryParams; +using Novu.Sync; using Novu.Sync.Models; using Novu.Sync.Services; using Novu.Tests.IntegrationTests; using Xunit; -using Xunit.Abstractions; +using Xunit.DependencyInjection; namespace Novu.Tests.MicroTests.Sync; -public class SyncWorkflowTests : BaseIntegrationTest +public class SyncWorkflowTests(INovuSync syncClient, ILogger log) { private static readonly TemplateWorkflow InviteInAppSms = new() { @@ -37,18 +41,6 @@ public class SyncWorkflowTests : BaseIntegrationTest Active = true, }; - private readonly Mock _workflowClient; - - public SyncWorkflowTests(ITestOutputHelper output) : base(output) - { - _workflowClient = new Mock(); - - // looks to be a need to registered the swapped out implementations before any are - // instantiated. Expectations are set in the tests. - Register( - services => { services.SwapTransient(_ => _workflowClient.Object); }); - } - public static IEnumerable Data => new List { new object[] @@ -60,6 +52,7 @@ public SyncWorkflowTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -73,6 +66,7 @@ public SyncWorkflowTests(ITestOutputHelper output) : base(output) (Func)Times.Once, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -96,6 +90,7 @@ public SyncWorkflowTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Never, + null, }, new object[] { @@ -119,6 +114,7 @@ public SyncWorkflowTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Once, (Func)Times.Never, + null, }, new object[] { @@ -139,6 +135,7 @@ public SyncWorkflowTests(ITestOutputHelper output) : base(output) (Func)Times.Never, (Func)Times.Never, (Func)Times.Once, + null, }, }; @@ -152,12 +149,14 @@ public async Task Tests( Func getCalls, Func createCalls, Func updateCalls, - Func deleteCalls + Func deleteCalls, + [FromServices] Mock client ) { - Output.WriteLine(test); + log.LogInformation(test); - _workflowClient + client.Reset(); + client .Setup(x => x.Get(It.IsAny())) .ReturnsAsync(new NovuPaginatedResponse { @@ -165,13 +164,31 @@ Func deleteCalls Data = currentSetAtDestination.ToArray(), }); - var syncClient = Get>(); - await syncClient.Sync(templateWorkflows); - _workflowClient.Verify(x => x.Get(It.IsAny()), getCalls); - _workflowClient.Verify(x => x.Create(It.IsAny()), createCalls); - _workflowClient.Verify(x => x.Update(It.IsAny(), It.IsAny()), updateCalls); - _workflowClient.Verify(x => x.Delete(It.IsAny()), deleteCalls); + client.Verify(x => x.Get(It.IsAny()), getCalls); + client.Verify(x => x.Create(It.IsAny()), createCalls); + client.Verify(x => x.Update(It.IsAny(), It.IsAny()), updateCalls); + client.Verify(x => x.Delete(It.IsAny()), deleteCalls); + } + + /// + /// Automatically bootstrapped through Xunit lifecycle + /// see https://github.com/pengweiqhca/Xunit.DependencyInjection + /// + public class Startup + { + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + var client = new Mock(); + + services + .ConfigureTestServices(context) + .RegisterNovuSync() + // inject the mock into each test + .AddScoped(typeof(Mock), _ => client) + // override the registered service with a mock + .AddScoped(_ => client.Object); + } } } \ No newline at end of file diff --git a/src/Novu.Tests/Novu.Tests.csproj b/src/Novu.Tests/Novu.Tests.csproj index c8e20b4..0a30d21 100644 --- a/src/Novu.Tests/Novu.Tests.csproj +++ b/src/Novu.Tests/Novu.Tests.csproj @@ -1,10 +1,10 @@  - net7.0 false Novu.Tests 0.0.0 + net8.0 @@ -14,18 +14,20 @@ - - - - + + + + - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -49,5 +51,10 @@ PreserveNewest + + + + + diff --git a/src/Novu.Tests/StartUpRegistrationExtensions.cs b/src/Novu.Tests/StartUpRegistrationExtensions.cs new file mode 100644 index 0000000..9004ad9 --- /dev/null +++ b/src/Novu.Tests/StartUpRegistrationExtensions.cs @@ -0,0 +1,22 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Novu.Extensions; +using Xunit.DependencyInjection.Logging; + +namespace Novu.Tests; + +public static class StartUpRegistrationExtensions +{ + /// + /// Used as the basis for any integration tests DI + /// + public static IServiceCollection ConfigureTestServices(this IServiceCollection services, HostBuilderContext context) + { + context.SetNovuConfiguration("Integration"); + return services + // register external loggers and then retain with serilog + .AddLogging(lb => lb.AddXunitOutput()) + ; + } +} \ No newline at end of file diff --git a/src/Novu.Tests/Startup.cs b/src/Novu.Tests/Startup.cs new file mode 100644 index 0000000..c0b96af --- /dev/null +++ b/src/Novu.Tests/Startup.cs @@ -0,0 +1,17 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Novu.Tests; + +/// +/// Automatically bootstrapped through Xunit lifecycle +/// see https://github.com/pengweiqhca/Xunit.DependencyInjection +/// +public class Startup +{ + public void ConfigureServices(IServiceCollection services, HostBuilderContext context) + { + services + .ConfigureTestServices(context); + } +} \ No newline at end of file diff --git a/src/Novu.sln b/src/Novu.sln index 3c6797d..b98fba0 100644 --- a/src/Novu.sln +++ b/src/Novu.sln @@ -16,8 +16,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionFolder", "SolutionF ..\CONTRIBUTING.md = ..\CONTRIBUTING.md ..\CODE_OF_CONDUCT.md = ..\CODE_OF_CONDUCT.md ..\README.md = ..\README.md + docker-compose.yml = docker-compose.yml + env.example = env.example EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Novu.Domain", "Novu.Domain\Novu.Domain.csproj", "{C9E1DF40-7412-4044-9E80-EB1DE4450499}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -40,5 +44,9 @@ Global {03F3C972-3416-49E3-8C24-1F926C3C04D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {03F3C972-3416-49E3-8C24-1F926C3C04D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {03F3C972-3416-49E3-8C24-1F926C3C04D1}.Release|Any CPU.Build.0 = Release|Any CPU + {C9E1DF40-7412-4044-9E80-EB1DE4450499}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9E1DF40-7412-4044-9E80-EB1DE4450499}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9E1DF40-7412-4044-9E80-EB1DE4450499}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9E1DF40-7412-4044-9E80-EB1DE4450499}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/Novu/Models/ApiClientConfiguration.cs b/src/Novu/ApiClientConfiguration.cs similarity index 73% rename from src/Novu/Models/ApiClientConfiguration.cs rename to src/Novu/ApiClientConfiguration.cs index faa3d6a..1a03150 100644 --- a/src/Novu/Models/ApiClientConfiguration.cs +++ b/src/Novu/ApiClientConfiguration.cs @@ -1,6 +1,6 @@ -using Novu.Interfaces; +using Novu.Domain; -namespace Novu.Models; +namespace Novu; public class ApiClientConfiguration : IApiConfiguration { diff --git a/src/Novu/Clients/IBlueprintClient.cs b/src/Novu/Clients/IBlueprintClient.cs new file mode 100644 index 0000000..1421bc9 --- /dev/null +++ b/src/Novu/Clients/IBlueprintClient.cs @@ -0,0 +1,72 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Blueprints; +using Refit; + +namespace Novu.Clients; + +public interface IBlueprintClient +{ + /// A representing the result of the request. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/blueprints/group-by-category")] + Task> Get(); + + /// A representing the result of the request. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/blueprints/{templateIdOrIdentifier}")] + Task> Get(string templateIdOrIdentifier); +} \ No newline at end of file diff --git a/src/Novu/Clients/IChangeClient.cs b/src/Novu/Clients/IChangeClient.cs new file mode 100644 index 0000000..e28a46d --- /dev/null +++ b/src/Novu/Clients/IChangeClient.cs @@ -0,0 +1,143 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Changes; +using Refit; + +namespace Novu.Clients; + +public interface IChangeClient +{ + /// Get changes + /// A representing the result of the request. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/changes")] + Task> Get( + [Query] double? page = 1, + [Query] double? limit = 100, + [Query] string promoted = "false"); + + /// Get changes count + /// A representing the result of the request. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/changes/count")] + Task> GetCount(); + + /// Apply changes + /// Created + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/changes/bulk/apply")] + Task>> Create([Body] ChangesCreateData body); + + /// Apply change + /// Created + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/changes/{changeId}/apply")] + public Task>> Create(string changeId); +} \ No newline at end of file diff --git a/src/Novu/Clients/IEnvironmentClient.cs b/src/Novu/Clients/IEnvironmentClient.cs new file mode 100644 index 0000000..07d6afc --- /dev/null +++ b/src/Novu/Clients/IEnvironmentClient.cs @@ -0,0 +1,140 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Environments; +using Refit; + +namespace Novu.Clients; + +public interface IEnvironmentClient +{ + /// Get current environment + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/environments/me")] + Task> Me(); + + /// Get environments + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/environments")] + Task> Get(); + + /// Get api keys + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/environments/api-keys")] + Task>> ApiKeys(); + + /// Regenerate api keys + /// Created + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/environments/api-keys/regenerate")] + Task>> Regenerate(); +} \ No newline at end of file diff --git a/src/Novu/Interfaces/IEventClient.cs b/src/Novu/Clients/IEventClient.cs similarity index 94% rename from src/Novu/Interfaces/IEventClient.cs rename to src/Novu/Clients/IEventClient.cs index e9593f3..bf6b463 100644 --- a/src/Novu/Interfaces/IEventClient.cs +++ b/src/Novu/Clients/IEventClient.cs @@ -1,8 +1,8 @@ -using Novu.DTO; -using Novu.DTO.Events; +using Novu.Domain.Models; +using Novu.Domain.Models.Events; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface IEventClient { @@ -12,12 +12,11 @@ public interface IEventClient /// /// Trigger a notification to all the subscribers assigned to a topic, which helps to have /// to avoid to list all the subscriber identifiers in the to field of the notification trigger - /// /// see https://docs.novu.co/platform/topics#sending-a-notification-to-a-topic /// [Post("/events/trigger")] Task> Create([Body] TopicCreateData data); - + [Post("/events/trigger/bulk")] Task>> CreateBulk([Body] BulkEventCreateData data); diff --git a/src/Novu/Interfaces/IExecutionDetailsClient.cs b/src/Novu/Clients/IExecutionDetailsClient.cs similarity index 80% rename from src/Novu/Interfaces/IExecutionDetailsClient.cs rename to src/Novu/Clients/IExecutionDetailsClient.cs index 8e98c2f..45ebb7d 100644 --- a/src/Novu/Interfaces/IExecutionDetailsClient.cs +++ b/src/Novu/Clients/IExecutionDetailsClient.cs @@ -1,9 +1,8 @@ -using Novu.DTO; -using Novu.DTO.Messages; -using Novu.Models.Notifications; +using Novu.Domain.Models; +using Novu.Domain.Models.Notifications; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface IExecutionDetailsClient { diff --git a/src/Novu/Clients/IFeedClient.cs b/src/Novu/Clients/IFeedClient.cs new file mode 100644 index 0000000..0d5e734 --- /dev/null +++ b/src/Novu/Clients/IFeedClient.cs @@ -0,0 +1,107 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Feeds; +using Refit; + +namespace Novu.Clients; + +public interface IFeedClient +{ + /// Get feeds + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/feeds")] + Task>> Get(); + + /// Create feed + /// Created + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/feeds")] + Task> Create([Body] FeedCreateData body); + + /// Delete feed + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Delete("/feeds/{feedId}")] + Task Delete(string feedId); +} \ No newline at end of file diff --git a/src/Novu/Interfaces/IIntegrationClient.cs b/src/Novu/Clients/IIntegrationClient.cs similarity index 96% rename from src/Novu/Interfaces/IIntegrationClient.cs rename to src/Novu/Clients/IIntegrationClient.cs index 58e5c68..56bbe6a 100644 --- a/src/Novu/Interfaces/IIntegrationClient.cs +++ b/src/Novu/Clients/IIntegrationClient.cs @@ -1,8 +1,8 @@ -using Novu.DTO; -using Novu.DTO.Integrations; +using Novu.Domain.Models; +using Novu.Domain.Models.Integrations; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; /// /// see https://docs.novu.co/api/integration-creation/ diff --git a/src/Novu/Interfaces/ILayoutClient.cs b/src/Novu/Clients/ILayoutClient.cs similarity index 92% rename from src/Novu/Interfaces/ILayoutClient.cs rename to src/Novu/Clients/ILayoutClient.cs index a72f341..37bd6e4 100644 --- a/src/Novu/Interfaces/ILayoutClient.cs +++ b/src/Novu/Clients/ILayoutClient.cs @@ -1,8 +1,9 @@ -using Novu.DTO; -using Novu.DTO.Layouts; +using Novu.Domain.Models; +using Novu.Domain.Models.Layouts; +using Novu.QueryParams; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; /// /// see https://docs.novu.co/api/layout-creation/ @@ -23,8 +24,8 @@ public interface ILayoutClient public Task> Get( [Query] int page = 0, [Query] int pageSize = 10, - [Query] string? sortBy = default, - [Query] int orderBy = default); + [Query] string? sortBy = null, + [Query] int orderBy = 0); [Get("/layouts")] public Task> Get([Query] PaginationQueryParams queryParams); diff --git a/src/Novu/Interfaces/IMessageClient.cs b/src/Novu/Clients/IMessageClient.cs similarity index 75% rename from src/Novu/Interfaces/IMessageClient.cs rename to src/Novu/Clients/IMessageClient.cs index d68c95a..d2e5ae6 100644 --- a/src/Novu/Interfaces/IMessageClient.cs +++ b/src/Novu/Clients/IMessageClient.cs @@ -1,9 +1,9 @@ -using Novu.DTO; -using Novu.DTO.Layouts; -using Novu.DTO.Messages; +using Novu.Domain.Models; +using Novu.Domain.Models.Messages; +using Novu.QueryParams; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; /// /// see https://docs.novu.co/api/get-messages/ @@ -22,9 +22,9 @@ public interface IMessageClient public Task> Get( [Query] int page = 0, [Query] int limit = 100, - [Query] string? channel = default, - [Query] string? subscriberId = default, - [Query] string? transactionId = default); + [Query] string? channel = null, + [Query] string? subscriberId = null, + [Query] string? transactionId = null); /// /// see https://docs.novu.co/api/get-messages/ @@ -37,5 +37,5 @@ public Task> Get( /// see https://docs.novu.co/api/delete-message/ /// [Delete("/messages/{id}")] - public Task> Delete(string id); + public Task> Delete(string id); } \ No newline at end of file diff --git a/src/Novu/Clients/IMxRecordClient.cs b/src/Novu/Clients/IMxRecordClient.cs new file mode 100644 index 0000000..6a2ab4f --- /dev/null +++ b/src/Novu/Clients/IMxRecordClient.cs @@ -0,0 +1,41 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.MxRecords; +using Refit; + +namespace Novu.Clients; + +public interface IMxRecordClient +{ + /// Validate the mx record setup for the inbound parse functionality + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/inbound-parse/mx/status")] + Task> Get(); +} \ No newline at end of file diff --git a/src/Novu/Interfaces/INotificationsClient.cs b/src/Novu/Clients/INotificationsClient.cs similarity index 81% rename from src/Novu/Interfaces/INotificationsClient.cs rename to src/Novu/Clients/INotificationsClient.cs index 49c6ebe..90c9dd7 100644 --- a/src/Novu/Interfaces/INotificationsClient.cs +++ b/src/Novu/Clients/INotificationsClient.cs @@ -1,8 +1,9 @@ -using Novu.DTO; -using Novu.DTO.Notifications; +using Novu.Domain.Models; +using Novu.Domain.Models.Notifications; +using Novu.QueryParams; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface INotificationsClient { diff --git a/src/Novu/Interfaces/INovuClient.cs b/src/Novu/Clients/INovuClient.cs similarity index 93% rename from src/Novu/Interfaces/INovuClient.cs rename to src/Novu/Clients/INovuClient.cs index 68d61ba..8baed55 100644 --- a/src/Novu/Interfaces/INovuClient.cs +++ b/src/Novu/Clients/INovuClient.cs @@ -1,4 +1,4 @@ -namespace Novu.Interfaces; +namespace Novu.Clients; public interface INovuClient { diff --git a/src/Novu/Clients/IOrganizationBrandingrClient.cs b/src/Novu/Clients/IOrganizationBrandingrClient.cs new file mode 100644 index 0000000..e890184 --- /dev/null +++ b/src/Novu/Clients/IOrganizationBrandingrClient.cs @@ -0,0 +1,41 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Organizations; +using Refit; + +namespace Novu.Clients; + +public interface IOrganizationBrandClient +{ + /// Update organization branding details based on the ApiKey provided + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Put("/organizations/branding")] + Task> Update([Body] BrandingEditData data); +} \ No newline at end of file diff --git a/src/Novu/Clients/IOrganizationClient.cs b/src/Novu/Clients/IOrganizationClient.cs new file mode 100644 index 0000000..3764d85 --- /dev/null +++ b/src/Novu/Clients/IOrganizationClient.cs @@ -0,0 +1,140 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Organizations; +using Refit; + +namespace Novu.Clients; + +public interface IOrganizationClient +{ + /// Create an organization + /// Created + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/organizations")] + Task> Create([Body] OrganizationCreateData body); + + /// Fetch all organizations + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/organizations")] + Task>> Get(); + + /// Rename organization name + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Patch("/organizations")] + Task> Update([Body] OrganizationEditData data); + + /// Fetch current organization details + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/organizations/me")] + Task> Me(); +} \ No newline at end of file diff --git a/src/Novu/Clients/IOrganizationMemberClient.cs b/src/Novu/Clients/IOrganizationMemberClient.cs new file mode 100644 index 0000000..879eaf6 --- /dev/null +++ b/src/Novu/Clients/IOrganizationMemberClient.cs @@ -0,0 +1,76 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Organizations; +using Refit; + +namespace Novu.Clients; + +public interface IOrganizationMemberClient +{ + + /// Remove a member from organization using memberId + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Delete("/organizations/members/{memberId}")] + Task> Delete(string memberId); + + /// Fetch all members of current organizations + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/organizations/members")] + Task>> Get(); + +} \ No newline at end of file diff --git a/src/Novu/Interfaces/ISubscriberClient.cs b/src/Novu/Clients/ISubscriberClient.cs similarity index 83% rename from src/Novu/Interfaces/ISubscriberClient.cs rename to src/Novu/Clients/ISubscriberClient.cs index fea97c4..878ea12 100644 --- a/src/Novu/Interfaces/ISubscriberClient.cs +++ b/src/Novu/Clients/ISubscriberClient.cs @@ -1,11 +1,13 @@ -using Novu.DTO; -using Novu.DTO.Notifications; -using Novu.DTO.Subscribers; -using Novu.DTO.Subscribers.Notifications; -using Novu.DTO.Subscribers.Preferences; +using Novu.Domain.Models; +using Novu.Domain.Models.Notifications; +using Novu.Domain.Models.Subscribers; +using Novu.Domain.Models.Subscribers.Notifications; +using Novu.Domain.Models.Subscribers.Preferences; +using Novu.QueryParams; using Refit; +using Subscriber = Novu.Domain.Models.Subscribers.Subscriber; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface ISubscriberClient { @@ -18,7 +20,7 @@ public interface ISubscriberClient /// [Get("/subscribers")] Task> Get([Query] int page = 0, int limit = 100); - + [Get("/subscribers")] Task> Get([Query] SubscriberQueryParams? queryParams = default); @@ -33,14 +35,14 @@ public interface ISubscriberClient /// /// Create a new Subscriber /// - /// + /// /// Model to create a new Subscriber /// /// /// The newly created Subscriber /// [Post("/subscribers")] - Task> Create([Body] SubscriberCreateData dto); + Task> Create([Body] SubscriberCreateData data); /// /// Update a Subscriber @@ -55,7 +57,7 @@ public interface ISubscriberClient /// Subscriber ID to delete /// [Delete("/subscribers/{id}")] - Task> DeleteSubscriber(string id); + Task> DeleteSubscriber(string id); /// /// Update Subscribers online status @@ -73,7 +75,7 @@ Task> UpdatePreference( [Body] SubscriberPreferenceEditData model); [Get("/subscribers/{id}/notifications/feed")] - Task> GetInApp(string id, [Query] InAppFeedQueryParams? queryParams = default); + Task> GetInApp(string id, [Query] InAppFeedQueryParams? queryParams = null); [Get("/subscribers/{id}/notifications/unseen")] Task> GetInAppUnseen(string id); diff --git a/src/Novu/Clients/ITenantClient.cs b/src/Novu/Clients/ITenantClient.cs new file mode 100644 index 0000000..2bf72bc --- /dev/null +++ b/src/Novu/Clients/ITenantClient.cs @@ -0,0 +1,193 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.Tenants; +using Refit; + +namespace Novu.Clients; + +public interface ITenantClient +{ + /// Get tenants + /// Returns a list of tenants, could paginated using the `page` and `limit` query parameter + /// A representing the result of the request. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/tenants")] + Task> Get([Query] double? page = 1, [Query] double? limit = 10); + + /// Create tenant + /// Create tenant under the current environment + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// A tenant with the same identifier is already exist. + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/tenants")] + Task> Create([Body] TenantCreateData body); + + /// Get tenant + /// Get tenant by your internal id used to identify the tenant + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 404 + /// The tenant with the identifier provided does not exist in the database. + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/tenants/{identifier}")] + Task Get(string identifier); + + /// Update tenant + /// Update tenant by your internal id used to identify the tenant + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 404 + /// The tenant with the identifier provided does not exist in the database. + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Patch("/tenants/{identifier}")] + Task Update(string identifier, [Body] TenantEditData data); + + /// Delete tenant + /// Deletes a tenant entity from the Novu platform + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 404 + /// + /// The tenant with the identifier provided does not exist in the database so it can not be + /// deleted. + /// + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + /// + /// Ensure you use + /// + [Headers("Accept: application/json")] + [Delete("/tenants/{identifier}")] + Task Delete(string identifier); +} \ No newline at end of file diff --git a/src/Novu/Interfaces/ITopicClient.cs b/src/Novu/Clients/ITopicClient.cs similarity index 96% rename from src/Novu/Interfaces/ITopicClient.cs rename to src/Novu/Clients/ITopicClient.cs index d6a064d..5ab7962 100644 --- a/src/Novu/Interfaces/ITopicClient.cs +++ b/src/Novu/Clients/ITopicClient.cs @@ -1,8 +1,8 @@ -using Novu.DTO; -using Novu.DTO.Topics; +using Novu.Domain.Models; +using Novu.Domain.Models.Topics; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface ITopicClient { @@ -84,7 +84,7 @@ public interface ITopicClient /// /// [Post("/topics/{topicKey}/subscribers")] - public Task> AddSubscriber(string topicKey, TopicSubscriberCreateData data); + public Task> AddSubscriber(string topicKey, TopicSubscriberCreateData data); /// /// Check if a subscriber belongs to a certain topic diff --git a/src/Novu/Interfaces/IWorkflowClient.cs b/src/Novu/Clients/IWorkflowClient.cs similarity index 92% rename from src/Novu/Interfaces/IWorkflowClient.cs rename to src/Novu/Clients/IWorkflowClient.cs index fee3b5c..021caf1 100644 --- a/src/Novu/Interfaces/IWorkflowClient.cs +++ b/src/Novu/Clients/IWorkflowClient.cs @@ -1,8 +1,9 @@ -using Novu.DTO; -using Novu.DTO.Workflows; +using Novu.Domain.Models; +using Novu.Domain.Models.Workflows; +using Novu.QueryParams; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface IWorkflowClient { diff --git a/src/Novu/Interfaces/IWorkflowGroupClient.cs b/src/Novu/Clients/IWorkflowGroupClient.cs similarity index 85% rename from src/Novu/Interfaces/IWorkflowGroupClient.cs rename to src/Novu/Clients/IWorkflowGroupClient.cs index 4a5fd70..3730a8f 100644 --- a/src/Novu/Interfaces/IWorkflowGroupClient.cs +++ b/src/Novu/Clients/IWorkflowGroupClient.cs @@ -1,8 +1,8 @@ -using Novu.DTO; -using Novu.DTO.WorkflowGroups; +using Novu.Domain.Models; +using Novu.Domain.Models.WorkflowGroups; using Refit; -namespace Novu.Interfaces; +namespace Novu.Clients; public interface IWorkflowGroupClient { diff --git a/src/Novu/Clients/IWorkflowOverrideClient.cs b/src/Novu/Clients/IWorkflowOverrideClient.cs new file mode 100644 index 0000000..c225782 --- /dev/null +++ b/src/Novu/Clients/IWorkflowOverrideClient.cs @@ -0,0 +1,244 @@ +using Novu.Domain.Models; +using Novu.Domain.Models.WorkflowOverrides; +using Refit; + +namespace Novu.Clients; + +public interface IWorkflowOverrideClient +{ + /// Create workflow override + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Post("/workflow-overrides")] + Task> Create([Body] WorkflowOverrideCreateData body); + + /// Get workflow overrides + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/workflow-overrides")] + Task> Get( + [Query] double? page = null, + [Query] double? limit = null); + + /// Update workflow override by id + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Put("/workflow-overrides/{overrideId}")] + Task> Update(string overrideId, [Body] WorkflowOverrideEditData body); + + /// Get workflow override by id + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/workflow-overrides/{overrideId}")] + Task> Get(string overrideId); + + /// Delete workflow override + /// A representing the result of the request. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Delete("/workflow-overrides/{overrideId}")] + Task> Delete(string overrideId); + + /// Update workflow override + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Put("/workflow-overrides/workflows/{workflowId}/tenants/{tenantId}")] + Task> Update( + string workflowId, + string tenantId, + [Body] WorkflowOverrideEditData body); + + /// Get workflow override + /// Ok + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 409 + /// + /// The request could not be completed due to a conflict with the current state of the target + /// resource. + /// + /// + /// + /// 429 + /// The client has sent too many requests in a given amount of time. + /// + /// + /// 503 + /// + /// The server is currently unable to handle the request due to a temporary overload or scheduled + /// maintenance, which will likely be alleviated after some delay. + /// + /// + /// + /// + [Headers("Accept: application/json")] + [Get("/workflow-overrides/workflows/{workflowId}/tenants/{tenantId}")] + Task> Get(string workflowId, string tenantId); +} \ No newline at end of file diff --git a/src/Novu/Models/Events/EventTo.cs b/src/Novu/Models/Events/EventTo.cs deleted file mode 100644 index f344a83..0000000 --- a/src/Novu/Models/Events/EventTo.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Newtonsoft.Json; - -namespace Novu.Models.Events; - -public record EventTo -{ - /// - /// Subscriber ID to send the event to. - /// - [JsonProperty("subscriberId")] - public string SubscriberId { get; set; } - - /// - /// Subscriber email to be populated in workflows. - /// - [JsonProperty("email", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Email { get; set; } - - /// - /// Subscriber phone to be populated in workflows. - /// - [JsonProperty("phone", Required = Required.AllowNull, DefaultValueHandling = DefaultValueHandling.Ignore)] - public string Phone { get; set; } -} \ No newline at end of file diff --git a/src/Novu/Novu.csproj b/src/Novu/Novu.csproj index 712e645..4627503 100644 --- a/src/Novu/Novu.csproj +++ b/src/Novu/Novu.csproj @@ -43,5 +43,8 @@ + + + diff --git a/src/Novu/NovuClient.cs b/src/Novu/NovuClient.cs index 9ecd412..20bcc98 100644 --- a/src/Novu/NovuClient.cs +++ b/src/Novu/NovuClient.cs @@ -1,56 +1,56 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Serialization; -using Novu.Interfaces; +using Novu.Clients; +using Novu.Domain; using Refit; namespace Novu; public class NovuClient : INovuClient { - public static readonly JsonSerializerSettings DefaultSerializerSettings = new() - { - MissingMemberHandling = MissingMemberHandling.Ignore, - NullValueHandling = NullValueHandling.Ignore, - ContractResolver = new DefaultContractResolver - { - NamingStrategy = new CamelCaseNamingStrategy(), - }, - // General enum conversions are required to the in-place strings - Converters = new List - { - new StringEnumConverter(), - }, - }; + private const string AuthorizationHeaderName = "Authorization"; public NovuClient( INovuClientConfiguration configuration, - HttpClient? client = default, - RefitSettings? refitSettings = default) + HttpClient? client = null, + RefitSettings? refitSettings = null) { var httpClient = client ?? new HttpClient(); httpClient.BaseAddress = new Uri(configuration.Url); - httpClient.DefaultRequestHeaders.Add("Authorization", $"ApiKey {configuration.ApiKey}"); + httpClient.DefaultRequestHeaders.Add(AuthorizationHeaderName, $"ApiKey {configuration.ApiKey}"); refitSettings ??= new RefitSettings { - ContentSerializer = new NewtonsoftJsonContentSerializer(DefaultSerializerSettings), + ContentSerializer = new NewtonsoftJsonContentSerializer(NovuJsonSettings.DefaultSerializerSettings), }; Subscriber = RestService.For(httpClient, refitSettings); Event = RestService.For(httpClient, refitSettings); Topic = RestService.For(httpClient, refitSettings); - WorkflowGroup = RestService.For(httpClient, refitSettings); Workflow = RestService.For(httpClient, refitSettings); + WorkflowGroup = RestService.For(httpClient, refitSettings); + WorkflowOverride = RestService.For(httpClient, refitSettings); Layout = RestService.For(httpClient, refitSettings); Integration = RestService.For(httpClient, refitSettings); Notifications = RestService.For(httpClient, refitSettings); Message = RestService.For(httpClient, refitSettings); ExecutionDetails = RestService.For(httpClient, refitSettings); + Feeds = RestService.For(httpClient, refitSettings); + Changes = RestService.For(httpClient, refitSettings); + Tenant = RestService.For(httpClient, refitSettings); + MxRecord = RestService.For(httpClient, refitSettings); + Organization = RestService.For(httpClient, refitSettings); + OrganizationMember = RestService.For(httpClient, refitSettings); + OrganizationBrand = RestService.For(httpClient, refitSettings); + Environment = RestService.For(httpClient, refitSettings); + Blueprint = RestService.For(httpClient, refitSettings); } + public IFeedClient Feeds { get; } + public IChangeClient Changes { get; } + public IWorkflowClient Workflow { get; } + public IWorkflowGroupClient WorkflowGroup { get; } + public IWorkflowOverrideClient WorkflowOverride { get; } public ILayoutClient Layout { get; } public IIntegrationClient Integration { get; } public INotificationsClient Notifications { get; } @@ -59,5 +59,11 @@ public NovuClient( public ISubscriberClient Subscriber { get; } public IEventClient Event { get; } public ITopicClient Topic { get; } - public IWorkflowGroupClient WorkflowGroup { get; } + public ITenantClient Tenant { get; } + public IMxRecordClient MxRecord { get; } + public IOrganizationClient Organization { get; } + public IOrganizationMemberClient OrganizationMember { get; } + public IOrganizationBrandClient OrganizationBrand { get; } + public IEnvironmentClient Environment { get; } + public IBlueprintClient Blueprint { get; } } \ No newline at end of file diff --git a/src/Novu/Models/NovuClientConfiguration.cs b/src/Novu/NovuClientConfiguration.cs similarity index 77% rename from src/Novu/Models/NovuClientConfiguration.cs rename to src/Novu/NovuClientConfiguration.cs index 517ed42..4eddd47 100644 --- a/src/Novu/Models/NovuClientConfiguration.cs +++ b/src/Novu/NovuClientConfiguration.cs @@ -1,6 +1,6 @@ -using Novu.Interfaces; +using Novu.Domain; -namespace Novu.Models; +namespace Novu; public class NovuClientConfiguration : INovuClientConfiguration { diff --git a/src/Novu/DTO/Pagination.cs b/src/Novu/Pagination.cs similarity index 91% rename from src/Novu/DTO/Pagination.cs rename to src/Novu/Pagination.cs index a196d25..074c196 100644 --- a/src/Novu/DTO/Pagination.cs +++ b/src/Novu/Pagination.cs @@ -1,4 +1,7 @@ -namespace Novu.DTO; +using Novu.Domain.Models; +using Novu.QueryParams; + +namespace Novu; public static class Pagination { diff --git a/src/Novu/DTO/Subscribers/Notifications/InAppFeedQueryParams.cs b/src/Novu/QueryParams/InAppFeedQueryParams.cs similarity index 85% rename from src/Novu/DTO/Subscribers/Notifications/InAppFeedQueryParams.cs rename to src/Novu/QueryParams/InAppFeedQueryParams.cs index 79782d0..9ad49e5 100644 --- a/src/Novu/DTO/Subscribers/Notifications/InAppFeedQueryParams.cs +++ b/src/Novu/QueryParams/InAppFeedQueryParams.cs @@ -1,6 +1,6 @@ using Refit; -namespace Novu.DTO.Subscribers.Notifications; +namespace Novu.QueryParams; public class InAppFeedQueryParams { diff --git a/src/Novu/DTO/Messages/MessageQueryParams.cs b/src/Novu/QueryParams/MessageQueryParams.cs similarity index 92% rename from src/Novu/DTO/Messages/MessageQueryParams.cs rename to src/Novu/QueryParams/MessageQueryParams.cs index b8c5dbf..936506c 100644 --- a/src/Novu/DTO/Messages/MessageQueryParams.cs +++ b/src/Novu/QueryParams/MessageQueryParams.cs @@ -1,6 +1,6 @@ using Refit; -namespace Novu.DTO.Messages; +namespace Novu.QueryParams; public class MessageQueryParams { diff --git a/src/Novu/DTO/Notifications/NotificationQueryParams.cs b/src/Novu/QueryParams/NotificationQueryParams.cs similarity index 93% rename from src/Novu/DTO/Notifications/NotificationQueryParams.cs rename to src/Novu/QueryParams/NotificationQueryParams.cs index baa39c6..de57396 100644 --- a/src/Novu/DTO/Notifications/NotificationQueryParams.cs +++ b/src/Novu/QueryParams/NotificationQueryParams.cs @@ -1,6 +1,6 @@ using Refit; -namespace Novu.DTO.Notifications; +namespace Novu.QueryParams; public class NotificationQueryParams { diff --git a/src/Novu/DTO/PaginationQueryParams.cs b/src/Novu/QueryParams/PaginationQueryParams.cs similarity index 97% rename from src/Novu/DTO/PaginationQueryParams.cs rename to src/Novu/QueryParams/PaginationQueryParams.cs index 8f93455..58c2a3e 100644 --- a/src/Novu/DTO/PaginationQueryParams.cs +++ b/src/Novu/QueryParams/PaginationQueryParams.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Refit; -namespace Novu.DTO; +namespace Novu.QueryParams; /// /// Base pagination query params for diff --git a/src/Novu/DTO/Subscribers/SubscriberQueryParams.cs b/src/Novu/QueryParams/SubscriberQueryParams.cs similarity index 89% rename from src/Novu/DTO/Subscribers/SubscriberQueryParams.cs rename to src/Novu/QueryParams/SubscriberQueryParams.cs index c63f09e..63bc38c 100644 --- a/src/Novu/DTO/Subscribers/SubscriberQueryParams.cs +++ b/src/Novu/QueryParams/SubscriberQueryParams.cs @@ -1,6 +1,6 @@ using Refit; -namespace Novu.DTO.Subscribers; +namespace Novu.QueryParams; public class SubscriberQueryParams { diff --git a/src/docker-compose.yml b/src/docker-compose.yml new file mode 100644 index 0000000..a880c2c --- /dev/null +++ b/src/docker-compose.yml @@ -0,0 +1,257 @@ +services: + # s3 minio is used for local development (rather than tests) + # because it stores files across docker restart unlike localstack free version (requires pro) + s3: + image: 'minio/minio:latest' + container_name: dotnet-novu-s3-minio + ports: + - ${FORWARD_MINIO_PORT:-9000}:9000 + - ${FORWARD_MINIO_CONSOLE_PORT:-9090}:9090 + environment: + MINIO_ROOT_USER: '${AWS_ACCESS_KEY_ID}' + MINIO_ROOT_PASSWORD: '${AWS_SECRET_ACCESS_KEY}' + MINIO_API_CORS_ALLOW_ORIGIN: http://localhost:${APP_PORT} + restart: always + volumes: + - 'minio:/data/minio' + command: minio server /data/minio --console-address ":9090" + networks: + - novu + # + # Novu notification services + # see https://github.com/novuhq/novu/blob/next/docker/local/deployment/docker-compose.yml + # + redis: + image: 'redis:alpine' + container_name: dotnet-novu-redis + restart: unless-stopped + ports: + - ${REDIS_PORT:-6379}:6379 + healthcheck: + test: "bash -c 'redis-cli ping'" + retries: 5 + interval: 10s + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + networks: + - novu +# redis-slave: +# image: 'redis:alpine' +# container_name: redis-slave +# restart: unless-stopped +# command: redis-server --slaveof redis-master 6379 +# logging: +# driver: 'json-file' +# options: +# max-size: '50m' +# max-file: '5' +# networks: +# - novu + mongodb: + image: mongo + container_name: dotnet-novu-mongodb + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + - PUID=1000 + - PGID=1000 + volumes: + - mongodb:/data/db + ports: + - ${MONGO_PORT:-27017}:27017 + networks: + - novu + novu-api: + image: 'ghcr.io/novuhq/novu/api:${IMAGE_VERSION}' + depends_on: + - mongodb + - redis + container_name: dotnet-novu-api + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + NODE_ENV: ${NODE_ENV} + API_ROOT_URL: http://localhost:${API_PORT} + DISABLE_USER_REGISTRATION: ${DISABLE_USER_REGISTRATION} + PORT: ${API_PORT} + FRONT_BASE_URL: http://localhost:${APP_PORT} + MONGO_URL: mongodb://mongodb:${MONGO_PORT}/novu-db + MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + REDIS_PASSWORD: ${REDIS_PASSWORD} + REDIS_DB_INDEX: 2 + REDIS_CACHE_SERVICE_HOST: ${REDIS_CACHE_SERVICE_HOST} + REDIS_CACHE_SERVICE_PORT: ${REDIS_CACHE_SERVICE_PORT} + S3_LOCAL_STACK: http://localhost:${FORWARD_MINIO_CONSOLE_PORT} + S3_BUCKET_NAME: ${S3_BUCKET_NAME} + S3_REGION: ${S3_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + JWT_SECRET: ${JWT_SECRET} + STORE_ENCRYPTION_KEY: ${STORE_ENCRYPTION_KEY} + SENTRY_DSN: ${SENTRY_DSN} + NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} + NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} + NEW_RELIC_AGENT_ENABLED: "false" + NEW_RELIC_MONITOR_MODE: "false" + NEW_RELIC_ENABLED: "false" + NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED: "false" + LOGGING_LEVEL: "warn" + API_CONTEXT_PATH: ${API_CONTEXT_PATH} + ports: + - ${API_PORT:-3000}:3000 + networks: + - novu + novu-worker: + image: 'ghcr.io/novuhq/novu/worker:${IMAGE_VERSION}' + depends_on: + - mongodb + - redis + container_name: dotnet-novu-worker + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + NODE_ENV: ${NODE_ENV} + MONGO_URL: mongodb://mongodb:${MONGO_PORT}/novu-db + MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + REDIS_PASSWORD: ${REDIS_PASSWORD} + REDIS_DB_INDEX: 2 + REDIS_CACHE_SERVICE_HOST: ${REDIS_CACHE_SERVICE_HOST} + REDIS_CACHE_SERVICE_PORT: ${REDIS_CACHE_SERVICE_PORT} + S3_LOCAL_STACK: http://localhost:${FORWARD_MINIO_CONSOLE_PORT} + S3_BUCKET_NAME: ${S3_BUCKET_NAME} + S3_REGION: ${S3_REGION} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + STORE_ENCRYPTION_KEY: ${STORE_ENCRYPTION_KEY} + SENTRY_DSN: ${SENTRY_DSN} + NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} + NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} + NEW_RELIC_AGENT_ENABLED: "false" + NEW_RELIC_MONITOR_MODE: "false" + NEW_RELIC_ENABLED: "false" + NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED: "false" + LOGGING_LEVEL: "warn" + networks: + - novu + novu-ws: + image: 'ghcr.io/novuhq/novu/ws:${IMAGE_VERSION}' + depends_on: + - mongodb + - redis + container_name: dotnet-novu-ws + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + PORT: ${WS_PORT} + NODE_ENV: ${NODE_ENV} + MONGO_URL: mongodb://mongodb:${MONGO_PORT}/novu-db + MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} + REDIS_HOST: ${REDIS_HOST} + REDIS_PORT: ${REDIS_PORT} + REDIS_PASSWORD: ${REDIS_PASSWORD} + JWT_SECRET: ${JWT_SECRET} + WS_CONTEXT_PATH: ${WS_CONTEXT_PATH} + LOGGING_LEVEL: "warn" + ports: + - ${WS_PORT:-3002}:3002 + networks: + - novu + novu-web: + image: 'ghcr.io/novuhq/novu/web:${IMAGE_VERSION}' + depends_on: + - novu-api + - novu-worker + container_name: dotnet-novu-web + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + REACT_APP_API_URL: http://localhost:${API_PORT} + REACT_APP_ENVIRONMENT: ${NODE_ENV} + REACT_APP_WIDGET_EMBED_PATH: http://localhost:${WIDGET_EMBED_PORT}/embed.umd.min.js + REACT_APP_DOCKER_HOSTED_ENV: 'true' + REACT_APP_WS_URL: http://localhost:${WS_PORT} + LOGGING_LEVEL: "warn" + # turned off because causing problems + IS_TEMPLATE_STORE_ENABLED: "false" + # requires that there is a primary integration per environment/organisation + IS_MULTI_PROVIDER_CONFIGURATION_ENABLED: "false" + IS_MULTI_TENANCY_ENABLED: "false" + ports: + - ${APP_PORT:-4200}:4200 + networks: + - novu + novu-widget: + image: 'ghcr.io/novuhq/novu/widget:${IMAGE_VERSION}' + depends_on: + - novu-api + - novu-worker + - novu-web + container_name: dotnet-novu-widget + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + REACT_APP_API_URL: http://localhost:${API_PORT} + REACT_APP_WS_URL: http://localhost:${WS_PORT} + REACT_APP_ENVIRONMENT: ${NODE_ENV} + WIDGET_CONTEXT_PATH: ${WIDGET_CONTEXT_PATH} + LOGGING_LEVEL: "warn" + ports: + - ${WIDGET_PORT:-4500}:4500 + networks: + - novu + novu-embed: + depends_on: + - novu-widget + image: 'ghcr.io/novuhq/novu/embed:${IMAGE_VERSION}' + container_name: dotnet-novu-embed + restart: unless-stopped + logging: + driver: 'json-file' + options: + max-size: '50m' + max-file: '5' + environment: + WIDGET_URL: http://localhost:${WIDGET_PORT} + LOGGING_LEVEL: "warn" + ports: + - ${WIDGET_EMBED_PORT:-4701}:4701 + networks: + - novu +volumes: + data: + mongodb: ~ + minio: + driver: local +networks: + novu: diff --git a/src/env.example b/src/env.example new file mode 100644 index 0000000..9a92012 --- /dev/null +++ b/src/env.example @@ -0,0 +1,55 @@ +# +# copy this file to .env to be picked up by docker-compose +# +# see https://github.com/novuhq/novu/pkgs/container/novu%2Fapi to find version +IMAGE_VERSION=0.24.0 + +# Secrets +# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION +JWT_SECRET=> +STORE_ENCRYPTION_KEY= + +# General +NODE_ENV=local + +MONGO_PORT=27017 +MONGO_MAX_POOL_SIZE=500 + +FORWARD_MINIO_CONSOLE_PORT=9090 +FORWARD_MINIO_PORT=9000 + +REDIS_PORT=6379 +REDIS_CACHE_SERVICE_PORT=6379 +REDIS_HOST=redis +REDIS_CACHE_SERVICE_HOST= +REDIS_PASSWORD= + +# AWS +AWS_REGION=us-east-1 +AWS_ACCESS_KEY_ID=<4_CHARS> +AWS_SECRET_ACCESS_KEY=<7_CHARS> + +S3_BUCKET_NAME=local-notifications +S3_REGION=us-east-1 + +# Novu Ports +API_PORT=3000 +WS_PORT=3002 +APP_PORT=4200 +WIDGET_PORT=4500 +WIDGET_EMBED_PORT=4701 + +DISABLE_USER_REGISTRATION=false + +# Context Paths +# Only needed for setups with reverse-proxies +GLOBAL_CONTEXT_PATH= +WEB_CONTEXT_PATH= +API_CONTEXT_PATH= +WS_CONTEXT_PATH= +WIDGET_CONTEXT_PATH= + +# Analytics +SENTRY_DSN= +NEW_RELIC_APP_NAME= +NEW_RELIC_LICENSE_KEY=