---
title: "Create a workflow node"
method: POST
path: "/v1/workflows/{workflowId}/nodes"
tags: ["Workflow nodes"]
---

# Create a workflow node

`POST /v1/workflows/{workflowId}/nodes`

Create a new default workflow node and return it with the latest workflow.

Choose where the node goes with `insertMode`: `between` places it between an existing `fromNodeId` -> `toNodeId` connection, `before` places it before `toNodeId`, and `after` places it after `fromNodeId` when that node has exactly one outgoing connection. `after` is a convenience for simple linear paths, so callers do not need to fetch and pass the current child node ID. It is invalid when `fromNodeId` has no outgoing nodes, multiple outgoing nodes, or is an exit node. When the source has multiple outgoing nodes, use `between` with the exact `toNodeId` instead. For `before`, deprecated `beforeNodeId` requests are still accepted for compatibility, but new callers should use `toNodeId`.

New nodes start with default settings; update the node after creation to configure it. Branch nodes create their default paths too: `BranchNode` creates two `AudienceFilter` children, and `ExperimentBranchNode` creates two regular `VariantNode` children plus one control `VariantNode`. Public workflows can have up to 400 nodes. Generated children count toward that limit, so a normal create adds 1 node, `BranchNode` adds 3, and `ExperimentBranchNode` adds 4. To add a sibling child path to a branch or experiment branch, use the `POST /v1/workflows/{workflowId}/nodes/{nodeId}/add-branch` endpoint. Branch paths can be edited with create-node, but a workflow cannot be started unless each direct `BranchNode` child is an `AudienceFilter`. For experiments, use create-node only to insert a missing `VariantNode` before non-variant content; use add-branch for another variant path.

## Request body

- union — Create a new workflow node with an explicit `insertMode`. To configure the node after creation, use the `POST /v1/workflows/{workflowId}/nodes/{nodeId}` endpoint.
  - CreateWorkflowNodeBetweenRequest — Insert a new node between two existing nodes, `fromNodeId` and `toNodeId`. When `fromNodeId` is an `ExperimentBranchNode`, `nodeTypeName` must be `VariantNode`, and `toNodeId` cannot already be a `VariantNode`; use add-branch to add sibling variants. Branch paths can be edited with create-node, but a workflow cannot be started unless each direct `BranchNode` child is an `AudienceFilter`.
    - `expectedRevisionId` string, nullable, required — The workflow revision token returned by the latest workflow read or mutation. Older workflows may return `null` before their first revision-aware mutation; pass `null` back as `expectedRevisionId` in that case. If the token is stale, the API returns a `409 Conflict` error.
    - `insertMode` 'between', required
    - `nodeTypeName` 'AudienceFilter' | 'BranchNode' | 'ExperimentBranchNode' | 'TimerAction' | 'SendEmailAction' | 'VariantNode', required — Node types that can be created with the API. `*Trigger` nodes and `ExitAction` nodes cannot be created.
    - `fromNodeId` string, required — The node to insert after. This node must currently point to `toNodeId`. If this is an `ExperimentBranchNode`, `nodeTypeName` must be `VariantNode` and `toNodeId` cannot already be a `VariantNode`.
    - `toNodeId` string, required — The node to insert before.
  - union — Insert a new node before `toNodeId`. `VariantNode` cannot use `insertMode: "before"`; to restore a missing variant path, use `insertMode: "between"` with the experiment branch as `fromNodeId`.
    - object
      - `expectedRevisionId` string, nullable, required — The workflow revision token returned by the latest workflow read or mutation. Older workflows may return `null` before their first revision-aware mutation; pass `null` back as `expectedRevisionId` in that case. If the token is stale, the API returns a `409 Conflict` error.
      - `insertMode` 'before', required
      - `nodeTypeName` 'AudienceFilter' | 'BranchNode' | 'ExperimentBranchNode' | 'TimerAction' | 'SendEmailAction' | 'VariantNode', required — Node types that can be created with the API. `*Trigger` nodes and `ExitAction` nodes cannot be created.
      - `toNodeId` string, required — The node to insert before. The target must have at least one incoming parent and cannot be a trigger node.
      - `beforeNodeId` string — Deprecated. Use `toNodeId` instead.
    - object
      - `expectedRevisionId` string, nullable, required — The workflow revision token returned by the latest workflow read or mutation. Older workflows may return `null` before their first revision-aware mutation; pass `null` back as `expectedRevisionId` in that case. If the token is stale, the API returns a `409 Conflict` error.
      - `insertMode` 'before', required
      - `nodeTypeName` 'AudienceFilter' | 'BranchNode' | 'ExperimentBranchNode' | 'TimerAction' | 'SendEmailAction' | 'VariantNode', required — Node types that can be created with the API. `*Trigger` nodes and `ExitAction` nodes cannot be created.
      - `toNodeId` string — The node to insert before. The target must have at least one incoming parent and cannot be a trigger node.
      - `beforeNodeId` string, required — Deprecated. Use `toNodeId` instead.
  - CreateWorkflowNodeAfterRequest — Insert a new node after `fromNodeId`. This is valid only when `fromNodeId` has exactly one outgoing node. It is invalid when `fromNodeId` has no outgoing nodes, multiple outgoing nodes, or is an exit node. When the source has multiple outgoing nodes, use `between` with the exact `toNodeId` instead.
    - `expectedRevisionId` string, nullable, required — The workflow revision token returned by the latest workflow read or mutation. Older workflows may return `null` before their first revision-aware mutation; pass `null` back as `expectedRevisionId` in that case. If the token is stale, the API returns a `409 Conflict` error.
    - `insertMode` 'after', required
    - `nodeTypeName` 'AudienceFilter' | 'BranchNode' | 'ExperimentBranchNode' | 'TimerAction' | 'SendEmailAction' | 'VariantNode', required — Node types that can be created with the API. `*Trigger` nodes and `ExitAction` nodes cannot be created.
    - `fromNodeId` string, required — The node to insert after. This node must currently have exactly one outgoing node.

