---
title: "Update a workflow"
method: PATCH
path: "/v2/workflows/{workflowId}"
tags: ["Workflows"]
---

# Update a workflow

`PATCH /v2/workflows/{workflowId}`

Partially updates a workflow by its unique identifier **workflowId**

## Path parameters

- `workflowId` string, required

## Request body

- PatchWorkflowDto
  - `active` boolean — Activate or deactivate the workflow
  - `name` string — New name for the workflow
  - `description` string — Updated description of the workflow
  - `tags` string[] — Tags associated with the workflow
  - `payloadSchema` object, nullable — The payload JSON Schema for the workflow
  - `validatePayload` boolean — Enable or disable payload schema validation
  - `isTranslationEnabled` boolean — Enable or disable translations for this workflow

## Response `200`

OK

- WorkflowResponseDto
  - `name` string, required — Name of the workflow
  - `description` string — Description of the workflow
  - `tags` string[] — Tags associated with the workflow
  - `active` boolean — Whether the workflow is active
  - `validatePayload` boolean — Enable or disable payload schema validation
  - `payloadSchema` object, nullable — The payload JSON Schema for the workflow
  - `isTranslationEnabled` boolean — Enable or disable translations for this workflow
  - `agent` WorkflowAgentConfigDto
    - `identifier` string, required — Public agent identifier used to route this workflow through an agent's connected channels.
    - `providers` object — Optional per-provider overrides keyed by providerId (e.g. novu-email-agent). Today only Novu Email replyTo is supported.
  - `_id` string, required — Database identifier of the workflow
  - `workflowId` string, required — Workflow identifier
  - `slug` string, required — Slug of the workflow
  - `updatedAt` string, required — Last updated timestamp
  - `createdAt` string, required — Creation timestamp
  - `updatedBy` UserResponseDto
    - `_id` string, required — User ID
    - `firstName` string, nullable — User first name
    - `lastName` string, nullable — User last name
    - `externalId` string, nullable — User external ID
  - `lastPublishedAt` string, nullable — Timestamp of the last workflow publication
  - `lastPublishedBy` UserResponseDto
    - `_id` string, required — User ID
    - `firstName` string, nullable — User first name
    - `lastName` string, nullable — User last name
    - `externalId` string, nullable — User external ID
  - `steps` union[], required — Steps of the workflow
    - union
      - InAppStepResponseDto
        - `controls` InAppControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` InAppControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `body` string — Content/body of the in-app message. Required if subject is empty.
            - `subject` string — Subject/title of the in-app message. Required if body is empty.
            - `avatar` string — URL for an avatar image. Must be a valid URL or start with / or {{ variable }}.
            - `primaryAction` ActionDto
              - …
            - `secondaryAction` ActionDto
              - …
            - `redirect` RedirectDto
              - …
            - `disableOutputSanitization` boolean — Disable sanitization of the output.
            - `data` object — Additional data payload for the step.
        - `controlValues` InAppControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `body` string — Content/body of the in-app message. Required if subject is empty.
          - `subject` string — Subject/title of the in-app message. Required if body is empty.
          - `avatar` string — URL for an avatar image. Must be a valid URL or start with / or {{ variable }}.
          - `primaryAction` ActionDto
            - `label` string — Label for the action button.
            - `redirect` RedirectDto
              - …
          - `secondaryAction` ActionDto
            - `label` string — Label for the action button.
            - `redirect` RedirectDto
              - …
          - `redirect` RedirectDto
            - `url` string, required — URL to redirect to
            - `target` '_self' | '_blank' | '_parent' | '_top' | '_unfencedTop' — Target attribute for the redirect link
          - `disableOutputSanitization` boolean — Disable sanitization of the output.
          - `data` object — Additional data payload for the step.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - EmailStepResponseDto
        - `controls` EmailControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` EmailControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `subject` string, required — Subject of the email.
            - `body` string, required — Body content of the email, either a valid Maily JSON object, or html string.
            - `editorType` 'block' | 'html' — Type of editor to use for the body.
            - `disableOutputSanitization` boolean — Disable sanitization of the output.
            - `layoutId` string, nullable — Layout ID to use for the email. Null means no layout, undefined means default layout.
            - `from` EmailFromControlDto
              - …
            - `useProviderDefaults` boolean — When true, sender name/email use the primary email integration defaults and skip workflow agent defaults.
            - `replyTo` string — Step-level Reply-To override. When unset, inherits the workflow agent reply-to.
            - `preheader` string — One-line inbox preview text shown next to the subject.
        - `controlValues` EmailControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `subject` string, required — Subject of the email.
          - `body` string, required — Body content of the email, either a valid Maily JSON object, or html string.
          - `editorType` 'block' | 'html' — Type of editor to use for the body.
          - `disableOutputSanitization` boolean — Disable sanitization of the output.
          - `layoutId` string, nullable — Layout ID to use for the email. Null means no layout, undefined means default layout.
          - `from` EmailFromControlDto
            - `email` string — Sender email address override for this step.
            - `name` string — Sender display name override for this step.
          - `useProviderDefaults` boolean — When true, sender name/email use the primary email integration defaults and skip workflow agent defaults.
          - `replyTo` string — Step-level Reply-To override. When unset, inherits the workflow agent reply-to.
          - `preheader` string — One-line inbox preview text shown next to the subject.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - SmsStepResponseDto
        - `controls` SmsControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` SmsControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `body` string — Content of the SMS message.
        - `controlValues` SmsControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `body` string — Content of the SMS message.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - PushStepResponseDto
        - `controls` PushControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` PushControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `subject` string — Subject/title of the push notification.
            - `body` string — Body content of the push notification.
        - `controlValues` PushControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `subject` string — Subject/title of the push notification.
          - `body` string — Body content of the push notification.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - ChatStepResponseDto
        - `controls` ChatControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` ChatControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `body` string — Content of the chat message.
        - `controlValues` ChatControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `body` string — Content of the chat message.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - DelayStepResponseDto
        - `controls` DelayControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` DelayControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `type` 'regular' | 'timed', required — Type of the delay. Currently only 'regular' is supported by the schema.
            - `amount` number — Amount of time to delay.
            - `unit` 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' — Unit of time for the delay amount.
            - `cron` string — Cron expression for the delay. Min length 1.
        - `controlValues` DelayControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `type` 'regular' | 'timed', required — Type of the delay. Currently only 'regular' is supported by the schema.
          - `amount` number — Amount of time to delay.
          - `unit` 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' — Unit of time for the delay amount.
          - `cron` string — Cron expression for the delay. Min length 1.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - DigestStepResponseDto
        - `controls` DigestControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` DigestControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `type` 'regular' | 'timed' — The type of digest strategy. Determines which fields are applicable.
            - `amount` number — The amount of time for the digest interval (for REGULAR type). Min 1.
            - `unit` 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' — The unit of time for the digest interval (for REGULAR type).
            - `lookBackWindow` LookBackWindowDto
              - …
            - `cron` string — Cron expression for TIMED digest. Min length 1.
            - `digestKey` string — Specify a custom key for digesting events instead of the default event key.
        - `controlValues` DigestControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `type` 'regular' | 'timed' — The type of digest strategy. Determines which fields are applicable.
          - `amount` number — The amount of time for the digest interval (for REGULAR type). Min 1.
          - `unit` 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' — The unit of time for the digest interval (for REGULAR type).
          - `lookBackWindow` LookBackWindowDto
            - `amount` number, required — Amount of time for the look-back window.
            - `unit` 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months', required — Unit of time for the look-back window.
          - `cron` string — Cron expression for TIMED digest. Min length 1.
          - `digestKey` string — Specify a custom key for digesting events instead of the default event key.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - CustomStepResponseDto
        - `controls` CustomControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` CustomControlDto, required
            - `custom` object — Custom control values for the step.
        - `controlValues` CustomControlDto
          - `custom` object — Custom control values for the step.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - ThrottleStepResponseDto
        - `controls` ThrottleControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` ThrottleControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `type` 'fixed' | 'dynamic', required — The type of throttle window.
            - `amount` number — The amount of time for the throttle window (required for fixed type).
            - `unit` 'minutes' | 'hours' | 'days' — The unit of time for the throttle window (required for fixed type).
            - `dynamicKey` string — Key path to retrieve dynamic window value (required for dynamic type).
            - `threshold` number — The maximum number of executions allowed within the window. Defaults to 1.
            - `throttleKey` string — Optional key for grouping throttle rules. If not provided, defaults to workflow and subscriber combination.
        - `controlValues` ThrottleControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `type` 'fixed' | 'dynamic', required — The type of throttle window.
          - `amount` number — The amount of time for the throttle window (required for fixed type).
          - `unit` 'minutes' | 'hours' | 'days' — The unit of time for the throttle window (required for fixed type).
          - `dynamicKey` string — Key path to retrieve dynamic window value (required for dynamic type).
          - `threshold` number — The maximum number of executions allowed within the window. Defaults to 1.
          - `throttleKey` string — Optional key for grouping throttle rules. If not provided, defaults to workflow and subscriber combination.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - HttpRequestStepResponseDto
        - `controls` HttpRequestControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` HttpRequestControlDto, required
            - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required — HTTP method
            - `url` string, required — Target URL for the HTTP request
            - `headers` HttpRequestKeyValuePairDto[] — Request headers as key-value pairs
              - …
            - `body` union — Request body as a raw JSON string. Key-value arrays are supported for legacy workflows.
              - …
            - `responseBodySchema` object — JSON schema to validate response body against
            - `enforceSchemaValidation` boolean — Whether to enforce response body schema validation
            - `continueOnFailure` boolean — Whether to continue workflow execution on failure
        - `controlValues` HttpRequestControlDto
          - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required — HTTP method
          - `url` string, required — Target URL for the HTTP request
          - `headers` HttpRequestKeyValuePairDto[] — Request headers as key-value pairs
            - `key` string, required — Key of the key-value pair
            - `value` string, required — Value of the key-value pair
          - `body` union — Request body as a raw JSON string. Key-value arrays are supported for legacy workflows.
            - string
            - HttpRequestKeyValuePairDto[]
              - …
          - `responseBodySchema` object — JSON schema to validate response body against
          - `enforceSchemaValidation` boolean — Whether to enforce response body schema validation
          - `continueOnFailure` boolean — Whether to continue workflow execution on failure
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
      - ToolStepResponseDto
        - `controls` ToolControlsMetadataResponseDto, required
          - `dataSchema` object — JSON Schema for data
          - `uiSchema` UiSchema
            - `group` 'IN_APP' | 'EMAIL' | 'DIGEST' | 'DELAY' | 'THROTTLE' | 'SMS' | 'CHAT' | 'PUSH' | 'TOOL' | 'SKIP' | 'LAYOUT' | 'HTTP_REQUEST' — Group of the UI Schema
            - `properties` object — Properties of the UI Schema
          - `values` ToolControlDto, required
            - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
            - `body` string — Content of the tool payload.
        - `controlValues` ToolControlDto
          - `skip` object — JSONLogic filter conditions for conditionally skipping the step execution. Supports complex logical operations with AND, OR, and comparison operators. See https://jsonlogic.com/ for full typing reference.
          - `body` string — Content of the tool payload.
        - `providerOverrides` object, nullable — Per-provider content overrides keyed by providerId. Stored separately from controlValues and merged over the default body at send time. Keys are ChatProviderIdEnum / ToolProviderIdEnum values (e.g. `slack`, `whatsapp-business`, `pagerduty`).
        - `variables` object, required — JSON Schema for variables, follows the JSON Schema standard
        - `stepId` string, required — Unique identifier of the step
        - `_id` string, required — Database identifier of the step
        - `name` string, required — Name of the step
        - `slug` string, required — Slug of the step
        - `type` 'in_app' | 'email' | 'sms' | 'chat' | 'push' | 'tool' | 'digest' | 'trigger' | 'delay' | 'throttle' | 'custom' | 'http_request', required — Type of the step
        - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
        - `workflowId` string, required — Workflow identifier
        - `workflowDatabaseId` string, required — Workflow database identifier
        - `issues` StepIssuesDto
          - `controls` object — Controls-related issues
          - `integration` object — Integration-related issues
        - `stepResolverHash` string — Hash identifying the deployed Cloudflare Worker for this step
  - `origin` 'novu-cloud' | 'novu-cloud-v1' | 'external', required — Origin of the layout
  - `preferences` WorkflowPreferencesResponseDto, required
    - `user` WorkflowPreferencesDto
      - `all` WorkflowPreferenceDto, required
        - `enabled` boolean, required — A flag specifying if notification delivery is enabled for the workflow. If true, notification delivery is enabled by default for all channels. This setting can be overridden by the channel preferences.
        - `readOnly` boolean, required — A flag specifying if the preference is read-only. If true, the preference cannot be changed by the Subscriber.
      - `channels` object, required — Preferences for different communication channels
    - `default` WorkflowPreferencesDto, required
      - `all` WorkflowPreferenceDto, required
        - `enabled` boolean, required — A flag specifying if notification delivery is enabled for the workflow. If true, notification delivery is enabled by default for all channels. This setting can be overridden by the channel preferences.
        - `readOnly` boolean, required — A flag specifying if the preference is read-only. If true, the preference cannot be changed by the Subscriber.
      - `channels` object, required — Preferences for different communication channels
  - `status` 'ACTIVE' | 'INACTIVE' | 'ERROR', required — Status of the workflow
  - `issues` object — Runtime issues for workflow creation and update
  - `lastTriggeredAt` string, nullable — Timestamp of the last workflow trigger
  - `payloadExample` object, nullable — Generated payload example based on the payload schema
  - `severity` 'high' | 'medium' | 'low' | 'none', required — Severity of the workflow

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `405` — Method Not Allowed
- `409` — Conflict
- `413` — Payload Too Large
- `414` — URI Too Long
- `415` — Unsupported Media Type
- `422` — Unprocessable Entity
- `429` — The client has sent too many requests in a given amount of time.
- `500` — Internal Server Error
- `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.

---

[API](https://skmtc.net/novu/apis/deprecated-novu-api-use-openapi-json-yaml-instead.md) · [All operations](https://skmtc.net/novu/apis/deprecated-novu-api-use-openapi-json-yaml-instead/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/novu/deprecated-novu-api-use-openapi-json-yaml-instead/versions/986fe259fa85/schema)