## Response `200`

Workflow node created.

- CreateWorkflowNodeResponse
  - `node` union, required
    - object
      - `id` string, required
      - `typeName` 'SignupTrigger', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'EventTrigger', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `eventName` string — The name of the event pattern that triggers this node.
      - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
        - `name` string, required
        - `type` 'string' | 'number' | 'boolean' | 'date', required
      - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'ContactPropertyTrigger', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
        - `key` string, required — The camel-cased `key` of the contact property to query. The property must exist for the team and must be available for Contact Updated triggers.
        - `is` WorkflowContactPropertyComparison, required — For Contact Updated triggers, the API validates `operator` against the selected contact property's type and the side of the comparison. The `was` comparison can use any operator supported by the selected property type. The `is` comparison uses the same operators, except number and boolean properties cannot use `empty`. String properties support `any`, `equal`, `not_equal`, `contains`, `not_contains`, `empty`, and `not_empty`. Number properties support `any`, `greater_than`, `less_than`, `numeric_equal`, `numeric_not_equal`, `empty`, and `not_empty`. Boolean properties support `any`, `true`, `false`, `empty`, and `not_empty`. Date properties support `any`, `empty`, `not_empty`, `after`, `before`, and `between`.
          - `value` union, required
            - string
            - number
            - boolean
          - `operator` 'any' | 'contains' | 'not_contains' | 'empty' | 'not_empty' | 'equal' | 'not_equal' | 'greater_than' | 'less_than' | 'true' | 'false' | 'numeric_equal' | 'numeric_not_equal' | 'after' | 'before' | 'between', required — The comparison operator. It must be valid for the selected contact property's type and for the `is` or `was` side of the comparison. Number and boolean properties allow `empty` on `was`, but not on `is`.
        - `was` WorkflowContactPropertyComparison, required — For Contact Updated triggers, the API validates `operator` against the selected contact property's type and the side of the comparison. The `was` comparison can use any operator supported by the selected property type. The `is` comparison uses the same operators, except number and boolean properties cannot use `empty`. String properties support `any`, `equal`, `not_equal`, `contains`, `not_contains`, `empty`, and `not_empty`. Number properties support `any`, `greater_than`, `less_than`, `numeric_equal`, `numeric_not_equal`, `empty`, and `not_empty`. Boolean properties support `any`, `true`, `false`, `empty`, and `not_empty`. Date properties support `any`, `empty`, `not_empty`, `after`, `before`, and `between`.
          - `value` union, required
            - string
            - number
            - boolean
          - `operator` 'any' | 'contains' | 'not_contains' | 'empty' | 'not_empty' | 'equal' | 'not_equal' | 'greater_than' | 'less_than' | 'true' | 'false' | 'numeric_equal' | 'numeric_not_equal' | 'after' | 'before' | 'between', required — The comparison operator. It must be valid for the selected contact property's type and for the `is` or `was` side of the comparison. Number and boolean properties allow `empty` on `was`, but not on `is`.
      - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'AddToListTrigger', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
      - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'BlankTrigger', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'AudienceFilter', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
        - `match` 'all' | 'any', required
        - `conditions` AudienceFilterCondition[], required
          - union
            - PropertyCondition — Matches contacts by a property value.
              - …
            - OptInCondition — Matches contacts by mailing-list opt-in status.
              - …
            - ActivityCondition — Matches contacts by their activity on a campaign or workflow.
              - …
      - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
      - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'TimerAction', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
      - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'SendEmailAction', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
      - `subject` string, required
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'ExitAction', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'BranchNode', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'ExperimentBranchNode', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
    - object
      - `id` string, required
      - `typeName` 'VariantNode', required
      - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
      - `isControl` boolean — Whether this is the control variant of an experiment.
      - `workflowRevisionId` string, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation.
      - `createdChildNodes` WorkflowMutationNode[] — Default child nodes created along with the requested node. BranchNode creation returns two AudienceFilter children. ExperimentBranchNode creation returns two regular VariantNode children and one control VariantNode.
        - union — Detailed workflow node returned from create and update mutations. The exact fields depend on `typeName`.
          - SignupTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SignupTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - EventTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'EventTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `eventName` string — The name of the event pattern that triggers this node.
            - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - ContactPropertyTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ContactPropertyTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
              - …
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - AddToListTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AddToListTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `mailingListId` string, nullable, required — The ID of the mailing list this trigger sends to, if set.
            - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
          - BlankTriggerWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BlankTrigger', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - AudienceFilterWorkflowMutationNode
            - `id` string, required
            - `typeName` 'AudienceFilter', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
              - …
            - `audienceSegmentId` string — The ID of the audience segment this trigger targets.
            - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
          - TimerActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'TimerAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
            - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
          - SendEmailActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'SendEmailAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
            - `subject` string, required
          - ExitActionWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExitAction', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - BranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'BranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
          - ExperimentBranchWorkflowMutationNode
            - `id` string, required
            - `typeName` 'ExperimentBranchNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
          - VariantWorkflowMutationNode
            - `id` string, required
            - `typeName` 'VariantNode', required
            - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
            - `isControl` boolean — Whether this is the control variant of an experiment.
  - `workflow` SimplifiedWorkflow, required
    - `id` string, required — The ID of the workflow.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
    - `status` 'Draft' | 'Sending' | 'Paused' | 'PausedAndQueueing', required
    - `name` string — The name of the workflow.
    - `description` string — The description of the workflow.
    - `mailingListId` string, nullable, required — The ID of the mailing list the workflow sends to.
    - `rootNodeId` string, required — The ID of the root node in the workflow graph.
    - `nodes` object, required — A map of node IDs to simplified node objects. Each node includes `typeName` and `nextNodeIds`, plus type-specific fields when present. To get the full node object, use the `GET /v1/workflows/{workflowId}/nodes/{nodeId}` endpoint.

## Other responses

- `400` — Invalid request. Details will be shown in `message`.
- `401` — Invalid API key.
- `404` — Workflow or workflow node not found.
- `405` — Wrong HTTP request method.
- `409` — `expectedRevisionId` is stale.

---

[API](https://skmtc.net/loops/apis/loops-openapi-spec.md) · [All operations](https://skmtc.net/loops/apis/loops-openapi-spec/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/loops/loops-openapi-spec/revisions/9cc087257f0d/schema)
